Skip to content

Commit 6279297

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

2 files changed

Lines changed: 91 additions & 14 deletions

File tree

awldns/awldns.go

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -165,23 +165,29 @@ func (r *Resolver) dnsLocalDomainHandler(resp dns.ResponseWriter, req *dns.Msg)
165165
mappedIP, found := cfg.directMapping[hostnameLower]
166166

167167
switch qtype {
168-
case dns.TypeA, dns.TypeAAAA, dns.TypeANY:
169-
aRec := &dns.A{
170-
Hdr: dns.RR_Header{
171-
// we should return original name from the request as some clients expect that
172-
Name: hostname,
173-
Rrtype: dns.TypeA,
174-
Class: dns.ClassINET,
175-
Ttl: defaultTTLSeconds,
176-
},
168+
case dns.TypeA, dns.TypeANY:
169+
if !found {
170+
m.SetRcode(req, dns.RcodeNameError)
171+
continue
172+
}
173+
if ip := net.ParseIP(mappedIP).To4(); ip != nil {
174+
m.Answer = append(m.Answer, &dns.A{
175+
Hdr: dns.RR_Header{
176+
// we should return original name from the request as some clients expect that
177+
Name: hostname,
178+
Rrtype: dns.TypeA,
179+
Class: dns.ClassINET,
180+
Ttl: defaultTTLSeconds,
181+
},
182+
A: ip,
183+
})
177184
}
178-
if found {
179-
// TODO: support ipv6
180-
aRec.A = net.ParseIP(mappedIP).To4()
181-
} else {
185+
case dns.TypeAAAA:
186+
if !found {
182187
m.SetRcode(req, dns.RcodeNameError)
188+
continue
183189
}
184-
m.Answer = append(m.Answer, aRec)
190+
// TODO: support IPv6 addresses in cfg.directMapping.
185191
}
186192
}
187193

awldns/awldns_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,77 @@ 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+
93+
func TestDNSAQueryReturnsARecord(t *testing.T) {
94+
a := require.New(t)
95+
port := FindFreePort()
96+
addr := fmt.Sprintf("127.0.0.1:%d", port)
97+
98+
resolver := NewResolver(addr)
99+
defer resolver.Close()
100+
// TODO: remove sleep. We need it because NewResolver starts servers in goroutines
101+
time.Sleep(50 * time.Millisecond)
102+
103+
resolver.ReceiveConfiguration("", map[string]string{
104+
"admin": "127.0.0.66",
105+
})
106+
107+
req := new(dns.Msg)
108+
req.SetQuestion("admin.awl.", dns.TypeA)
109+
resp, _, err := new(dns.Client).Exchange(req, addr)
110+
a.NoError(err)
111+
a.Equal(dns.RcodeSuccess, resp.Rcode)
112+
a.Len(resp.Answer, 1)
113+
114+
aRecord, ok := resp.Answer[0].(*dns.A)
115+
a.True(ok)
116+
a.Equal("admin.awl.", aRecord.Hdr.Name)
117+
a.Equal("127.0.0.66", aRecord.A.String())
118+
}
119+
120+
func TestDNSUnknownAddressReturnsNameError(t *testing.T) {
121+
a := require.New(t)
122+
port := FindFreePort()
123+
addr := fmt.Sprintf("127.0.0.1:%d", port)
124+
125+
resolver := NewResolver(addr)
126+
defer resolver.Close()
127+
// TODO: remove sleep. We need it because NewResolver starts servers in goroutines
128+
time.Sleep(50 * time.Millisecond)
129+
130+
resolver.ReceiveConfiguration("", map[string]string{
131+
"admin": "127.0.0.66",
132+
})
133+
134+
req := new(dns.Msg)
135+
req.SetQuestion("unknown.awl.", dns.TypeA)
136+
resp, _, err := new(dns.Client).Exchange(req, addr)
137+
a.NoError(err)
138+
a.Equal(dns.RcodeNameError, resp.Rcode)
139+
a.Empty(resp.Answer)
140+
}
141+
71142
func NewResolverClient(address string) *net.Resolver {
72143
dialer := &net.Dialer{Timeout: time.Second}
73144
return &net.Resolver{

0 commit comments

Comments
 (0)