Browse Source

Merge pull request #1316 from gravitl/bugfix_v0.14.5_wg_ports

Bugfix v0.14.5 wg ports
dcarns 3 years ago
parent
commit
07729b56f9

+ 9 - 0
netclient/functions/common.go

@@ -10,6 +10,7 @@ import (
 	"net"
 	"net"
 	"net/http"
 	"net/http"
 	"os"
 	"os"
+	"strconv"
 	"strings"
 	"strings"
 	"time"
 	"time"
 
 
@@ -415,3 +416,11 @@ func SetServerInfo(cfg *config.ClientConfig) error {
 
 
 	return nil
 	return nil
 }
 }
+
+func informPortChange(node *models.Node) {
+	if node.ListenPort == 0 {
+		logger.Log(0, "UDP hole punching enabled for node", node.Name)
+	} else {
+		logger.Log(0, "node", node.Name, "is using port", strconv.Itoa(int(node.ListenPort)))
+	}
+}

+ 8 - 2
netclient/functions/join.go

@@ -170,8 +170,13 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error {
 		}
 		}
 	}
 	}
 	logger.Log(1, "node created on remote server...updating configs")
 	logger.Log(1, "node created on remote server...updating configs")
-	cfg.Node = node
-	err = config.ModNodeConfig(&cfg.Node)
+	err = ncutils.ModPort(&node)
+	if err != nil {
+		return err
+	}
+	informPortChange(&node)
+
+	err = config.ModNodeConfig(&node)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -188,6 +193,7 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error {
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
+	cfg.Node = node
 	if err := Register(cfg); err != nil {
 	if err := Register(cfg); err != nil {
 		return err
 		return err
 	}
 	}

+ 15 - 9
netclient/functions/mqhandlers.go

@@ -105,25 +105,31 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
 	}
 	}
 	file := ncutils.GetNetclientPathSpecific() + nodeCfg.Node.Interface + ".conf"
 	file := ncutils.GetNetclientPathSpecific() + nodeCfg.Node.Interface + ".conf"
 
 
-	if err := wireguard.UpdateWgInterface(file, privateKey, nameserver, newNode); err != nil {
-		logger.Log(0, "error updating wireguard config "+err.Error())
-		return
-	}
-	if keepaliveChange {
-		wireguard.UpdateKeepAlive(file, newNode.PersistentKeepalive)
-	}
 	if ifaceDelta { // if a change caused an ifacedelta we need to notify the server to update the peers
 	if ifaceDelta { // if a change caused an ifacedelta we need to notify the server to update the peers
+		err = ncutils.ModPort(&newNode)
+		if err != nil {
+			logger.Log(0, "error modifying node port on", newNode.Name, "-", err.Error())
+			return
+		}
+		informPortChange(&newNode)
+		if err := wireguard.UpdateWgInterface(file, privateKey, nameserver, newNode); err != nil {
+			logger.Log(0, "error updating wireguard config "+err.Error())
+			return
+		}
+		if keepaliveChange {
+			wireguard.UpdateKeepAlive(file, newNode.PersistentKeepalive)
+		}
 		logger.Log(0, "applying WG conf to "+file)
 		logger.Log(0, "applying WG conf to "+file)
 		if ncutils.IsWindows() {
 		if ncutils.IsWindows() {
 			wireguard.RemoveConfGraceful(nodeCfg.Node.Interface)
 			wireguard.RemoveConfGraceful(nodeCfg.Node.Interface)
 		}
 		}
 		err = wireguard.ApplyConf(&nodeCfg.Node, nodeCfg.Node.Interface, file)
 		err = wireguard.ApplyConf(&nodeCfg.Node, nodeCfg.Node.Interface, file)
 		if err != nil {
 		if err != nil {
-			logger.Log(0, "error restarting wg after node update "+err.Error())
+			logger.Log(0, "error restarting wg after node update -", err.Error())
 			return
 			return
 		}
 		}
 
 
-		time.Sleep(time.Second >> 0)
+		time.Sleep(time.Second)
 		//	if newNode.DNSOn == "yes" {
 		//	if newNode.DNSOn == "yes" {
 		//		for _, server := range newNode.NetworkSettings.DefaultServerAddrs {
 		//		for _, server := range newNode.NetworkSettings.DefaultServerAddrs {
 		//			if server.IsLeader {
 		//			if server.IsLeader {

+ 9 - 2
netclient/functions/pull.go

@@ -62,10 +62,17 @@ func Pull(network string, iface bool) (*models.Node, error) {
 			logger.Log(0, "unable to update server config: "+err.Error())
 			logger.Log(0, "unable to update server config: "+err.Error())
 		}
 		}
 	}
 	}
-	if iface {
-		if err = config.ModNodeConfig(&resNode); err != nil {
+	if nodeGET.Node.ListenPort != cfg.Node.ListenPort {
+		err = ncutils.ModPort(&resNode)
+		if err != nil {
 			return nil, err
 			return nil, err
 		}
 		}
+		informPortChange(&resNode)
+	}
+	if err = config.ModNodeConfig(&resNode); err != nil {
+		return nil, err
+	}
+	if iface {
 		if err = wireguard.SetWGConfig(network, false, nodeGET.Peers[:]); err != nil {
 		if err = wireguard.SetWGConfig(network, false, nodeGET.Peers[:]); err != nil {
 			return nil, err
 			return nil, err
 		}
 		}

+ 11 - 0
netclient/ncutils/netclientutils.go

@@ -574,3 +574,14 @@ func GetIPNetFromString(ip string) (net.IPNet, error) {
 	}
 	}
 	return *ipnet, err
 	return *ipnet, err
 }
 }
+
+// ModPort - Change Node Port if UDP Hole Punching or ListenPort is not free
+func ModPort(node *models.Node) error {
+	var err error
+	if node.UDPHolePunch == "yes" {
+		node.ListenPort = 0
+	} else {
+		node.ListenPort, err = GetFreePort(node.ListenPort)
+	}
+	return err
+}

+ 9 - 26
netclient/wireguard/common.go

@@ -138,15 +138,9 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 		return err
 		return err
 	}
 	}
 	defer wgclient.Close()
 	defer wgclient.Close()
-	cfg, err := config.ReadConfig(node.Network)
-	if err != nil {
-		return err
-	}
 	//nodecfg := modcfg.Node
 	//nodecfg := modcfg.Node
 	var ifacename string
 	var ifacename string
-	if cfg.Node.Interface != "" {
-		ifacename = cfg.Node.Interface
-	} else if node.Interface != "" {
+	if node.Interface != "" {
 		ifacename = node.Interface
 		ifacename = node.Interface
 	} else {
 	} else {
 		return fmt.Errorf("no interface to configure")
 		return fmt.Errorf("no interface to configure")
@@ -154,14 +148,7 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 	if node.PrimaryAddress() == "" {
 	if node.PrimaryAddress() == "" {
 		return fmt.Errorf("no address to configure")
 		return fmt.Errorf("no address to configure")
 	}
 	}
-	logger.Log(1, "turn on UDP hole punching (dynamic port setting)? "+cfg.Node.UDPHolePunch)
-	if node.UDPHolePunch == "yes" {
-		node.ListenPort = 0
-	} else {
-		//get available port based on current default
-		node.ListenPort, err = ncutils.GetFreePort(node.ListenPort)
-	}
-	if err := WriteWgConfig(&cfg.Node, key.String(), peers); err != nil {
+	if err := WriteWgConfig(node, key.String(), peers); err != nil {
 		logger.Log(1, "error writing wg conf file: ", err.Error())
 		logger.Log(1, "error writing wg conf file: ", err.Error())
 		return err
 		return err
 	}
 	}
@@ -222,7 +209,7 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 
 
 	//ipv4
 	//ipv4
 	if node.Address != "" {
 	if node.Address != "" {
-		_, cidr, cidrErr := net.ParseCIDR(cfg.NetworkSettings.AddressRange)
+		_, cidr, cidrErr := net.ParseCIDR(node.NetworkSettings.AddressRange)
 		if cidrErr == nil {
 		if cidrErr == nil {
 			local.SetCIDRRoute(ifacename, node.Address, cidr)
 			local.SetCIDRRoute(ifacename, node.Address, cidr)
 		} else {
 		} else {
@@ -232,13 +219,12 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 	}
 	}
 	if node.Address6 != "" {
 	if node.Address6 != "" {
 		//ipv6
 		//ipv6
-		_, cidr, cidrErr := net.ParseCIDR(cfg.NetworkSettings.AddressRange6)
+		_, cidr, cidrErr := net.ParseCIDR(node.NetworkSettings.AddressRange6)
 		if cidrErr == nil {
 		if cidrErr == nil {
 			local.SetCIDRRoute(ifacename, node.Address6, cidr)
 			local.SetCIDRRoute(ifacename, node.Address6, cidr)
 		} else {
 		} else {
 			logger.Log(1, "could not set cidr route properly: ", cidrErr.Error())
 			logger.Log(1, "could not set cidr route properly: ", cidrErr.Error())
 		}
 		}
-
 		local.SetCurrentPeerRoutes(ifacename, node.Address6, peers)
 		local.SetCurrentPeerRoutes(ifacename, node.Address6, peers)
 	}
 	}
 	return err
 	return err
@@ -251,27 +237,24 @@ func SetWGConfig(network string, peerupdate bool, peers []wgtypes.PeerConfig) er
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
-
-	nodecfg := cfg.Node
-
 	privkey, err := RetrievePrivKey(network)
 	privkey, err := RetrievePrivKey(network)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
 	if peerupdate && !ncutils.IsFreeBSD() && !(ncutils.IsLinux() && !ncutils.IsKernel()) {
 	if peerupdate && !ncutils.IsFreeBSD() && !(ncutils.IsLinux() && !ncutils.IsKernel()) {
 		var iface string
 		var iface string
-		iface = nodecfg.Interface
+		iface = cfg.Node.Interface
 		if ncutils.IsMac() {
 		if ncutils.IsMac() {
-			iface, err = local.GetMacIface(nodecfg.PrimaryAddress())
+			iface, err = local.GetMacIface(cfg.Node.PrimaryAddress())
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
-		err = SetPeers(iface, &nodecfg, peers)
+		err = SetPeers(iface, &cfg.Node, peers)
 	} else if peerupdate {
 	} else if peerupdate {
-		err = InitWireguard(&nodecfg, privkey, peers, true)
+		err = InitWireguard(&cfg.Node, privkey, peers, true)
 	} else {
 	} else {
-		err = InitWireguard(&nodecfg, privkey, peers, false)
+		err = InitWireguard(&cfg.Node, privkey, peers, false)
 	}
 	}
 
 
 	return err
 	return err