diff --git a/netclient/functions/join.go b/netclient/functions/join.go index cb56ec3f..a346baec 100644 --- a/netclient/functions/join.go +++ b/netclient/functions/join.go @@ -9,6 +9,7 @@ import ( "log" "net/http" "runtime" + "strconv" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logic" @@ -170,8 +171,12 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error { } } logger.Log(1, "node created on remote server...updating configs") - cfg.Node = node - err = config.ModNodeConfig(&cfg.Node) + err = ncutils.ModPort(&node) + logger.Log(0, "using port", strconv.Itoa(int(node.ListenPort))) + if err != nil { + return err + } + err = config.ModNodeConfig(&node) if err != nil { return err } @@ -188,6 +193,7 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error { if err != nil { return err } + cfg.Node = node if err := Register(cfg); err != nil { return err } diff --git a/netclient/functions/mqhandlers.go b/netclient/functions/mqhandlers.go index 0148fc28..8114b224 100644 --- a/netclient/functions/mqhandlers.go +++ b/netclient/functions/mqhandlers.go @@ -113,17 +113,22 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) { wireguard.UpdateKeepAlive(file, newNode.PersistentKeepalive) } if ifaceDelta { // if a change caused an ifacedelta we need to notify the server to update the peers + err = ncutils.ModPort(&nodeCfg.Node) + if err != nil { + logger.Log(0, "error modifying node port on", nodeCfg.Node.Name, "-", err.Error()) + return + } logger.Log(0, "applying WG conf to "+file) if ncutils.IsWindows() { wireguard.RemoveConfGraceful(nodeCfg.Node.Interface) } err = wireguard.ApplyConf(&nodeCfg.Node, nodeCfg.Node.Interface, file) 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 } - time.Sleep(time.Second >> 0) + time.Sleep(time.Second) // if newNode.DNSOn == "yes" { // for _, server := range newNode.NetworkSettings.DefaultServerAddrs { // if server.IsLeader { diff --git a/netclient/functions/pull.go b/netclient/functions/pull.go index 60df80a1..3db2aa36 100644 --- a/netclient/functions/pull.go +++ b/netclient/functions/pull.go @@ -8,6 +8,7 @@ import ( "net/http" "os" "runtime" + "strconv" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/models" @@ -62,10 +63,15 @@ func Pull(network string, iface bool) (*models.Node, error) { logger.Log(0, "unable to update server config: "+err.Error()) } } + err = ncutils.ModPort(&resNode) + logger.Log(0, "port is now", strconv.Itoa(int(resNode.ListenPort))) + if err != nil { + return nil, err + } + if err = config.ModNodeConfig(&resNode); err != nil { + return nil, err + } if iface { - if err = config.ModNodeConfig(&resNode); err != nil { - return nil, err - } if err = wireguard.SetWGConfig(network, false, nodeGET.Peers[:]); err != nil { return nil, err } diff --git a/netclient/ncutils/netclientutils.go b/netclient/ncutils/netclientutils.go index d28fa72b..2ddbea16 100644 --- a/netclient/ncutils/netclientutils.go +++ b/netclient/ncutils/netclientutils.go @@ -574,3 +574,14 @@ func GetIPNetFromString(ip string) (net.IPNet, error) { } 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 +} diff --git a/netclient/wireguard/common.go b/netclient/wireguard/common.go index f8df1742..67f2cfc7 100644 --- a/netclient/wireguard/common.go +++ b/netclient/wireguard/common.go @@ -138,15 +138,9 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig return err } defer wgclient.Close() - cfg, err := config.ReadConfig(node.Network) - if err != nil { - return err - } //nodecfg := modcfg.Node var ifacename string - if cfg.Node.Interface != "" { - ifacename = cfg.Node.Interface - } else if node.Interface != "" { + if node.Interface != "" { ifacename = node.Interface } else { return fmt.Errorf("no interface to configure") @@ -154,14 +148,7 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig if node.PrimaryAddress() == "" { 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()) return err } @@ -222,7 +209,7 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig //ipv4 if node.Address != "" { - _, cidr, cidrErr := net.ParseCIDR(cfg.NetworkSettings.AddressRange) + _, cidr, cidrErr := net.ParseCIDR(node.NetworkSettings.AddressRange) if cidrErr == nil { local.SetCIDRRoute(ifacename, node.Address, cidr) } else { @@ -232,13 +219,12 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig } if node.Address6 != "" { //ipv6 - _, cidr, cidrErr := net.ParseCIDR(cfg.NetworkSettings.AddressRange6) + _, cidr, cidrErr := net.ParseCIDR(node.NetworkSettings.AddressRange6) if cidrErr == nil { local.SetCIDRRoute(ifacename, node.Address6, cidr) } else { logger.Log(1, "could not set cidr route properly: ", cidrErr.Error()) } - local.SetCurrentPeerRoutes(ifacename, node.Address6, peers) } return err @@ -251,27 +237,24 @@ func SetWGConfig(network string, peerupdate bool, peers []wgtypes.PeerConfig) er if err != nil { return err } - - nodecfg := cfg.Node - privkey, err := RetrievePrivKey(network) if err != nil { return err } if peerupdate && !ncutils.IsFreeBSD() && !(ncutils.IsLinux() && !ncutils.IsKernel()) { var iface string - iface = nodecfg.Interface + iface = cfg.Node.Interface if ncutils.IsMac() { - iface, err = local.GetMacIface(nodecfg.PrimaryAddress()) + iface, err = local.GetMacIface(cfg.Node.PrimaryAddress()) if err != nil { return err } } - err = SetPeers(iface, &nodecfg, peers) + err = SetPeers(iface, &cfg.Node, peers) } else if peerupdate { - err = InitWireguard(&nodecfg, privkey, peers, true) + err = InitWireguard(&cfg.Node, privkey, peers, true) } else { - err = InitWireguard(&nodecfg, privkey, peers, false) + err = InitWireguard(&cfg.Node, privkey, peers, false) } return err