From d3807a14aa55500a6b3739ea76e7303f0bde5237 Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Wed, 5 Mar 2025 22:36:24 +0530 Subject: [PATCH 1/9] feat(go): prevent nxdomain errors; --- dns/resolver.go | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/dns/resolver.go b/dns/resolver.go index 4c0090ce..b4099e02 100644 --- a/dns/resolver.go +++ b/dns/resolver.go @@ -1,6 +1,7 @@ package dns import ( + "errors" "net" "strings" "sync" @@ -16,6 +17,11 @@ const ( var dnsMapMutex = sync.Mutex{} // used to mutex functions of the DNS +var ( + ErrNXDomain = errors.New("non existent domain") + ErrNoQTypeRecord = errors.New("domain exists but no record matching the question type") +) + type DNSResolver struct { DnsEntriesCacheStore map[string]dns.RR DnsEntriesCacheMap map[string][]dnsRecord @@ -54,10 +60,8 @@ func handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) { reply.RecursionDesired = true reply.Rcode = dns.RcodeSuccess - resp := GetDNSResolverInstance().Lookup(r) - if resp != nil { - reply.Answer = append(reply.Answer, resp) - } else { + resp, err := GetDNSResolverInstance().Lookup(r) + if err != nil && errors.Is(err, ErrNXDomain) { nslist := config.Netclient().NameServers if config.Netclient().CurrGwNmIP != nil { nslist = []string{} @@ -97,7 +101,11 @@ func handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) { } } - err := w.WriteMsg(reply) + if resp != nil { + reply.Answer = append(reply.Answer, resp) + } + + err = w.WriteMsg(reply) if err != nil { slog.Error("write DNS response message error: ", "error", err.Error()) } @@ -136,14 +144,28 @@ func (d *DNSResolver) RegisterAAAA(record dnsRecord) error { } // Lookup DNS entry in local directory -func (d *DNSResolver) Lookup(m *dns.Msg) dns.RR { +func (d *DNSResolver) Lookup(m *dns.Msg) (dns.RR, error) { dnsMapMutex.Lock() defer dnsMapMutex.Unlock() q := m.Question[0] r, ok := d.DnsEntriesCacheStore[buildDNSEntryKey(strings.TrimSuffix(q.Name, "."), q.Qtype)] if !ok { - return nil + if q.Qtype == dns.TypeA { + r, ok = d.DnsEntriesCacheStore[buildDNSEntryKey(strings.TrimSuffix(q.Name, "."), dns.TypeAAAA)] + if ok { + // aware but no ipv6 address + return nil, ErrNoQTypeRecord + } + } else if q.Qtype == dns.TypeAAAA { + r, ok = d.DnsEntriesCacheStore[buildDNSEntryKey(strings.TrimSuffix(q.Name, "."), dns.TypeA)] + if ok { + // aware but no ipv4 address + return nil, ErrNoQTypeRecord + } + } + + return nil, ErrNXDomain } - return r + return r, nil } From 46591afad9ad5deca4926f16c0d5ca181cc7c73b Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Wed, 5 Mar 2025 22:36:49 +0530 Subject: [PATCH 2/9] feat(go): add managed dns support on windows; --- config/config.go | 7 ++++ dns/config.go | 44 ++++++++++++++++++++++--- dns/config_linux.go | 34 ++++---------------- dns/config_windows.go | 59 +++++++++++++++++++++++++++++++--- dns/listener.go | 8 ++--- functions/daemon.go | 2 +- wireguard/wireguard_windows.go | 4 +-- 7 files changed, 114 insertions(+), 44 deletions(-) diff --git a/config/config.go b/config/config.go index b62a13d9..4bf8a1e2 100644 --- a/config/config.go +++ b/config/config.go @@ -49,6 +49,13 @@ const ( Initd ) +const ( + // DefaultHostID {0EF230F0-2EAD-4370-B0F9-AFC2D2A039E6} is a fixed string, + // for creating the unique GUID. It's a meaningless unique GUID here to + // make sure only one network profile is created. + DefaultHostID = "0EF230F0-2EAD-4370-B0F9-AFC2D2A039E6" +) + // Initype - the type of init system in use type InitType int diff --git a/dns/config.go b/dns/config.go index 70897e11..a2b291de 100644 --- a/dns/config.go +++ b/dns/config.go @@ -2,7 +2,9 @@ package dns import ( "encoding/json" + "errors" "os" + "strings" "sync" "github.com/gravitl/netclient/config" @@ -10,10 +12,11 @@ import ( ) const ( - DNS_MANAGER_STUB = "stub" // '/run/systemd/resolve/stub-resolv.conf' - DNS_MANAGER_UPLINK = "uplink" // '/run/systemd/resolve/resolv.conf' - DNS_MANAGER_RESOLVECONF = "resolveconf" // 'generated by resolvconf(8)' - DNS_MANAGER_FILE = "file" // other than above + DNS_MANAGER_STUB = "stub" // '/run/systemd/resolve/stub-resolv.conf' + DNS_MANAGER_UPLINK = "uplink" // '/run/systemd/resolve/resolv.conf' + DNS_MANAGER_RESOLVECONF = "resolveconf" // 'generated by resolvconf(8)' + DNS_MANAGER_FILE = "file" // other than above + DNS_MANAGER_WINDOWS_REGISTRY = "registry" // for Windows machines ) var ( @@ -115,3 +118,36 @@ func cleanDNSJsonFile() error { return nil } + +// getDnsIp return the ip address of the dns server +func getDnsIp() (string, error) { + dnsIp := GetDNSServerInstance().AddrStr + if dnsIp == "" { + return "", errors.New("no listener is running") + } + + if len(config.GetNodes()) == 0 { + return "", errors.New("no network joint") + } + + dnsIp = getIpFromServerString(dnsIp) + + return dnsIp, nil +} + +// getIpFromServerString returns ip address from the ip:port +// address pair. +func getIpFromServerString(addrStr string) string { + s := "" + s = addrStr[0:strings.LastIndex(addrStr, ":")] + + if strings.Contains(s, "[") { + s = strings.ReplaceAll(s, "[", "") + } + + if strings.Contains(s, "]") { + s = strings.ReplaceAll(s, "]", "") + } + + return s +} diff --git a/dns/config_linux.go b/dns/config_linux.go index 5d027c72..70571b33 100644 --- a/dns/config_linux.go +++ b/dns/config_linux.go @@ -92,13 +92,11 @@ func RestoreDNSConfig() (err error) { } func buildAddConfigContentUplink() ([]string, error) { - - dnsIp := GetDNSServerInstance().AddrStr - if dnsIp == "" { - return []string{}, errors.New("no listener is running") + dnsIp, err := getDnsIp() + if err != nil { + return err } - dnsIp = getIpFromServerString(dnsIp) ns := "DNS=" + dnsIp f, err := os.Open(resolvUplinkPath) @@ -171,16 +169,11 @@ func setupResolveUplink() (err error) { func setupResolvectl() (err error) { - dnsIp := GetDNSServerInstance().AddrStr - if dnsIp == "" { - return errors.New("no listener is running") - } - if len(config.GetNodes()) == 0 { - return errors.New("no network joint") + dnsIp, err := getDnsIp() + if err != nil { + return err } - dnsIp = getIpFromServerString(dnsIp) - _, err = ncutils.RunCmd(fmt.Sprintf("resolvectl dns netmaker %s", dnsIp), false) if err != nil { slog.Warn("add DNS IP for netmaker failed", "error", err.Error()) @@ -206,21 +199,6 @@ func setupResolvectl() (err error) { return nil } -func getIpFromServerString(addrStr string) string { - s := "" - s = addrStr[0:strings.LastIndex(addrStr, ":")] - - if strings.Contains(s, "[") { - s = strings.ReplaceAll(s, "[", "") - } - - if strings.Contains(s, "]") { - s = strings.ReplaceAll(s, "]", "") - } - - return s -} - func backupResolveconfFile(src, dst string) error { _, err := os.Stat(dst) diff --git a/dns/config_windows.go b/dns/config_windows.go index 4f683098..3b57ff22 100644 --- a/dns/config_windows.go +++ b/dns/config_windows.go @@ -1,16 +1,67 @@ package dns -func FlushLocalDnsCache() (err error) { - return nil +import ( + "fmt" + "github.com/gravitl/netclient/config" + "github.com/gravitl/netclient/ncutils" + "golang.org/x/exp/slog" + "golang.org/x/sys/windows/registry" + "sync" +) + +var dnsConfigMutex sync.Mutex + +func FlushLocalDnsCache() error { + _, err := ncutils.RunCmd("ipconfig /flushdns", false) + if err != nil { + slog.Warn("failed to flush local dns cache", "error", err.Error()) + } + + return err } -func SetupDNSConfig() (err error) { +func SetupDNSConfig() error { + // ignore if dns manager is not Windows Registry + if config.Netclient().DNSManagerType != DNS_MANAGER_WINDOWS_REGISTRY { + return nil + } + + dnsIp, err := getDnsIp() + if err != nil { + return err + } + + guid := config.Netclient().Host.ID.String() + if guid == "" { + guid = config.DefaultHostID + } + + guid = "{" + guid + "}" + + keyPath := fmt.Sprintf(`SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\%s`, guid) + + // open registry key with permissions to set value + key, err := registry.OpenKey(registry.LOCAL_MACHINE, keyPath, registry.QUERY_VALUE|registry.SET_VALUE) + if err != nil { + return err + } + defer key.Close() + + err = key.SetStringValue("NameServer", dnsIp) + if err != nil { + return err + } + return nil } -func RestoreDNSConfig() (err error) { +func RestoreDNSConfig() error { return nil } func InitDNSConfig() { + dnsConfigMutex.Lock() + defer dnsConfigMutex.Unlock() + + config.Netclient().DNSManagerType = DNS_MANAGER_WINDOWS_REGISTRY } diff --git a/dns/listener.go b/dns/listener.go index 05354c5c..7c6fbce7 100644 --- a/dns/listener.go +++ b/dns/listener.go @@ -33,7 +33,7 @@ func GetDNSServerInstance() *DNSServer { // Start the DNS listener func (dnsServer *DNSServer) Start() { - if runtime.GOOS != "linux" { + if runtime.GOOS != "linux" && runtime.GOOS != "windows" { return } dnsMutex.Lock() @@ -95,7 +95,7 @@ func (dnsServer *DNSServer) Start() { } //Setup DNS config for Linux - if config.Netclient().Host.OS == "linux" { + if config.Netclient().Host.OS == "linux" || config.Netclient().Host.OS == "windows" { err := SetupDNSConfig() if err != nil { slog.Error("setup DNS conig failed", "error", err.Error()) @@ -107,7 +107,7 @@ func (dnsServer *DNSServer) Start() { // Stop the DNS listener func (dnsServer *DNSServer) Stop() { - if runtime.GOOS != "linux" { + if runtime.GOOS != "linux" && runtime.GOOS != "windows" { return } dnsMutex.Lock() @@ -117,7 +117,7 @@ func (dnsServer *DNSServer) Stop() { } //restore DNS config for Linux - if config.Netclient().Host.OS == "linux" { + if config.Netclient().Host.OS == "linux" || config.Netclient().Host.OS == "windows" { err := RestoreDNSConfig() if err != nil { slog.Warn("Restore DNS conig failed", "error", err.Error()) diff --git a/functions/daemon.go b/functions/daemon.go index 554ddc57..7af400ca 100644 --- a/functions/daemon.go +++ b/functions/daemon.go @@ -173,7 +173,7 @@ func startGoRoutines(wg *sync.WaitGroup) context.CancelFunc { stun.SetDefaultStunServers() } netclientCfg := config.Netclient() - if netclientCfg.Host.OS == "linux" { + if netclientCfg.Host.OS == "linux" || netclientCfg.Host.OS == "windows" { dns.InitDNSConfig() updateConfig = true } diff --git a/wireguard/wireguard_windows.go b/wireguard/wireguard_windows.go index 43c4106c..16ec6c7b 100644 --- a/wireguard/wireguard_windows.go +++ b/wireguard/wireguard_windows.go @@ -29,11 +29,9 @@ func (nc *NCIface) Create() error { adapter, err := driver.OpenAdapter(ncutils.GetInterfaceName()) if err != nil { slog.Info("creating Windows tunnel") - //{0EF230F0-2EAD-4370-B0F9-AFC2D2A039E6} is a fixed string, for creating the unique GUID. It's meaningless - //unique GUID here to make sure only one network profile created idString := config.Netclient().Host.ID.String() if idString == "" { - idString = "0EF230F0-2EAD-4370-B0F9-AFC2D2A039E6" + idString = config.DefaultHostID } windowsGUID, err := windows.GUIDFromString("{" + idString + "}") if err != nil { From 48c048006fdb11d4ec63b49d15fa89a7ae85cd65 Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Wed, 5 Mar 2025 22:42:39 +0530 Subject: [PATCH 3/9] fix(go): compile error; --- dns/config_linux.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dns/config_linux.go b/dns/config_linux.go index 70571b33..9a61da8f 100644 --- a/dns/config_linux.go +++ b/dns/config_linux.go @@ -94,7 +94,7 @@ func RestoreDNSConfig() (err error) { func buildAddConfigContentUplink() ([]string, error) { dnsIp, err := getDnsIp() if err != nil { - return err + return nil, err } ns := "DNS=" + dnsIp From e8c866a3d3e84e2aa99e45d4774150cefd4abbda Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Wed, 5 Mar 2025 22:54:07 +0530 Subject: [PATCH 4/9] fix(go): remove unused variables; --- dns/resolver.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dns/resolver.go b/dns/resolver.go index b4099e02..0ade6e1d 100644 --- a/dns/resolver.go +++ b/dns/resolver.go @@ -151,13 +151,13 @@ func (d *DNSResolver) Lookup(m *dns.Msg) (dns.RR, error) { r, ok := d.DnsEntriesCacheStore[buildDNSEntryKey(strings.TrimSuffix(q.Name, "."), q.Qtype)] if !ok { if q.Qtype == dns.TypeA { - r, ok = d.DnsEntriesCacheStore[buildDNSEntryKey(strings.TrimSuffix(q.Name, "."), dns.TypeAAAA)] + _, ok = d.DnsEntriesCacheStore[buildDNSEntryKey(strings.TrimSuffix(q.Name, "."), dns.TypeAAAA)] if ok { // aware but no ipv6 address return nil, ErrNoQTypeRecord } } else if q.Qtype == dns.TypeAAAA { - r, ok = d.DnsEntriesCacheStore[buildDNSEntryKey(strings.TrimSuffix(q.Name, "."), dns.TypeA)] + _, ok = d.DnsEntriesCacheStore[buildDNSEntryKey(strings.TrimSuffix(q.Name, "."), dns.TypeA)] if ok { // aware but no ipv4 address return nil, ErrNoQTypeRecord From 3cbed2fa0517a15b4ff06718d330eee1cd480f3b Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Mon, 10 Mar 2025 13:02:27 +0530 Subject: [PATCH 5/9] feat(go): return authoritative response; --- dns/resolver.go | 1 + 1 file changed, 1 insertion(+) diff --git a/dns/resolver.go b/dns/resolver.go index 0ade6e1d..6cdaf9f8 100644 --- a/dns/resolver.go +++ b/dns/resolver.go @@ -59,6 +59,7 @@ func handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) { reply.RecursionAvailable = true reply.RecursionDesired = true reply.Rcode = dns.RcodeSuccess + reply.Authoritative = true resp, err := GetDNSResolverInstance().Lookup(r) if err != nil && errors.Is(err, ErrNXDomain) { From 4d3175495ba62a85aa7e08304712840379711a0e Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Mon, 10 Mar 2025 13:10:03 +0530 Subject: [PATCH 6/9] feat(go): add split dns settings for windows; --- dns/config_windows.go | 66 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/dns/config_windows.go b/dns/config_windows.go index 3b57ff22..619ec3d1 100644 --- a/dns/config_windows.go +++ b/dns/config_windows.go @@ -6,6 +6,7 @@ import ( "github.com/gravitl/netclient/ncutils" "golang.org/x/exp/slog" "golang.org/x/sys/windows/registry" + "strings" "sync" ) @@ -52,10 +53,75 @@ func SetupDNSConfig() error { return err } + _, err = ncutils.RunCmd( + fmt.Sprintf( + "Set-DnsClientNrptRule -Namespace \"%s\" -NameServers \"%s\"", + config.GetServer(config.CurrServer).DefaultDomain, + dnsIp, + ), + false, + ) + if err != nil { + return err + } + return nil } func RestoreDNSConfig() error { + output, err := ncutils.RunCmd( + "Get-DnsClientNrptRule | Select-Object Name, @{Name='Namespace';Expression={$_.Namespace -join ';'}}, @{Name='NameServers';Expression={$_.NameServers -join ';'}} | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1", + false, + ) + if err != nil { + return err + } + + dnsIp, err := getDnsIp() + if err != nil { + return err + } + + lines := strings.Split(output, "\r\n") + + for _, line := range lines { + line = strings.TrimSpace(line) + + if len(line) == 0 { + continue + } + + parts := strings.Split(output, ",") + + if len(parts) != 3 { + continue + } + + name := strings.TrimSpace(parts[0]) + + namespace := strings.TrimSpace(parts[1]) + namespace = strings.Trim(namespace, "\"") + + nameserver := strings.TrimSpace(parts[2]) + nameserver = strings.Trim(nameserver, "\"") + + if namespace != config.GetServer(config.CurrServer).DefaultDomain && + nameserver != dnsIp { + continue + } + + _, err = ncutils.RunCmd( + fmt.Sprintf( + "Remove-DnsClientNrptRule -Name %s -Force", + name, + ), + false, + ) + if err != nil { + return err + } + } + return nil } From 78d80ded1b03a87b347ffc6676ac9690efaf10fd Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Mon, 10 Mar 2025 15:28:21 +0530 Subject: [PATCH 7/9] fix(go): remove nrpt config; --- dns/config_windows.go | 73 +------------------------------------------ dns/listener.go | 2 +- 2 files changed, 2 insertions(+), 73 deletions(-) diff --git a/dns/config_windows.go b/dns/config_windows.go index 619ec3d1..696b90c6 100644 --- a/dns/config_windows.go +++ b/dns/config_windows.go @@ -6,7 +6,6 @@ import ( "github.com/gravitl/netclient/ncutils" "golang.org/x/exp/slog" "golang.org/x/sys/windows/registry" - "strings" "sync" ) @@ -48,80 +47,10 @@ func SetupDNSConfig() error { } defer key.Close() - err = key.SetStringValue("NameServer", dnsIp) - if err != nil { - return err - } - - _, err = ncutils.RunCmd( - fmt.Sprintf( - "Set-DnsClientNrptRule -Namespace \"%s\" -NameServers \"%s\"", - config.GetServer(config.CurrServer).DefaultDomain, - dnsIp, - ), - false, - ) - if err != nil { - return err - } - - return nil + return key.SetStringValue("NameServer", dnsIp) } func RestoreDNSConfig() error { - output, err := ncutils.RunCmd( - "Get-DnsClientNrptRule | Select-Object Name, @{Name='Namespace';Expression={$_.Namespace -join ';'}}, @{Name='NameServers';Expression={$_.NameServers -join ';'}} | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1", - false, - ) - if err != nil { - return err - } - - dnsIp, err := getDnsIp() - if err != nil { - return err - } - - lines := strings.Split(output, "\r\n") - - for _, line := range lines { - line = strings.TrimSpace(line) - - if len(line) == 0 { - continue - } - - parts := strings.Split(output, ",") - - if len(parts) != 3 { - continue - } - - name := strings.TrimSpace(parts[0]) - - namespace := strings.TrimSpace(parts[1]) - namespace = strings.Trim(namespace, "\"") - - nameserver := strings.TrimSpace(parts[2]) - nameserver = strings.Trim(nameserver, "\"") - - if namespace != config.GetServer(config.CurrServer).DefaultDomain && - nameserver != dnsIp { - continue - } - - _, err = ncutils.RunCmd( - fmt.Sprintf( - "Remove-DnsClientNrptRule -Name %s -Force", - name, - ), - false, - ) - if err != nil { - return err - } - } - return nil } diff --git a/dns/listener.go b/dns/listener.go index 7c6fbce7..d5a880b7 100644 --- a/dns/listener.go +++ b/dns/listener.go @@ -98,7 +98,7 @@ func (dnsServer *DNSServer) Start() { if config.Netclient().Host.OS == "linux" || config.Netclient().Host.OS == "windows" { err := SetupDNSConfig() if err != nil { - slog.Error("setup DNS conig failed", "error", err.Error()) + slog.Error("setup DNS config failed", "error", err.Error()) } } From f39f989879f1c5beef585a5c98fad99643f0dca6 Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Tue, 11 Mar 2025 00:03:07 +0530 Subject: [PATCH 8/9] fix(go): setup dns on windows when resetting interface; --- dns/config_windows.go | 3 +++ functions/mqhandlers.go | 14 ++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/dns/config_windows.go b/dns/config_windows.go index 696b90c6..4a991767 100644 --- a/dns/config_windows.go +++ b/dns/config_windows.go @@ -21,6 +21,9 @@ func FlushLocalDnsCache() error { } func SetupDNSConfig() error { + dnsConfigMutex.Lock() + defer dnsConfigMutex.Unlock() + // ignore if dns manager is not Windows Registry if config.Netclient().DNSManagerType != DNS_MANAGER_WINDOWS_REGISTRY { return nil diff --git a/functions/mqhandlers.go b/functions/mqhandlers.go index c6a8bd2f..aaa130a6 100644 --- a/functions/mqhandlers.go +++ b/functions/mqhandlers.go @@ -269,8 +269,12 @@ func HostPeerUpdate(client mqtt.Client, msg mqtt.Message) { dns.GetDNSServerInstance().Stop() } } - if server.ManageDNS && config.Netclient().DNSManagerType == dns.DNS_MANAGER_STUB { - dns.SetupDNSConfig() + + if server.ManageDNS { + if (config.Netclient().Host.OS == "linux" && dns.GetDNSServerInstance().AddrStr != "" && config.Netclient().DNSManagerType == dns.DNS_MANAGER_STUB) || + config.Netclient().Host.OS == "windows" { + dns.SetupDNSConfig() + } } reloadStun := false @@ -492,8 +496,10 @@ func resetInterfaceFunc() { if dns.GetDNSServerInstance().AddrStr == "" { dns.GetDNSServerInstance().Start() } - //Setup resolveconf for Linux - if config.Netclient().Host.OS == "linux" && dns.GetDNSServerInstance().AddrStr != "" && config.Netclient().DNSManagerType == dns.DNS_MANAGER_STUB { + + //Setup DNS for Linux and Windows + if (config.Netclient().Host.OS == "linux" && dns.GetDNSServerInstance().AddrStr != "" && config.Netclient().DNSManagerType == dns.DNS_MANAGER_STUB) || + config.Netclient().Host.OS == "windows" { dns.SetupDNSConfig() } } From b2b37d12870bbbfa764dca27275b3c980ee867d3 Mon Sep 17 00:00:00 2001 From: Vishal Dalwadi Date: Tue, 11 Mar 2025 13:34:21 +0530 Subject: [PATCH 9/9] fix(go): managed dns for multiple networks; --- dns/config_windows.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dns/config_windows.go b/dns/config_windows.go index 4a991767..74668479 100644 --- a/dns/config_windows.go +++ b/dns/config_windows.go @@ -6,6 +6,7 @@ import ( "github.com/gravitl/netclient/ncutils" "golang.org/x/exp/slog" "golang.org/x/sys/windows/registry" + "net/netip" "sync" ) @@ -34,6 +35,11 @@ func SetupDNSConfig() error { return err } + ip, err := netip.ParseAddr(dnsIp) + if err != nil { + return err + } + guid := config.Netclient().Host.ID.String() if guid == "" { guid = config.DefaultHostID @@ -41,7 +47,12 @@ func SetupDNSConfig() error { guid = "{" + guid + "}" - keyPath := fmt.Sprintf(`SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\%s`, guid) + keyPath := "" + if ip.Is6() { + keyPath = fmt.Sprintf(`SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\Interfaces\%s`, guid) + } else { + keyPath = fmt.Sprintf(`SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\%s`, guid) + } // open registry key with permissions to set value key, err := registry.OpenKey(registry.LOCAL_MACHINE, keyPath, registry.QUERY_VALUE|registry.SET_VALUE)