|
|
|
@ -21,6 +21,7 @@ import (
|
|
|
|
|
"golang.org/x/sys/windows"
|
|
|
|
|
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
|
|
|
|
|
"tailscale.com/net/interfaces"
|
|
|
|
|
"tailscale.com/net/tsaddr"
|
|
|
|
|
"tailscale.com/wgengine/winnet"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
@ -305,7 +306,17 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) (retErr error) {
|
|
|
|
|
foundDefault4 := false
|
|
|
|
|
foundDefault6 := false
|
|
|
|
|
for _, route := range cfg.Routes {
|
|
|
|
|
if (route.IP.Is4() && firstGateway4 == nil) || (route.IP.Is6() && firstGateway6 == nil) {
|
|
|
|
|
if route.IP.Is6() && firstGateway6 == nil {
|
|
|
|
|
// Windows won't let us set IPv6 routes without having an
|
|
|
|
|
// IPv6 local address set. However, when we've configured
|
|
|
|
|
// a default route, we want to forcibly grab IPv6 traffic
|
|
|
|
|
// even if the v6 overlay network isn't configured. To do
|
|
|
|
|
// that, we add a dummy local IPv6 address to serve as a
|
|
|
|
|
// route source.
|
|
|
|
|
ipnet := &net.IPNet{tsaddr.Tailscale4To6Placeholder().IPAddr().IP, net.CIDRMask(128, 128)}
|
|
|
|
|
addresses = append(addresses, ipnet)
|
|
|
|
|
firstGateway6 = &ipnet.IP
|
|
|
|
|
} else if route.IP.Is4() && firstGateway4 == nil {
|
|
|
|
|
return errors.New("Due to a Windows limitation, one cannot have interface routes without an interface address")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|