Browse Source

began route consolidation

0xdcarns 3 years ago
parent
commit
ac5eea4e3d

+ 1 - 1
netclient/functions/daemon.go

@@ -354,7 +354,7 @@ func UpdatePeers(client mqtt.Client, msg mqtt.Message) {
 			return
 		}
 		//err = wireguard.SyncWGQuickConf(cfg.Node.Interface, file)
-		err = wireguard.SetPeers(cfg.Node.Interface, cfg.Node.PersistentKeepalive, peerUpdate.Peers)
+		err = wireguard.SetPeers(cfg.Node.Interface, cfg.Node.Address, cfg.Node.PersistentKeepalive, peerUpdate.Peers)
 		if err != nil {
 			ncutils.Log("error syncing wg after peer update " + err.Error())
 			return

+ 14 - 5
netclient/local/routes.go

@@ -8,7 +8,7 @@ import (
 )
 
 // SetPeerRoutes - sets/removes ip routes for each peer on a network
-func SetPeerRoutes(iface string, oldPeers map[string][]net.IPNet, newPeers []wgtypes.PeerConfig) {
+func SetPeerRoutes(iface, currentNodeAddr string, oldPeers map[string][]net.IPNet, newPeers []wgtypes.PeerConfig) {
 	// traverse through all recieved peers
 	for _, peer := range newPeers {
 		// if pubkey found in existing peers, check against existing peer
@@ -17,14 +17,14 @@ func SetPeerRoutes(iface string, oldPeers map[string][]net.IPNet, newPeers []wgt
 			// traverse IPs, check to see if old peer contains each IP
 			for _, allowedIP := range peer.AllowedIPs { // compare new ones (if any) to old ones
 				if !ncutils.IPNetSliceContains(currPeerAllowedIPs, allowedIP) {
-					if err := setRoute(iface, &allowedIP); err != nil {
+					if err := setRoute(iface, &allowedIP, allowedIP.IP.String()); err != nil {
 						ncutils.PrintLog(err.Error(), 1)
 					}
 				}
 			}
 			for _, allowedIP := range currPeerAllowedIPs { // compare old ones (if any) to new ones
 				if !ncutils.IPNetSliceContains(peer.AllowedIPs, allowedIP) {
-					if err := deleteRoute(iface, &allowedIP); err != nil {
+					if err := deleteRoute(iface, &allowedIP, allowedIP.IP.String()); err != nil {
 						ncutils.PrintLog(err.Error(), 1)
 					}
 				}
@@ -32,7 +32,7 @@ func SetPeerRoutes(iface string, oldPeers map[string][]net.IPNet, newPeers []wgt
 			delete(oldPeers, peer.PublicKey.String()) // remove peer as it was found and processed
 		} else {
 			for _, allowedIP := range peer.AllowedIPs { // add all routes as peer doesn't exist
-				if err := setRoute(iface, &allowedIP); err != nil {
+				if err := setRoute(iface, &allowedIP, allowedIP.String()); err != nil {
 					ncutils.PrintLog(err.Error(), 1)
 				}
 			}
@@ -42,7 +42,16 @@ func SetPeerRoutes(iface string, oldPeers map[string][]net.IPNet, newPeers []wgt
 	// traverse through all remaining existing peers
 	for _, allowedIPs := range oldPeers {
 		for _, allowedIP := range allowedIPs {
-			deleteRoute(iface, &allowedIP)
+			deleteRoute(iface, &allowedIP, allowedIP.IP.String())
+		}
+	}
+}
+
+// SetCurrentPeerRoutes - sets all the current peers
+func SetCurrentPeerRoutes(iface, currentAddr string, peers []wgtypes.Peer) {
+	for _, peer := range peers {
+		for _, allowedIP := range peer.AllowedIPs {
+			setRoute(iface, &allowedIP, currentAddr)
 		}
 	}
 }

+ 32 - 0
netclient/local/routes_darwin.go

@@ -0,0 +1,32 @@
+package local
+
+import (
+	"net"
+
+	"github.com/gravitl/netmaker/netclient/ncutils"
+)
+
+// route -n add -net 10.0.0.0/8 192.168.0.254
+// networksetup -setadditionalroutes Ethernet 192.168.1.0 255.255.255.0 10.0.0.2 persistent
+func setRoute(iface string, addr *net.IPNet, address string) error {
+	var err error
+	var out string
+	var inetx = "inet"
+	if strings.Contains(addr.IP.String(), ":") {
+		inetx = "inet6"
+	}
+	out, err = ncutils.RunCmd("route -n get -"+inetx+" "+addr.IP.String(), true)
+	if err != nil {
+		return err
+	}
+	if !(strings.Contains(out, iface)) {
+		_, err = ncutils.RunCmd("route -q -n add -"+inetx+" "+addr.String()+" -interface "+iface, true)
+	}
+	return err
+}
+
+func deleteRoute(iface string, addr *net.IPNet, address string) error {
+	var err error
+	_, err = ncutils.RunCmd("route -q -n delete "+addr.String(), true)
+	return err
+}

+ 19 - 0
netclient/local/routes_freebsd.go

@@ -0,0 +1,19 @@
+package local
+
+import (
+	"net"
+
+	"github.com/gravitl/netmaker/netclient/ncutils"
+)
+
+func setRoute(iface string, addr *net.IPNet, address string) error {
+	var err error
+	_, _ = ncutils.RunCmd("route add -net "+addr.String()+" -interface "+iface, true)
+	return err
+}
+
+func deleteRoute(iface string, addr *net.IPNet, address string) error {
+	var err error
+	_, err = ncutils.RunCmd("route delete -net "+addr.String()+" -interface "+iface, true)
+	return err
+}

+ 2 - 5
netclient/local/routes_linux.go

@@ -1,6 +1,3 @@
-//go:build linux
-// +build linux
-
 package local
 
 import (
@@ -12,13 +9,13 @@ import (
 	"github.com/gravitl/netmaker/netclient/ncutils"
 )
 
-func setRoute(iface string, addr *net.IPNet) error {
+func setRoute(iface string, addr *net.IPNet, address string) error {
 	var err error
 	_, err = ncutils.RunCmd(fmt.Sprintf("ip route add %s dev %s", addr.String(), iface), true)
 	return err
 }
 
-func deleteRoute(iface string, addr *net.IPNet) error {
+func deleteRoute(iface string, addr *net.IPNet, address string) error {
 	var err error
 	_, err = ncutils.RunCmd(fmt.Sprintf("ip route del %s dev %s", addr.String(), iface), true)
 	return err

+ 0 - 33
netclient/local/routes_other.go

@@ -1,33 +0,0 @@
-//go:build !linux
-// +build !linux
-
-package local
-
-import (
-	//"github.com/davecgh/go-spew/spew"
-
-	"fmt"
-	"net"
-
-	"github.com/gravitl/netmaker/netclient/ncutils"
-)
-
-//"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 setRoute(iface string, addr *net.IPNet) error {
-	var err error
-	_, err = ncutils.RunCmd(fmt.Sprintf("ip route add %s dev %s", addr.String(), iface), true)
-	return err
-}
-
-func deleteRoute(iface string, addr *net.IPNet) error {
-	var err error
-	_, err = ncutils.RunCmd(fmt.Sprintf("ip route del %s dev %s", addr.String(), iface), true)
-	return err
-}

+ 22 - 0
netclient/local/routes_windows.go

@@ -0,0 +1,22 @@
+package local
+
+import (
+	"net"
+	"time"
+
+	"github.com/gravitl/netmaker/netclient/ncutils"
+)
+
+func setRoute(iface string, addr *net.IPNet, address string) error {
+	var err error
+	_, err = ncutils.RunCmd("route -p add "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, true)
+	time.Sleep(time.Second >> 2)
+	ncutils.RunCmd("route change "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, true)
+	return err
+}
+
+func deleteRoute(iface string, addr *net.IPNet, address string) error {
+	var err error
+	_, err = ncutils.RunCmd("route delete "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, true)
+	return err
+}

+ 3 - 3
netclient/wireguard/common.go

@@ -25,7 +25,7 @@ const (
 )
 
 // SetPeers - sets peers on a given WireGuard interface
-func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error {
+func SetPeers(iface, currentNodeAddr string, keepalive int32, peers []wgtypes.PeerConfig) error {
 	var devicePeers []wgtypes.Peer
 	var oldPeerAllowedIps = make(map[string][]net.IPNet, len(peers))
 	var err error
@@ -107,7 +107,7 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error {
 		err = SetMacPeerRoutes(iface)
 		return err
 	} else if ncutils.IsLinux() {
-		local.SetPeerRoutes(iface, oldPeerAllowedIps, peers)
+		local.SetPeerRoutes(iface, currentNodeAddr, oldPeerAllowedIps, peers)
 	}
 
 	return nil
@@ -243,7 +243,7 @@ func SetWGConfig(network string, peerupdate bool) error {
 				return err
 			}
 		}
-		err = SetPeers(iface, nodecfg.PersistentKeepalive, peers)
+		err = SetPeers(iface, nodecfg.Address, nodecfg.PersistentKeepalive, peers)
 	} else if peerupdate {
 		err = InitWireguard(&nodecfg, privkey, peers, hasGateway, gateways, true)
 	} else {