Skip to content

Commit 6fd3dcc

Browse files
committed
Fix AAAA queries returning A records
1 parent 018315a commit 6fd3dcc

2 files changed

Lines changed: 62 additions & 12 deletions

File tree

awldns/awldns.go

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -166,28 +166,56 @@ func (r *Resolver) dnsLocalDomainHandler(resp dns.ResponseWriter, req *dns.Msg)
166166

167167
switch qtype {
168168
case dns.TypeA, dns.TypeAAAA, dns.TypeANY:
169-
aRec := &dns.A{
169+
if !found {
170+
m.SetRcode(req, dns.RcodeNameError)
171+
continue
172+
}
173+
appendIPAnswers(m, hostname, mappedIP, qtype)
174+
}
175+
}
176+
177+
processOwnResponse(req, resp, m)
178+
179+
_ = resp.WriteMsg(m)
180+
}
181+
182+
func appendIPAnswers(m *dns.Msg, hostname string, mappedIP string, qtype uint16) {
183+
ip := net.ParseIP(mappedIP)
184+
if ip == nil {
185+
return
186+
}
187+
188+
if qtype == dns.TypeA || qtype == dns.TypeANY {
189+
if ipv4 := ip.To4(); ipv4 != nil {
190+
m.Answer = append(m.Answer, &dns.A{
170191
Hdr: dns.RR_Header{
171192
// we should return original name from the request as some clients expect that
172193
Name: hostname,
173194
Rrtype: dns.TypeA,
174195
Class: dns.ClassINET,
175196
Ttl: defaultTTLSeconds,
176197
},
177-
}
178-
if found {
179-
// TODO: support ipv6
180-
aRec.A = net.ParseIP(mappedIP).To4()
181-
} else {
182-
m.SetRcode(req, dns.RcodeNameError)
183-
}
184-
m.Answer = append(m.Answer, aRec)
198+
A: ipv4,
199+
})
185200
}
186201
}
187202

188-
processOwnResponse(req, resp, m)
189-
190-
_ = resp.WriteMsg(m)
203+
if qtype == dns.TypeAAAA || qtype == dns.TypeANY {
204+
if ip.To4() == nil {
205+
if ipv6 := ip.To16(); ipv6 != nil {
206+
m.Answer = append(m.Answer, &dns.AAAA{
207+
Hdr: dns.RR_Header{
208+
// we should return original name from the request as some clients expect that
209+
Name: hostname,
210+
Rrtype: dns.TypeAAAA,
211+
Class: dns.ClassINET,
212+
Ttl: defaultTTLSeconds,
213+
},
214+
AAAA: ipv6,
215+
})
216+
}
217+
}
218+
}
191219
}
192220

193221
func (r *Resolver) ptrv4Handler(resp dns.ResponseWriter, req *dns.Msg) {

awldns/awldns_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,28 @@ func TestDNS(t *testing.T) {
6868
}
6969
}
7070

71+
func TestDNSAAAAQueryDoesNotReturnARecord(t *testing.T) {
72+
a := require.New(t)
73+
port := FindFreePort()
74+
addr := fmt.Sprintf("127.0.0.1:%d", port)
75+
76+
resolver := NewResolver(addr)
77+
defer resolver.Close()
78+
// TODO: remove sleep. We need it because NewResolver starts servers in goroutines
79+
time.Sleep(50 * time.Millisecond)
80+
81+
resolver.ReceiveConfiguration("", map[string]string{
82+
"admin": "127.0.0.66",
83+
})
84+
85+
req := new(dns.Msg)
86+
req.SetQuestion("admin.awl.", dns.TypeAAAA)
87+
resp, _, err := new(dns.Client).Exchange(req, addr)
88+
a.NoError(err)
89+
a.Equal(dns.RcodeSuccess, resp.Rcode)
90+
a.Empty(resp.Answer)
91+
}
92+
7193
func NewResolverClient(address string) *net.Resolver {
7294
dialer := &net.Dialer{Timeout: time.Second}
7395
return &net.Resolver{

0 commit comments

Comments
 (0)