From d6a767f549c152801f753bfba50242b846bec530 Mon Sep 17 00:00:00 2001 From: "jh.gao" Date: Wed, 27 Jun 2018 12:06:41 +0800 Subject: [PATCH] bugfix: do proxy if no AAAA records found, e.g. only CNAME records --- dns64.go | 19 +++++++++++++++---- setup.go | 3 +++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/dns64.go b/dns64.go index d5cee27..4454807 100644 --- a/dns64.go +++ b/dns64.go @@ -3,7 +3,6 @@ package dns64 import ( "errors" - "log" "net" "time" @@ -56,13 +55,15 @@ func (r *ResponseWriter) WriteMsg(res *dns.Msg) error { // do not modify if there are AAAA records or NameError. continue if NoData or any other error. ty, _ := response.Typify(res, time.Now().UTC()) if ty == response.NoError || ty == response.NameError { - return r.ResponseWriter.WriteMsg(res) + if hasAAAA(res) { + return r.ResponseWriter.WriteMsg(res) + } } // perform request to upstream. res2, err := r.Proxy.Lookup(state, state.Name(), dns.TypeA) if err != nil { - log.Printf("[WARNING] Unable to query upstream DNS: %v", err) + log.Warningf("[WARNING] Unable to query upstream DNS: %v", err) res.MsgHdr.Rcode = dns.RcodeServerFailure return r.ResponseWriter.WriteMsg(res) } @@ -103,7 +104,7 @@ func (r *ResponseWriter) WriteMsg(res *dns.Msg) error { // Write implements the dns.ResponseWriter interface. func (r *ResponseWriter) Write(buf []byte) (int, error) { - log.Printf("[WARNING] DNS64 called with Write: not performing DNS64") + log.Warning("[WARNING] DNS64 called with Write: not performing DNS64") n, err := r.ResponseWriter.Write(buf) return n, err } @@ -141,3 +142,13 @@ func To6(prefix *net.IPNet, addr net.IP) (net.IP, error) { return v6, nil } + +// hasAAAA checks if AAAA records exists in dns.Msg +func hasAAAA(res *dns.Msg) bool { + for _, a := range res.Answer { + if a.Header().Rrtype == dns.TypeAAAA { + return true + } + } + return false +} diff --git a/setup.go b/setup.go index 7618f24..097e11e 100644 --- a/setup.go +++ b/setup.go @@ -6,11 +6,14 @@ import ( "github.com/coredns/coredns/core/dnsserver" "github.com/coredns/coredns/plugin" "github.com/coredns/coredns/plugin/pkg/dnsutil" + clog "github.com/coredns/coredns/plugin/pkg/log" "github.com/coredns/coredns/plugin/proxy" "github.com/mholt/caddy" ) +var log = clog.NewWithPlugin("hosts") + func init() { caddy.RegisterPlugin("dns64", caddy.Plugin{ ServerType: "dns",