ipn/ipnlocal: add MagicDNS records for IPv6-only nodes

Updates #2268

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
pull/2810/head
Brad Fitzpatrick 3 years ago committed by Brad Fitzpatrick
parent 90b0cd0c51
commit 7fe6ecf165

@ -68,15 +68,20 @@ func TestDNSConfigForNetmap(t *testing.T) {
Name: "b.net", Name: "b.net",
Addresses: ipps("100.102.0.1", "100.102.0.2", "fe75::2"), 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{}, prefs: &ipn.Prefs{},
want: &dns.Config{ want: &dns.Config{
Routes: map[dnsname.FQDN][]dnstype.Resolver{}, Routes: map[dnsname.FQDN][]dnstype.Resolver{},
Hosts: map[dnsname.FQDN][]netaddr.IP{ Hosts: map[dnsname.FQDN][]netaddr.IP{
"b.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"), "myname.net.": ips("100.101.101.101"),
"peera.net.": ips("100.102.0.1", "100.102.0.2"), "peera.net.": ips("100.102.0.1", "100.102.0.2"),
"v6-only.net.": ips("fe75::3"),
}, },
}, },
}, },

@ -1798,6 +1798,7 @@ func dnsConfigForNetmap(nm *netmap.NetworkMap, prefs *ipn.Prefs, logf logger.Log
if err != nil { if err != nil {
return // TODO: propagate error? return // TODO: propagate error?
} }
have4 := tsaddr.PrefixesContainsFunc(addrs, func(p netaddr.IPPrefix) bool { return p.IP().Is4() })
var ips []netaddr.IP var ips []netaddr.IP
for _, addr := range addrs { for _, addr := range addrs {
// Remove IPv6 addresses for now, as we don't // 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 // https://github.com/tailscale/tailscale/issues/1152
// tracks adding the right capability reporting to // tracks adding the right capability reporting to
// enable AAAA in MagicDNS. // enable AAAA in MagicDNS.
if addr.IP().Is6() { if addr.IP().Is6() && have4 {
continue continue
} }
ips = append(ips, addr.IP()) ips = append(ips, addr.IP())

@ -164,3 +164,24 @@ func NewContainsIPFunc(addrs []netaddr.IPPrefix) func(ip netaddr.IP) bool {
} }
return func(ip netaddr.IP) bool { return m[ip] } 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
}

Loading…
Cancel
Save