Skip to content

Commit 0757538

Browse files
committed
Recursive PTR query RIVM-105
1 parent 5257ec3 commit 0757538

File tree

1 file changed

+48
-19
lines changed

1 file changed

+48
-19
lines changed

src/dnsapi/dns_server.go

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

118147
func createPTRRecord(ptrName, target string) dns.RR {

0 commit comments

Comments
 (0)