@@ -3,8 +3,7 @@ package dnsapi
33import (
44 "context"
55 "crypto/ed25519"
6- "errors"
7- "fmt"
6+ "encoding/hex"
87 "net"
98 "strings"
109
@@ -75,15 +74,15 @@ func (s *DnsServer) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
7574 } else {
7675 //send PTR request to another server here
7776 resolver := & net.Resolver {}
78- dnsServer , err := ptrToIPv6String (q .Name )
77+ dnsServer , err := ptrToIPv6 (q .Name )
7978 if err != nil {
8079 msg .SetRcode (r , dns .RcodeFormatError )
8180 } else {
8281 resp , err := lookupDNSRecord (resolver , dnsServer , q )
8382 if err != nil {
8483 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 )
84+ } else {
85+ msg . Answer = append ( msg . Answer , resp . Answer ... )
8786 }
8887 }
8988 }
@@ -107,26 +106,20 @@ func (s *DnsServer) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
107106 }
108107}
109108
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" )
109+ func ptrToIPv6 (arpa string ) (string , error ) {
110+ mainPtr := arpa [:len (arpa )- 9 ]
111+ pieces := strings .Split (mainPtr , "." )
112+ reversePieces := make ([]string , len (pieces ))
113+ for i := len (pieces ) - 1 ; i >= 0 ; i -- {
114+ reversePieces [len (pieces )- 1 - i ] = pieces [i ]
114115 }
115-
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- }
116+ hexString := strings .Join (reversePieces , "" )
117+ ipBytes , err := hex .DecodeString (hexString )
118+ if err != nil {
119+ return "" , err
127120 }
128-
129- return ipv6Str , nil
121+ ipv6Addr := net . IP ( ipBytes ). String ()
122+ return ipv6Addr , nil
130123}
131124
132125func lookupDNSRecord (resolver * net.Resolver , dnsServer string , q dns.Question ) (r * dns.Msg , err error ) {
@@ -137,13 +130,24 @@ func lookupDNSRecord(resolver *net.Resolver, dnsServer string, q dns.Question) (
137130 msg .SetQuestion (q .Name , dns .TypePTR )
138131
139132 // Send the DNS query
140- resp , _ , err := client .ExchangeContext (context .Background (), msg , dnsServer + ":53" )
133+ ipv6Addr := net .ParseIP (dnsServer )
134+ serverAddr := & net.UDPAddr {IP : ipv6Addr , Port : 53 }
135+ resp , _ , err := client .ExchangeContext (context .Background (), msg , serverAddr .String ())
141136 if err != nil {
142137 return nil , err
143138 }
144139 return resp , nil
145140}
146141
142+ /*
143+ func createPTRRecordFromResponse(msg dns.Msg) dns.RR {
144+ rr := new(dns.PTR)
145+ rr.Hdr = dns.RR_Header{Name: msg., Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: 3600}
146+ rr.Ptr = target
147+ return rr
148+ }
149+ */
150+
147151func createPTRRecord (ptrName , target string ) dns.RR {
148152 rr := new (dns.PTR )
149153 rr .Hdr = dns.RR_Header {Name : ptrName , Rrtype : dns .TypePTR , Class : dns .ClassINET , Ttl : 3600 }
0 commit comments