diff options
-rw-r--r-- | middleware/hosts/hosts.go | 26 | ||||
-rw-r--r-- | middleware/hosts/hosts_test.go | 8 |
2 files changed, 33 insertions, 1 deletions
diff --git a/middleware/hosts/hosts.go b/middleware/hosts/hosts.go index 0b15fcaf7..68bd41b34 100644 --- a/middleware/hosts/hosts.go +++ b/middleware/hosts/hosts.go @@ -59,7 +59,9 @@ func (h Hosts) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) ( if h.Fallthrough { return middleware.NextOrFailure(h.Name(), h.Next, ctx, w, r) } - return dns.RcodeRefused, nil + if !h.otherRecordsExist(state.QType(), qname) { + return dns.RcodeNameError, nil + } } m := new(dns.Msg) @@ -73,6 +75,28 @@ func (h Hosts) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) ( return dns.RcodeSuccess, nil } +func (h Hosts) otherRecordsExist(qtype uint16, qname string) bool { + switch qtype { + case dns.TypeA: + if len(h.LookupStaticHostV6(qname)) > 0 { + return true + } + case dns.TypeAAAA: + if len(h.LookupStaticHostV4(qname)) > 0 { + return true + } + default: + if len(h.LookupStaticHostV4(qname)) > 0 { + return true + } + if len(h.LookupStaticHostV6(qname)) > 0 { + return true + } + } + return false + +} + // Name implements the middleware.Handle interface. func (h Hosts) Name() string { return "hosts" } diff --git a/middleware/hosts/hosts_test.go b/middleware/hosts/hosts_test.go index 183389e3d..37716623a 100644 --- a/middleware/hosts/hosts_test.go +++ b/middleware/hosts/hosts_test.go @@ -78,6 +78,14 @@ var hostsTestCases = []test.Case{ test.PTR("1.0.0.127.in-addr.arpa. 3600 PTR localhost.domain."), }, }, + { + Qname: "example.org.", Qtype: dns.TypeAAAA, + Answer: []dns.RR{}, + }, + { + Qname: "example.org.", Qtype: dns.TypeMX, + Answer: []dns.RR{}, + }, } const hostsExample = ` |