Skip to content

Commit 023ff44

Browse files
committed
Remote PTR requests RIVM-105
1 parent 0757538 commit 023ff44

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

src/dnsapi/dns_server.go

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ package dnsapi
33
import (
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

132125
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) (
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+
147151
func 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

Comments
 (0)