diff --git a/netclient/functions/daemon.go b/netclient/functions/daemon.go index 651879f1..68314f36 100644 --- a/netclient/functions/daemon.go +++ b/netclient/functions/daemon.go @@ -558,18 +558,6 @@ func decryptMsg(cfg *config.ClientConfig, msg []byte) ([]byte, error) { return ncutils.BoxDecrypt(msg, serverPubKey, diskKey) } -func shouldResub(currentServers, newServers []models.ServerAddr) bool { - if len(currentServers) != len(newServers) { - return true - } - for _, srv := range currentServers { - if !ncutils.ServerAddrSliceContains(newServers, srv) { - return true - } - } - return false -} - func setDNS(iface, network, address string) { var reachable bool for counter := 0; !reachable && counter < 5; counter++ { diff --git a/netclient/local/routes_linux.go b/netclient/local/routes_linux.go new file mode 100644 index 00000000..7224ea91 --- /dev/null +++ b/netclient/local/routes_linux.go @@ -0,0 +1,118 @@ +//go:build linux +// +build linux + +package local + +import ( + //"github.com/davecgh/go-spew/spew" + + "net" + + "github.com/gravitl/netmaker/netclient/ncutils" + "golang.zx2c4.com/wireguard/wgctrl" + "golang.zx2c4.com/wireguard/wgctrl/wgtypes" +) + +func routeExists(iface, address, mask string) bool { + return false +} + +func setRoute(iface, address, mask string) error { + _, err := ncutils.RunCmd("ip route add", true) + return err +} + +func DeleteRoute(iface, address string) error { + var err error + return err +} + +func ApplyRoutesFromConf(confPath string) error { + var err error + return err +} + +//func SetLinuxPeerRoutes(currentPeers []wgtypes.PeerConfig, newPeers []wgtypes.PeerConfig) { +func SetLinuxPeerRoutes(iface string, oldPeers map[string][]net.IP, newPeers []wgtypes.PeerConfig) { + + // traverse through all recieved peers + for _, peer := range newPeers { + // if pubkey found in existing peers, check against existing peer + currPeerAllowedIPs := oldPeers[peer.PublicKey.String()] + if currPeerAllowedIPs != nil { + // traverse IPs, check to see if old peer contains each IP + for _, allowedIP := range peer.AllowedIPs { + if !ncutils.StringSliceContains(currPeerAllowedIPs, allowedIP.IP.String()) { + if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil { + ncutils.PrintLog(err.Error(), 1) + } + } + } + for _, allowedIP := range currPeerAllowedIPs { + if !ncutils.StringSliceContains(currPeerAllowedIPs, allowedIP) { + if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil { + ncutils.PrintLog(err.Error(), 1) + } + } + } + delete(oldPeers, peer.PublicKey.String()) + } else { + for _, allowedIP := range peer.AllowedIPs { + if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil { + ncutils.PrintLog(err.Error(), 1) + } + } + } + } + + // traverse through all existing peers + for _, peer := range oldPeers { + // if pubkey found in existing peers, check against existing peer + currPeerAllowedIPs := oldPeers[peer.PublicKey.String()] + if currPeerAllowedIPs != nil { + // traverse IPs, check to see if old peer contains each IP + for _, allowedIP := range peer.AllowedIPs { + if !ncutils.StringSliceContains(currPeerAllowedIPs, allowedIP.IP.String()) { + if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil { + ncutils.PrintLog(err.Error(), 1) + } + } + } + } else { + for _, allowedIP := range peer.AllowedIPs { + if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil { + ncutils.PrintLog(err.Error(), 1) + } + } + } + } + + // delete removed AllowedIPs + /* + for _, currentPeer := range currentPeers { + for _, oldIP := range currentPeer.AllowedIPs { + found := true + for _, newPeer := range newPeers { + for _, newIP := range newPeer.AllowedIPs { + if + } + } + } + } + */ +} + +func GetCurrentIPs() []string { + client, err := wgctrl.New() + if err != nil { + ncutils.PrintLog("failed to start wgctrl", 0) + return err + } + defer client.Close() + device, err := client.Device(iface) + if err != nil { + ncutils.PrintLog("failed to parse interface", 0) + return err + } + devicePeers = device.Peers +} diff --git a/netclient/local/routes_other.go b/netclient/local/routes_other.go new file mode 100644 index 00000000..afea69d2 --- /dev/null +++ b/netclient/local/routes_other.go @@ -0,0 +1,24 @@ +//go:build !linux +// +build !linux + +package local + +//"github.com/davecgh/go-spew/spew" + +/* + +These functions are not used. These should only be called by Linux (see routes_linux.go). These routes return nothing if called. + +*/ + +func routeExists(iface, address, mask string) bool { + return false +} + +func SetRoute(iface, newAddress, oldAddress, mask string) error { + return nil +} + +func DeleteRoute(iface, address) error { + return nil +} diff --git a/netclient/wireguard/common.go b/netclient/wireguard/common.go index 60c09f59..c0a9c7ba 100644 --- a/netclient/wireguard/common.go +++ b/netclient/wireguard/common.go @@ -25,7 +25,8 @@ const ( // SetPeers - sets peers on a given WireGuard interface func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error { - + var oldIPList []string + var newIPList []string var devicePeers []wgtypes.Peer var err error if ncutils.IsFreeBSD() { @@ -58,6 +59,12 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error { _, err := ncutils.RunCmd("wg set "+iface+" peer "+currentPeer.PublicKey.String()+" remove", true) if err != nil { log.Println("error removing peer", peer.Endpoint.String()) + } else { + for _, address := range currentPeer.AllowedIPs { + if err = local.DeleteRoute(iface, address.String()); err != nil { + ncutils.PrintLog(err.Error(), 1) + } + } } } } @@ -84,6 +91,8 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error { } if err != nil { log.Println("error setting peer", peer.PublicKey.String()) + } else { + } } @@ -104,6 +113,8 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error { if ncutils.IsMac() { err = SetMacPeerRoutes(iface) return err + } else if ncutils.IsLinux() { + err = local.SetLinuxPeerRoutes(devicePeers, peers) } return nil diff --git a/netclient/wireguard/unix.go b/netclient/wireguard/unix.go index 2b2a61a3..a459abc7 100644 --- a/netclient/wireguard/unix.go +++ b/netclient/wireguard/unix.go @@ -8,6 +8,7 @@ import ( "github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/netclient/config" + "github.com/gravitl/netmaker/netclient/local" "github.com/gravitl/netmaker/netclient/ncutils" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" ) @@ -65,6 +66,12 @@ func ApplyWGQuickConf(confPath string, ifacename string) error { ncutils.RunCmd("wg-quick down "+confPath, true) } _, err = ncutils.RunCmd("wg-quick up "+confPath, true) + if err != nil { + return err + } + if ncutils.IsLinux() { + err = local.ApplyRoutesFromConf(confPath) + } return err } }