VPN: update to Tailscale v1.12.1
diff --git a/core/vpn/engine/wireguard.go b/core/vpn/engine/wireguard.go
index 35e4747..cbe5ab9 100644
--- a/core/vpn/engine/wireguard.go
+++ b/core/vpn/engine/wireguard.go
@@ -5,15 +5,17 @@
"log"
"github.com/giolekva/pcloud/core/vpn/types"
+ "golang.zx2c4.com/wireguard/tun"
- "github.com/tailscale/wireguard-go/wgcfg"
"inet.af/netaddr"
- "tailscale.com/control/controlclient"
"tailscale.com/ipn/ipnstate"
+ "tailscale.com/net/dns"
"tailscale.com/tailcfg"
+ "tailscale.com/types/netmap"
"tailscale.com/types/wgkey"
"tailscale.com/wgengine"
"tailscale.com/wgengine/router"
+ "tailscale.com/wgengine/wgcfg"
)
// Wireguard specific implementation of the Engine interface.
@@ -25,7 +27,14 @@
// Creates Wireguard engine.
func NewWireguardEngine(tunName string, port uint16, privKey types.PrivateKey) (Engine, error) {
- e, err := wgengine.NewUserspaceEngine(log.Printf, tunName, port)
+ tun, err := tun.CreateTUN(tunName, 1500)
+ if err != nil {
+ return nil, err
+ }
+ e, err := wgengine.NewUserspaceEngine(log.Printf, wgengine.Config{
+ Tun: tun,
+ ListenPort: port,
+ })
if err != nil {
return nil, err
}
@@ -38,7 +47,7 @@
// Used for unit testing.
func NewFakeWireguardEngine(port uint16, privKey types.PrivateKey) (Engine, error) {
- e, err := wgengine.NewFakeUserspaceEngine(log.Printf, port, nil)
+ e, err := wgengine.NewFakeUserspaceEngine(log.Printf, port)
if err != nil {
return nil, err
}
@@ -55,22 +64,24 @@
// TODO(giolekva): we shoudld probably use hostname and share
// it with the controller
Name: "local-node",
- PrivateKey: wgcfg.PrivateKey(privKey),
- Addresses: []netaddr.IPPrefix{netaddr.IPPrefix{
- IP: netMap.Self.VPNIP,
- Bits: 32, // TODO(giolekva): adapt for IPv6
- }},
- ListenPort: port,
- Peers: make([]wgcfg.Peer, 0, len(netMap.Peers)),
+ PrivateKey: wgkey.Private(privKey),
+ Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+ netMap.Self.VPNIP,
+ 32, // TODO(giolekva): adapt for IPv6
+ )},
+ // ListenPort: port,
+ Peers: make([]wgcfg.Peer, 0, len(netMap.Peers)),
}
for _, peer := range netMap.Peers {
c.Peers = append(c.Peers, wgcfg.Peer{
- PublicKey: wgcfg.Key(peer.PublicKey),
- AllowedIPs: []netaddr.IPPrefix{netaddr.IPPrefix{
- IP: peer.VPNIP,
- Bits: 32,
- }},
- Endpoints: peer.DiscoEndpoint,
+ PublicKey: wgkey.Key(peer.PublicKey),
+ AllowedIPs: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+ peer.VPNIP,
+ 32,
+ )},
+ Endpoints: wgcfg.Endpoints{
+ DiscoKey: tailcfg.DiscoKey(peer.DiscoKey),
+ },
PersistentKeepalive: 15, // TODO(giolekva): make it configurable
})
}
@@ -79,33 +90,33 @@
func genRouterConf(netMap *types.NetworkMap) *router.Config {
c := &router.Config{
- LocalAddrs: []netaddr.IPPrefix{netaddr.IPPrefix{
- IP: netMap.Self.VPNIP,
- Bits: 32,
- }},
+ LocalAddrs: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+ netMap.Self.VPNIP,
+ 32,
+ )},
Routes: make([]netaddr.IPPrefix, 0, len(netMap.Peers)),
}
for _, peer := range netMap.Peers {
- c.Routes = append(c.Routes, netaddr.IPPrefix{
- IP: peer.VPNIP,
- Bits: 32,
- })
+ c.Routes = append(c.Routes, netaddr.IPPrefixFrom(
+ peer.VPNIP,
+ 32,
+ ))
}
return c
}
-func genTailNetMap(privKey types.PrivateKey, port uint16, netMap *types.NetworkMap) *controlclient.NetworkMap {
- c := &controlclient.NetworkMap{
+func genTailNetMap(privKey types.PrivateKey, port uint16, netMap *types.NetworkMap) *netmap.NetworkMap {
+ c := &netmap.NetworkMap{
SelfNode: &tailcfg.Node{
ID: 0, // TODO(giolekva): maybe IDs should be stored server side.
StableID: "0",
Name: "0",
Key: tailcfg.NodeKey(netMap.Self.PublicKey),
DiscoKey: tailcfg.DiscoKey(netMap.Self.DiscoKey),
- Addresses: []netaddr.IPPrefix{netaddr.IPPrefix{
- IP: netMap.Self.VPNIP,
- Bits: 32,
- }},
+ Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+ netMap.Self.VPNIP,
+ 32,
+ )},
AllowedIPs: make([]netaddr.IPPrefix, 0, len(netMap.Peers)),
Endpoints: []string{netMap.Self.IPPort.String()},
KeepAlive: true, // TODO(giolekva): make it configurable
@@ -113,10 +124,10 @@
NodeKey: tailcfg.NodeKey(netMap.Self.PublicKey),
PrivateKey: wgkey.Private(privKey),
Name: "0",
- Addresses: []netaddr.IPPrefix{netaddr.IPPrefix{
- IP: netMap.Self.VPNIP,
- Bits: 32,
- }},
+ Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+ netMap.Self.VPNIP,
+ 32,
+ )},
LocalPort: port,
Peers: make([]*tailcfg.Node, 0, len(netMap.Peers)),
}
@@ -127,14 +138,14 @@
Name: fmt.Sprintf("%d", i+1),
Key: tailcfg.NodeKey(peer.PublicKey),
DiscoKey: tailcfg.DiscoKey(peer.DiscoKey),
- Addresses: []netaddr.IPPrefix{netaddr.IPPrefix{
- IP: peer.VPNIP,
- Bits: 32,
- }},
- AllowedIPs: []netaddr.IPPrefix{netaddr.IPPrefix{
- IP: netMap.Self.VPNIP,
- Bits: 32,
- }},
+ Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+ peer.VPNIP,
+ 32,
+ )},
+ AllowedIPs: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+ netMap.Self.VPNIP,
+ 32,
+ )},
Endpoints: []string{peer.IPPort.String()},
KeepAlive: true,
})
@@ -145,7 +156,9 @@
func (e *WireguardEngine) Configure(netMap *types.NetworkMap) error {
err := e.wg.Reconfig(
genWireguardConf(e.privKey, e.port, netMap),
- genRouterConf(netMap))
+ genRouterConf(netMap),
+ &dns.Config{},
+ nil)
if err != nil {
return err
}
@@ -158,10 +171,6 @@
return types.DiscoKey(e.wg.DiscoPublicKey())
}
-func (e *WireguardEngine) DiscoEndpoint() string {
- return e.DiscoKey().Endpoint()
-}
-
func (e *WireguardEngine) Ping(ip netaddr.IP, cb func(*ipnstate.PingResult)) {
- e.wg.Ping(ip, cb)
+ e.wg.Ping(ip, false, cb)
}