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

Bugfix v0.14.5 wg ports
This commit is contained in:
dcarns
2022-07-07 11:29:45 -04:00
committed by GitHub
6 changed files with 61 additions and 39 deletions

View File

@@ -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)))
}
}

View File

@@ -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 = ncutils.ModPort(&node)
err = config.ModNodeConfig(&cfg.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
} }

View File

@@ -105,6 +105,13 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
} }
file := ncutils.GetNetclientPathSpecific() + nodeCfg.Node.Interface + ".conf" file := ncutils.GetNetclientPathSpecific() + nodeCfg.Node.Interface + ".conf"
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 { if err := wireguard.UpdateWgInterface(file, privateKey, nameserver, newNode); err != nil {
logger.Log(0, "error updating wireguard config "+err.Error()) logger.Log(0, "error updating wireguard config "+err.Error())
return return
@@ -112,18 +119,17 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
if keepaliveChange { if keepaliveChange {
wireguard.UpdateKeepAlive(file, newNode.PersistentKeepalive) wireguard.UpdateKeepAlive(file, newNode.PersistentKeepalive)
} }
if ifaceDelta { // if a change caused an ifacedelta we need to notify the server to update the peers
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 {

View File

@@ -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 nodeGET.Node.ListenPort != cfg.Node.ListenPort {
err = ncutils.ModPort(&resNode)
if err != nil {
return nil, err
}
informPortChange(&resNode)
}
if err = config.ModNodeConfig(&resNode); err != nil { if err = config.ModNodeConfig(&resNode); err != nil {
return nil, err 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
} }

View File

@@ -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
}

View File

@@ -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 != "" { if node.Interface != "" {
ifacename = cfg.Node.Interface
} else 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 err := WriteWgConfig(node, key.String(), peers); err != nil {
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 {
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