Skip to content

Commit efd9884

Browse files
i40enekohasekai
authored andcommitted
Disable Windows DNS registration
1 parent 1a85bd3 commit efd9884

3 files changed

Lines changed: 40 additions & 4 deletions

File tree

internal/winipcfg/luid.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,3 +385,25 @@ func (luid LUID) SetDNS(family AddressFamily, servers []netip.Addr, domains []st
385385
func (luid LUID) FlushDNS(family AddressFamily) error {
386386
return luid.SetDNS(family, nil, nil)
387387
}
388+
389+
func (luid LUID) DisableDNSRegistration() error {
390+
guid, err := luid.GUID()
391+
if err != nil {
392+
return err
393+
}
394+
395+
dnsInterfaceSettings := &DnsInterfaceSettings{
396+
Version: DnsInterfaceSettingsVersion1,
397+
Flags: DnsInterfaceSettingsFlagRegistrationEnabled,
398+
RegistrationEnabled: 0,
399+
}
400+
401+
// For >= Windows 10 1809
402+
err = SetInterfaceDnsSettings(*guid, dnsInterfaceSettings)
403+
if err == nil || !errors.Is(err, windows.ERROR_PROC_NOT_FOUND) {
404+
return err
405+
}
406+
407+
// For < Windows 10 1809
408+
return luid.fallbackDisableDNSRegistration()
409+
}

internal/winipcfg/netsh.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ func runNetsh(cmds []string) error {
5151
}
5252

5353
const (
54-
netshCmdTemplateFlush4 = "interface ipv4 set dnsservers name=%d source=static address=none validate=no register=both"
55-
netshCmdTemplateFlush6 = "interface ipv6 set dnsservers name=%d source=static address=none validate=no register=both"
56-
netshCmdTemplateAdd4 = "interface ipv4 add dnsservers name=%d address=%s validate=no"
57-
netshCmdTemplateAdd6 = "interface ipv6 add dnsservers name=%d address=%s validate=no"
54+
netshCmdTemplateFlush4 = "interface ipv4 set dnsservers name=%d source=static address=none validate=no"
55+
netshCmdTemplateFlush6 = "interface ipv6 set dnsservers name=%d source=static address=none validate=no"
56+
netshCmdTemplateAdd4 = "interface ipv4 add dnsservers name=%d address=%s validate=no"
57+
netshCmdTemplateAdd6 = "interface ipv6 add dnsservers name=%d address=%s validate=no"
58+
netshCmdTemplateDisableRegistration = "interface ipv6 set dnsservers name=%d register=none"
5859
)
5960

6061
func (luid LUID) fallbackSetDNSForFamily(family AddressFamily, dnses []netip.Addr) error {
@@ -106,3 +107,13 @@ func (luid LUID) fallbackSetDNSDomain(domain string) error {
106107
key.Close()
107108
return err
108109
}
110+
111+
func (luid LUID) fallbackDisableDNSRegistration() error {
112+
// the DNS registration setting is shared for both IPv4 and IPv6
113+
ipif, err := luid.IPInterface(windows.AF_INET)
114+
if err != nil {
115+
return err
116+
}
117+
cmd := fmt.Sprintf(netshCmdTemplateDisableRegistration, ipif.InterfaceIndex)
118+
return runNetsh([]string{cmd})
119+
}

tun_windows.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ func (t *NativeTun) configure() error {
8888
return E.Cause(err, "set ipv6 dns")
8989
}
9090
}
91+
if len(t.options.Inet4Address) > 0 || len(t.options.Inet6Address) > 0 {
92+
_ = luid.DisableDNSRegistration()
93+
}
9194
if t.options.AutoRoute {
9295
if len(t.options.Inet4Address) > 0 {
9396
if len(t.options.Inet4RouteAddress) > 0 {

0 commit comments

Comments
 (0)