From fb233374a082ba54b43aa11d2266ef93e4db01d5 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Sat, 29 Aug 2020 16:53:53 +0300 Subject: [PATCH] resolver/dns: support ipv6 addrs Signed-off-by: Vasiliy Tolstov --- resolver/dns/dns.go | 47 ++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/resolver/dns/dns.go b/resolver/dns/dns.go index a9008f34..4c3ddd01 100644 --- a/resolver/dns/dns.go +++ b/resolver/dns/dns.go @@ -42,29 +42,36 @@ func (r *Resolver) Resolve(name string) ([]*resolver.Record, error) { return records, nil } - m := new(dns.Msg) - m.SetQuestion(dns.Fqdn(host), dns.TypeA) - rec, err := dns.ExchangeContext(context.Background(), m, r.Address) - if err != nil { - return nil, err - } - - for _, answer := range rec.Answer { - h := answer.Header() - // check record type matches - if h.Rrtype != dns.TypeA { - continue + for _, q := range []uint16{dns.TypeA, dns.TypeAAAA} { + m := new(dns.Msg) + m.SetQuestion(dns.Fqdn(host), q) + rec, err := dns.ExchangeContext(context.Background(), m, r.Address) + if err != nil { + return nil, err } - arec, _ := answer.(*dns.A) - addr := arec.A.String() + var addr string + for _, answer := range rec.Answer { + h := answer.Header() + // check record type matches + switch h.Rrtype { + case dns.TypeA: + arec, _ := answer.(*dns.A) + addr = arec.A.String() + case dns.TypeAAAA: + arec, _ := answer.(*dns.AAAA) + addr = arec.AAAA.String() + default: + continue + } - // join resolved record with port - address := net.JoinHostPort(addr, port) - // append to record set - records = append(records, &resolver.Record{ - Address: address, - }) + // join resolved record with port + address := net.JoinHostPort(addr, port) + // append to record set + records = append(records, &resolver.Record{ + Address: address, + }) + } } // no records returned so just best effort it