@@ -3,8 +3,7 @@ package dnsapi
3
3
import (
4
4
"context"
5
5
"crypto/ed25519"
6
- "errors"
7
- "fmt"
6
+ "encoding/hex"
8
7
"net"
9
8
"strings"
10
9
@@ -75,15 +74,15 @@ func (s *DnsServer) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
75
74
} else {
76
75
//send PTR request to another server here
77
76
resolver := & net.Resolver {}
78
- dnsServer , err := ptrToIPv6String (q .Name )
77
+ dnsServer , err := ptrToIPv6 (q .Name )
79
78
if err != nil {
80
79
msg .SetRcode (r , dns .RcodeFormatError )
81
80
} else {
82
81
resp , err := lookupDNSRecord (resolver , dnsServer , q )
83
82
if err != nil {
84
83
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 ... )
87
86
}
88
87
}
89
88
}
@@ -107,26 +106,20 @@ func (s *DnsServer) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
107
106
}
108
107
}
109
108
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 ]
114
115
}
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
127
120
}
128
-
129
- return ipv6Str , nil
121
+ ipv6Addr := net . IP ( ipBytes ). String ()
122
+ return ipv6Addr , nil
130
123
}
131
124
132
125
func 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) (
137
130
msg .SetQuestion (q .Name , dns .TypePTR )
138
131
139
132
// 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 ())
141
136
if err != nil {
142
137
return nil , err
143
138
}
144
139
return resp , nil
145
140
}
146
141
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
+
147
151
func createPTRRecord (ptrName , target string ) dns.RR {
148
152
rr := new (dns.PTR )
149
153
rr .Hdr = dns.RR_Header {Name : ptrName , Rrtype : dns .TypePTR , Class : dns .ClassINET , Ttl : 3600 }
0 commit comments