summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Crawshaw <crawshaw@tailscale.com>2021-06-12 08:44:02 -0700
committerDavid Crawshaw <crawshaw@tailscale.com>2021-06-12 08:49:12 -0700
commit30550fc539a6ff2cb7de56a0180f5ab396107933 (patch)
tree2f10163a112565358d5038ab2436375642beafcc
parent525eb5ce411041ecab616a885aa9664fae8cbf9a (diff)
downloadtailscale-crawshaw/magicdnsalways.tar.xz
tailscale-crawshaw/magicdnsalways.zip
net/dns/resolver: have quad100 respond to suffix-less magicdns requestscrawshaw/magicdnsalways
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.
-rw-r--r--net/dns/resolver/tsdns.go22
-rw-r--r--net/dns/resolver/tsdns_test.go10
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 @@ import (
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 {