@@ -3,6 +3,8 @@ package dnsapi
33import (
44 "context"
55 "crypto/ed25519"
6+ "errors"
7+ "fmt"
68 "net"
79 "strings"
810
@@ -66,11 +68,24 @@ func (s *DnsServer) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
6668 AAAA : net .ParseIP (net .IP (addr [:]).String ()),
6769 }
6870 msg .Answer = append (msg .Answer , aaaaRecord )
69- } else if q .Qtype == dns .TypePTR && q .Qclass == dns .ClassINET && strings .HasSuffix (q .Name , "ip6.arpa." ) {
70- localIp := net .ParseIP (s .Core .Address ().String ())
71- ptr := ipv6ToPTR (localIp )
71+ } else if q .Qtype == dns .TypePTR && q .Qclass == dns .ClassINET && strings .HasSuffix (q .Name , ".c.f.ip6.arpa." ) {
72+ ptr , _ := dns .ReverseAddr (s .Core .Address ().String ())
7273 if q .Name == ptr {
7374 msg .Answer = append (msg .Answer , createPTRRecord (q .Name , s .Domain + s .DnsServerCfg .Tld ))
75+ } else {
76+ //send PTR request to another server here
77+ resolver := & net.Resolver {}
78+ dnsServer , err := ptrToIPv6String (q .Name )
79+ if err != nil {
80+ msg .SetRcode (r , dns .RcodeFormatError )
81+ } else {
82+ resp , err := lookupDNSRecord (resolver , dnsServer , q )
83+ if err != nil {
84+ msg .SetRcode (r , dns .RcodeFormatError )
85+ } else if err := w .WriteMsg (resp ); err != nil {
86+ s .Log .Warnf ("Write message failed, message: %v, error: %v" , msg , err )
87+ }
88+ }
7489 }
7590 }
7691 }
@@ -92,27 +107,41 @@ func (s *DnsServer) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
92107 }
93108}
94109
95- func ipv6ToPTR (ip net.IP ) string {
96- ipStr := ip .String ()
97- ipStr = strings .ToLower (ipStr )
98- ipStr = strings .ReplaceAll (ipStr , ":" , "" )
99- return strings .Join (reverseStringSlice (chunkString (ipStr , 1 )), "." ) + ".ip6.arpa."
100- }
110+ func ptrToIPv6String (ptr string ) (string , error ) {
111+ parts := strings .Split (ptr , "." )
112+ if len (parts ) < 33 {
113+ return "" , errors .New ("incorrect length of PTR" )
114+ }
101115
102- func chunkString (s string , chunkSize int ) []string {
103- var chunks []string
104- for _ , char := range s {
105- chunks = append (chunks , string (char ))
116+ ipv6Str := ""
117+ for i := len (parts ) - 2 ; i >= 0 ; i -- {
118+ part := parts [i ]
119+ if len (part ) == 1 {
120+ ipv6Str += fmt .Sprintf ("0%s" , part )
121+ } else {
122+ ipv6Str += part
123+ }
124+ if i % 4 == 0 && i > 0 {
125+ ipv6Str += ":"
126+ }
106127 }
107- return chunks
128+
129+ return ipv6Str , nil
108130}
109131
110- func reverseStringSlice (slice []string ) []string {
111- for i := 0 ; i < len (slice )/ 2 ; i ++ {
112- j := len (slice ) - i - 1
113- slice [i ], slice [j ] = slice [j ], slice [i ]
132+ func lookupDNSRecord (resolver * net.Resolver , dnsServer string , q dns.Question ) (r * dns.Msg , err error ) {
133+ // Create a DNS client with custom DNS server
134+ client := & dns.Client {}
135+
136+ msg := new (dns.Msg )
137+ msg .SetQuestion (q .Name , dns .TypePTR )
138+
139+ // Send the DNS query
140+ resp , _ , err := client .ExchangeContext (context .Background (), msg , dnsServer + ":53" )
141+ if err != nil {
142+ return nil , err
114143 }
115- return slice
144+ return resp , nil
116145}
117146
118147func createPTRRecord (ptrName , target string ) dns.RR {
0 commit comments