From 30550fc539a6ff2cb7de56a0180f5ab396107933 Mon Sep 17 00:00:00 2001 From: David Crawshaw Date: Sat, 12 Jun 2021 08:44:02 -0700 Subject: [PATCH] net/dns/resolver: have quad100 respond to suffix-less magicdns requests This is an attempt to fix WSL2. Unfortunately, it doesn't work in our new fancy split-dns mode. If we went back to overriding all DNS on windows we could fix this. --- net/dns/resolver/tsdns.go | 22 ++++++++++++++++++++-- net/dns/resolver/tsdns_test.go | 10 +++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/net/dns/resolver/tsdns.go b/net/dns/resolver/tsdns.go index 105efa720..b7f9076a8 100644 --- a/net/dns/resolver/tsdns.go +++ b/net/dns/resolver/tsdns.go @@ -236,8 +236,26 @@ func (r *Resolver) resolveLocal(domain dnsname.FQDN, typ dns.Type) (netaddr.IP, return netaddr.IP{}, dns.RCodeNameError } } - // Not authoritative, signal that forwarding is advisable. - return netaddr.IP{}, dns.RCodeRefused + if strings.IndexByte(string(domain), '.') != len(domain)-1 { + // This is a real domain lookup. + // Not authoritative, signal that forwarding is advisable. + return netaddr.IP{}, dns.RCodeRefused + } + // Consider this as a MagicDNS query put directly to us. + var magicDNSDomain dnsname.FQDN + for _, suffix := range localDomains { + if dnsname.FQDN("tailscale.net.").Contains(suffix) || dnsname.FQDN("ts.net.").Contains(suffix) { + magicDNSDomain = suffix + break + } + } + if magicDNSDomain != "" { + addrs, found = hosts[domain+magicDNSDomain] + } + if !found { + // Not authoritative, signal that forwarding is advisable. + return netaddr.IP{}, dns.RCodeRefused + } } // Refactoring note: this must happen after we check suffixes, diff --git a/net/dns/resolver/tsdns_test.go b/net/dns/resolver/tsdns_test.go index 8efe02d1e..7da6287d2 100644 --- a/net/dns/resolver/tsdns_test.go +++ b/net/dns/resolver/tsdns_test.go @@ -20,13 +20,15 @@ var testipv4 = netaddr.MustParseIP("1.2.3.4") var testipv6 = netaddr.MustParseIP("0001:0203:0405:0607:0809:0a0b:0c0d:0e0f") +var test3ipv4 = netaddr.MustParseIP("1.2.4.5") var dnsCfg = Config{ Hosts: map[dnsname.FQDN][]netaddr.IP{ - "test1.ipn.dev.": []netaddr.IP{testipv4}, - "test2.ipn.dev.": []netaddr.IP{testipv6}, + "test1.ipn.dev.": []netaddr.IP{testipv4}, + "test2.ipn.dev.": []netaddr.IP{testipv6}, + "test3.mytailnet.ts.net.": []netaddr.IP{test3ipv4}, }, - LocalDomains: []dnsname.FQDN{"ipn.dev."}, + LocalDomains: []dnsname.FQDN{"mytailnet.ts.net.", "ipn.dev."}, } func dnspacket(domain dnsname.FQDN, tp dns.Type) []byte { @@ -234,6 +236,8 @@ func TestResolveLocal(t *testing.T) { {"mx-nxdomain", "test3.ipn.dev.", dns.TypeMX, netaddr.IP{}, dns.RCodeNameError}, {"ns-nxdomain", "test3.ipn.dev.", dns.TypeNS, netaddr.IP{}, dns.RCodeNameError}, {"onion-domain", "footest.onion.", dns.TypeA, netaddr.IP{}, dns.RCodeNameError}, + {"magic", "test3.", dns.TypeA, test3ipv4, dns.RCodeSuccess}, + {"nomagic", "test1.", dns.TypeA, netaddr.IP{}, dns.RCodeRefused}, } for _, tt := range tests {