aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-09-19 19:38:33 -0600
committerJason A. Donenfeld <Jason@zx2c4.com>2021-09-19 19:38:33 -0600
commit89cc9fc144b2c02cb9794fdf7e466bf2af23ced1 (patch)
treed8f9502efc0322f13d453f27af273af59c449776
parenttunnel: pretty print route failures better (diff)
downloadwireguard-windows-89cc9fc144b2c02cb9794fdf7e466bf2af23ced1.tar.xz
wireguard-windows-89cc9fc144b2c02cb9794fdf7e466bf2af23ced1.zip
tunnel: help people fix their DNS Cache service
Too many people follow silly Internet guides and disable this, making it impossible for us to then set activestore-style DNS servers for the interface. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--tunnel/addressconfig.go25
1 files changed, 25 insertions, 0 deletions
diff --git a/tunnel/addressconfig.go b/tunnel/addressconfig.go
index 350dd645..c887f7b7 100644
--- a/tunnel/addressconfig.go
+++ b/tunnel/addressconfig.go
@@ -13,6 +13,7 @@ import (
"sort"
"golang.org/x/sys/windows"
+ "golang.org/x/sys/windows/svc/mgr"
"golang.zx2c4.com/wireguard/windows/conf"
"golang.zx2c4.com/wireguard/windows/tunnel/firewall"
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
@@ -56,6 +57,25 @@ func cleanupAddressesOnDisconnectedInterfaces(family winipcfg.AddressFamily, add
}
}
+func isDnsCacheDisabled() (bool, string) {
+ scm, err := mgr.Connect()
+ if err != nil {
+ return false, ""
+ }
+ defer scm.Disconnect()
+ svc := mgr.Service{Name: "dnscache"}
+ svc.Handle, err = windows.OpenService(scm.Handle, windows.StringToUTF16Ptr(svc.Name), windows.SERVICE_QUERY_CONFIG)
+ if err != nil {
+ return false, ""
+ }
+ defer svc.Close()
+ cfg, err := svc.Config()
+ if err != nil {
+ return false, ""
+ }
+ return cfg.StartType == mgr.StartDisabled, cfg.DisplayName
+}
+
func configureInterface(family winipcfg.AddressFamily, conf *conf.Config, luid winipcfg.LUID, clamper mtuClamper) error {
estimatedRouteCount := 0
for _, peer := range conf.Peers {
@@ -167,6 +187,11 @@ func configureInterface(family winipcfg.AddressFamily, conf *conf.Config, luid w
err = luid.SetDNS(family, conf.Interface.DNS, conf.Interface.DNSSearch)
if err != nil {
+ if err == windows.RPC_S_INVALID_BINDING || err == windows.ERROR_SERVICE_NOT_ACTIVE {
+ if disabled, name := isDnsCacheDisabled(); disabled {
+ err = fmt.Errorf("the %q service (dnscache) is disabled; please re-enable it", name)
+ }
+ }
return fmt.Errorf("unable to set DNS %v %v: %w", conf.Interface.DNS, conf.Interface.DNSSearch, err)
}
return nil