Search code examples
gowireguard

How to configure wg0 interface on Windows 10?


I am not able to manage the wireguard interface using wgctl on Windows (10). I have used it on linux and all is fine. I'm using Windows 10 latest updates, wireguard.exe latest, go 1.17.3 latest.

I am using a tunnel created with wireguard.exe /installtunnelservice /path/wg0.conf. If I manage the tunnel with the wireguard GUI, it all works fine. But I need to do it programatically.

C:\>wg
interface: wg0
  public key: K0BZ3Bk...5tCWo=
  private key: (hidden)
  listening port: 57538

peer: 7W6tOXI...F7zAo=
  endpoint: 159....105:51820
  allowed ips: 100.127.128.0/18
  latest handshake: 43 seconds ago
  transfer: 31.61 KiB received, 115.69 KiB sent
  persistent keepalive: every 25 seconds

...

The following code exits with "file does not exist". Having stepped the code into the library, I think that wireguard.exe is using NT Kernel mode and the library does not support it? Can someone please confirm? What is the best way around this?

package main
import (
    "log"

    "golang.zx2c4.com/wireguard/wgctrl"
    "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
)
func main() {
    wgc, err := wgctrl.New()
    if err != nil {
        log.Printf("wgctrl.New: %s", err)
    }
    defer wgc.Close()

    cfg := wgtypes.Config{}

    port := 51822
    cfg.ListenPort = &port

    err = wgc.ConfigureDevice("wg0", cfg)
    if err != nil {
        log.Printf("wgc.ConfigureDevice: %s", err)
    }
}

Solution

  • After escalating the issue on GitHub, it turned out to be a bug in the library which was promptly fixed not long after I posted this.