From 68f76e9aa12692d59a0f23a48159f0c008210294 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Wed, 7 Apr 2021 00:31:31 -0700 Subject: [PATCH] net/dns: add GetBaseConfig to OSConfigurator interface. Part of #953, required to make split DNS work on more basic platforms. Signed-off-by: David Anderson --- net/dns/direct.go | 5 +++++ net/dns/manager_test.go | 5 +++++ net/dns/manager_windows.go | 17 +++++++++++++++++ net/dns/nm.go | 5 +++++ net/dns/noop.go | 7 ++++--- net/dns/osconfig.go | 7 +++++++ net/dns/resolvconf.go | 5 +++++ net/dns/resolved.go | 5 +++++ wgengine/router/callback.go | 5 +++++ 9 files changed, 58 insertions(+), 3 deletions(-) diff --git a/net/dns/direct.go b/net/dns/direct.go index c093dcd77..acab9c62d 100644 --- a/net/dns/direct.go +++ b/net/dns/direct.go @@ -163,6 +163,11 @@ func (m directManager) SupportsSplitDNS() bool { return false } +func (m directManager) GetBaseConfig() (OSConfig, error) { + // TODO + return OSConfig{}, nil +} + func (m directManager) Close() error { if _, err := os.Stat(backupConf); err != nil { // If the backup file does not exist, then Up never ran successfully. diff --git a/net/dns/manager_test.go b/net/dns/manager_test.go index f6f840774..eb22d3844 100644 --- a/net/dns/manager_test.go +++ b/net/dns/manager_test.go @@ -36,6 +36,11 @@ func (c *fakeOSConfigurator) SupportsSplitDNS() bool { return c.SplitDNS } +func (c *fakeOSConfigurator) GetBaseConfig() (OSConfig, error) { + // TODO + return OSConfig{}, nil +} + func (c *fakeOSConfigurator) Close() error { return nil } func TestManager(t *testing.T) { diff --git a/net/dns/manager_windows.go b/net/dns/manager_windows.go index 2e3b8d4b4..a7d208323 100644 --- a/net/dns/manager_windows.go +++ b/net/dns/manager_windows.go @@ -300,6 +300,23 @@ func (m windowsManager) Close() error { return m.SetDNS(OSConfig{}) } +func (m windowsManager) GetBaseConfig() (OSConfig, error) { + if m.nrptWorks { + return OSConfig{}, errors.New("GetBaseConfig not supported") + } + resolvers, err := m.getBasePrimaryResolver() + if err != nil { + return OSConfig{}, err + } + return OSConfig{ + Nameservers: resolvers, + // Don't return any search domains here, because even Windows + // 7 correctly handles blending search domains from multiple + // sources, and any search domains we add here will get tacked + // onto the Tailscale config unnecessarily. + }, nil +} + // getBasePrimaryResolver returns a guess of the non-Tailscale primary // resolver on the system. // It's used on Windows 7 to emulate split DNS by trying to figure out diff --git a/net/dns/nm.go b/net/dns/nm.go index e90d67cdf..039b58132 100644 --- a/net/dns/nm.go +++ b/net/dns/nm.go @@ -202,6 +202,11 @@ func (m nmManager) SetDNS(config OSConfig) error { func (m nmManager) SupportsSplitDNS() bool { return false } +func (m nmManager) GetBaseConfig() (OSConfig, error) { + // TODO + return OSConfig{}, nil +} + func (m nmManager) Close() error { return m.SetDNS(OSConfig{}) } diff --git a/net/dns/noop.go b/net/dns/noop.go index 7391375ee..b3c11f822 100644 --- a/net/dns/noop.go +++ b/net/dns/noop.go @@ -6,9 +6,10 @@ package dns type noopManager struct{} -func (m noopManager) SetDNS(OSConfig) error { return nil } -func (m noopManager) SupportsSplitDNS() bool { return false } -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 (m noopManager) GetBaseConfig() (OSConfig, error) { return OSConfig{}, nil } func NewNoopManager() noopManager { return noopManager{} diff --git a/net/dns/osconfig.go b/net/dns/osconfig.go index db17f035e..5f6c57de4 100644 --- a/net/dns/osconfig.go +++ b/net/dns/osconfig.go @@ -17,6 +17,13 @@ type OSConfigurator interface { // installing a resolver only for specific DNS suffixes. If false, // the configurator can only set a global resolver. SupportsSplitDNS() bool + // GetBaseConfig returns the OS's "base" configuration, i.e. the + // resolver settings the OS would use without Tailscale + // contributing any configuration. + // GetBaseConfig must return the tailscale-free base config even + // after SetDNS has been called to set a Tailscale configuration. + // Only works when SupportsSplitDNS=false. + GetBaseConfig() (OSConfig, error) // Close removes Tailscale-related DNS configuration from the OS. Close() error } diff --git a/net/dns/resolvconf.go b/net/dns/resolvconf.go index 68b5f761e..210832000 100644 --- a/net/dns/resolvconf.go +++ b/net/dns/resolvconf.go @@ -142,6 +142,11 @@ func (m resolvconfManager) SupportsSplitDNS() bool { return false } +func (m resolvconfManager) GetBaseConfig() (OSConfig, error) { + // TODO + return OSConfig{}, nil +} + func (m resolvconfManager) Close() error { var cmd *exec.Cmd switch m.impl { diff --git a/net/dns/resolved.go b/net/dns/resolved.go index 9e5b10c96..685ca5f28 100644 --- a/net/dns/resolved.go +++ b/net/dns/resolved.go @@ -157,6 +157,11 @@ func (m resolvedManager) SupportsSplitDNS() bool { return false } +func (m resolvedManager) GetBaseConfig() (OSConfig, error) { + // TODO + return OSConfig{}, nil +} + func (m resolvedManager) Close() error { ctx, cancel := context.WithTimeout(context.Background(), reconfigTimeout) defer cancel() diff --git a/wgengine/router/callback.go b/wgengine/router/callback.go index b37d2700f..d8f79b027 100644 --- a/wgengine/router/callback.go +++ b/wgengine/router/callback.go @@ -49,6 +49,11 @@ func (r *CallbackRouter) SupportsSplitDNS() bool { return r.SplitDNS } +func (r *CallbackRouter) GetBaseConfig() (dns.OSConfig, error) { + // TODO + return dns.OSConfig{}, nil +} + func (r *CallbackRouter) Close() error { return r.SetBoth(nil, nil) // TODO: check if makes sense }