From de6dc4c51019489b787a21e861f9c34729bd2957 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Mon, 5 Apr 2021 13:05:47 -0700 Subject: [PATCH] net/dns: add a Primary field to OSConfig. Currently ignored. Signed-off-by: David Anderson --- net/dns/config.go | 8 -------- net/dns/direct.go | 4 ++-- net/dns/manager_windows.go | 4 ++-- net/dns/nm.go | 2 +- net/dns/noop.go | 6 +++--- net/dns/osconfig.go | 39 +++++++++++++++++++------------------ net/dns/resolvconf.go | 4 ++-- net/dns/resolved.go | 4 ++-- wgengine/router/callback.go | 10 +++++----- 9 files changed, 37 insertions(+), 44 deletions(-) diff --git a/net/dns/config.go b/net/dns/config.go index 718a409e3..527e74803 100644 --- a/net/dns/config.go +++ b/net/dns/config.go @@ -35,11 +35,3 @@ type Config struct { // return NXDOMAIN. AuthoritativeSuffixes []string } - -// OSConfig is an OS DNS configuration. -type OSConfig struct { - // Nameservers are the IP addresses of the nameservers to use. - Nameservers []netaddr.IP - // Domains are the search domains to use. - Domains []string -} diff --git a/net/dns/direct.go b/net/dns/direct.go index 058975bcd..7fdc633d7 100644 --- a/net/dns/direct.go +++ b/net/dns/direct.go @@ -159,8 +159,8 @@ func (m directManager) SetDNS(config OSConfig) error { return nil } -func (m directManager) RoutingMode() RoutingMode { - return RoutingModeNone +func (m directManager) SupportsSplitDNS() bool { + return false } func (m directManager) Close() error { diff --git a/net/dns/manager_windows.go b/net/dns/manager_windows.go index c5fcd3716..d14fa42ef 100644 --- a/net/dns/manager_windows.go +++ b/net/dns/manager_windows.go @@ -113,8 +113,8 @@ func (m windowsManager) SetDNS(config OSConfig) error { return nil } -func (m windowsManager) RoutingMode() RoutingMode { - return RoutingModeNone +func (m windowsManager) SupportsSplitDNS() bool { + return false } func (m windowsManager) Close() error { diff --git a/net/dns/nm.go b/net/dns/nm.go index 4e008a25a..243e9dfb4 100644 --- a/net/dns/nm.go +++ b/net/dns/nm.go @@ -200,7 +200,7 @@ func (m nmManager) SetDNS(config OSConfig) error { return nil } -func (m nmManager) RoutingMode() RoutingMode { return RoutingModeNone } +func (m nmManager) SupportsSplitDNS() bool { return false } func (m nmManager) Close() error { return m.SetDNS(OSConfig{}) diff --git a/net/dns/noop.go b/net/dns/noop.go index 8a0fc213c..7391375ee 100644 --- a/net/dns/noop.go +++ b/net/dns/noop.go @@ -6,9 +6,9 @@ package dns type noopManager struct{} -func (m noopManager) SetDNS(OSConfig) error { return nil } -func (m noopManager) RoutingMode() RoutingMode { return RoutingModeNone } -func (m noopManager) Close() error { return nil } +func (m noopManager) SetDNS(OSConfig) error { return nil } +func (m noopManager) SupportsSplitDNS() bool { return false } +func (m noopManager) Close() error { return nil } func NewNoopManager() noopManager { return noopManager{} diff --git a/net/dns/osconfig.go b/net/dns/osconfig.go index 00eb8f44e..9299f78f2 100644 --- a/net/dns/osconfig.go +++ b/net/dns/osconfig.go @@ -4,22 +4,7 @@ package dns -// DNSRoutingMode describes the type of per-domain DNS routing that -// the OS is capable of. -type RoutingMode int - -const ( - // RoutingModeNone means the OS only supports setting a single - // primary set of DNS resolvers. - RoutingModeNone RoutingMode = iota - // RoutingModeSingle means the OS supports a set of - // primary resolvers, as well as one set of additional per-suffix - // resolvers per network interface. - RoutingModeSingle - // RoutingModeMulti means the OS supports a set of primary - // resolvers, as well as an arbitrary overlay of DNS routes. - RoutingModeMulti -) +import "inet.af/netaddr" // An OSConfigurator applies DNS settings to the operating system. type OSConfigurator interface { @@ -28,9 +13,25 @@ type OSConfigurator interface { // configuration is removed. // SetDNS must not be called after Close. SetDNS(cfg OSConfig) error - // DNSRoutingMode reports the DNS routing capabilities of this OS - // configurator. - RoutingMode() RoutingMode + // SupportsSplitDNS reports whether the configurator is capable of + // installing a resolver only for specific DNS suffixes. If false, + // the configurator can only set a global resolver. + SupportsSplitDNS() bool // Close removes Tailscale-related DNS configuration from the OS. Close() error } + +// OSConfig is an OS DNS configuration. +type OSConfig struct { + // Nameservers are the IP addresses of the nameservers to use. + Nameservers []netaddr.IP + // Domains are the search domains to use. + Domains []string + // Primary indicates whether to set Nameservers as the + // primary/"default" resolvers for the system. + // If false, Nameservers will be set as resolvers for Domains + // only. + // Primary=false is only allowed for OSConfigurators that report + // SupportsSplitDNS. + Primary bool +} diff --git a/net/dns/resolvconf.go b/net/dns/resolvconf.go index 23de5b95d..7e0e60802 100644 --- a/net/dns/resolvconf.go +++ b/net/dns/resolvconf.go @@ -138,8 +138,8 @@ func (m resolvconfManager) SetDNS(config OSConfig) error { return nil } -func (m resolvconfManager) RoutingMode() RoutingMode { - return RoutingModeNone +func (m resolvconfManager) SupportsSplitDNS() bool { + return false } func (m resolvconfManager) Close() error { diff --git a/net/dns/resolved.go b/net/dns/resolved.go index ddae9b2e5..fc3e2a614 100644 --- a/net/dns/resolved.go +++ b/net/dns/resolved.go @@ -153,8 +153,8 @@ func (m resolvedManager) SetDNS(config OSConfig) error { return nil } -func (m resolvedManager) RoutingMode() RoutingMode { - return RoutingModeNone +func (m resolvedManager) SupportsSplitDNS() bool { + return false } func (m resolvedManager) Close() error { diff --git a/wgengine/router/callback.go b/wgengine/router/callback.go index b36e399a3..b37d2700f 100644 --- a/wgengine/router/callback.go +++ b/wgengine/router/callback.go @@ -15,8 +15,8 @@ import ( // Mainly used as a shim for OSes that want to set both network and // DNS configuration simultaneously (iOS, android). type CallbackRouter struct { - SetBoth func(rcfg *Config, dcfg *dns.OSConfig) error - DNSMode dns.RoutingMode + SetBoth func(rcfg *Config, dcfg *dns.OSConfig) error + SplitDNS bool mu sync.Mutex // protects all the following rcfg *Config // last applied router config @@ -44,9 +44,9 @@ func (r *CallbackRouter) SetDNS(dcfg dns.OSConfig) error { return r.SetBoth(r.rcfg, r.dcfg) } -// RoutingMode implements dns.OSConfigurator. -func (r *CallbackRouter) RoutingMode() dns.RoutingMode { - return r.DNSMode +// SupportsSplitDNS implements dns.OSConfigurator. +func (r *CallbackRouter) SupportsSplitDNS() bool { + return r.SplitDNS } func (r *CallbackRouter) Close() error {