From 7fe6ecf165bdb1525151bcbc8b6f5f92e05e0670 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 7 Sep 2021 15:45:28 -0700 Subject: [PATCH] ipn/ipnlocal: add MagicDNS records for IPv6-only nodes Updates #2268 Signed-off-by: Brad Fitzpatrick --- ipn/ipnlocal/dnsconfig_test.go | 11 ++++++++--- ipn/ipnlocal/local.go | 3 ++- net/tsaddr/tsaddr.go | 21 +++++++++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/ipn/ipnlocal/dnsconfig_test.go b/ipn/ipnlocal/dnsconfig_test.go index 7245bf1c7..91166a082 100644 --- a/ipn/ipnlocal/dnsconfig_test.go +++ b/ipn/ipnlocal/dnsconfig_test.go @@ -68,15 +68,20 @@ func TestDNSConfigForNetmap(t *testing.T) { Name: "b.net", Addresses: ipps("100.102.0.1", "100.102.0.2", "fe75::2"), }, + { + Name: "v6-only.net", + Addresses: ipps("fe75::3"), // no IPv4, so we don't ignore IPv6 + }, }, }, prefs: &ipn.Prefs{}, want: &dns.Config{ Routes: map[dnsname.FQDN][]dnstype.Resolver{}, Hosts: map[dnsname.FQDN][]netaddr.IP{ - "b.net.": ips("100.102.0.1", "100.102.0.2"), - "myname.net.": ips("100.101.101.101"), - "peera.net.": ips("100.102.0.1", "100.102.0.2"), + "b.net.": ips("100.102.0.1", "100.102.0.2"), + "myname.net.": ips("100.101.101.101"), + "peera.net.": ips("100.102.0.1", "100.102.0.2"), + "v6-only.net.": ips("fe75::3"), }, }, }, diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go index 7171e3a7f..202aa4b17 100644 --- a/ipn/ipnlocal/local.go +++ b/ipn/ipnlocal/local.go @@ -1798,6 +1798,7 @@ func dnsConfigForNetmap(nm *netmap.NetworkMap, prefs *ipn.Prefs, logf logger.Log if err != nil { return // TODO: propagate error? } + have4 := tsaddr.PrefixesContainsFunc(addrs, func(p netaddr.IPPrefix) bool { return p.IP().Is4() }) var ips []netaddr.IP for _, addr := range addrs { // Remove IPv6 addresses for now, as we don't @@ -1807,7 +1808,7 @@ func dnsConfigForNetmap(nm *netmap.NetworkMap, prefs *ipn.Prefs, logf logger.Log // https://github.com/tailscale/tailscale/issues/1152 // tracks adding the right capability reporting to // enable AAAA in MagicDNS. - if addr.IP().Is6() { + if addr.IP().Is6() && have4 { continue } ips = append(ips, addr.IP()) diff --git a/net/tsaddr/tsaddr.go b/net/tsaddr/tsaddr.go index fc4ef26f9..46496dd54 100644 --- a/net/tsaddr/tsaddr.go +++ b/net/tsaddr/tsaddr.go @@ -164,3 +164,24 @@ func NewContainsIPFunc(addrs []netaddr.IPPrefix) func(ip netaddr.IP) bool { } return func(ip netaddr.IP) bool { return m[ip] } } + +// PrefixesContainsFunc reports whether f is true for any IPPrefix in +// ipp. +func PrefixesContainsFunc(ipp []netaddr.IPPrefix, f func(netaddr.IPPrefix) bool) bool { + for _, v := range ipp { + if f(v) { + return true + } + } + return false +} + +// IPsContainsFunc reports whether f is true for any IP in ips. +func IPsContainsFunc(ips []netaddr.IP, f func(netaddr.IP) bool) bool { + for _, v := range ips { + if f(v) { + return true + } + } + return false +}