From d63bae351dcc740285e17d5aaccf3c7d4fda6639 Mon Sep 17 00:00:00 2001 From: afeiszli Date: Thu, 12 May 2022 19:35:46 -0400 Subject: [PATCH] fixing rangeupdate for ipv6, setting ipv4 assignment --- controllers/network.go | 13 ++++++-- logic/networks.go | 58 ++++++++++++++++++++++++++++++----- netclient/functions/daemon.go | 6 ++++ netclient/local/local.go | 19 ++++++++++++ 4 files changed, 85 insertions(+), 11 deletions(-) diff --git a/controllers/network.go b/controllers/network.go index 12ceee1e..855d206a 100644 --- a/controllers/network.go +++ b/controllers/network.go @@ -147,19 +147,26 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) { newNetwork.DefaultPostUp = network.DefaultPostUp } - rangeupdate, localrangeupdate, holepunchupdate, err := logic.UpdateNetwork(&network, &newNetwork) + rangeupdate4, rangeupdate6, localrangeupdate, holepunchupdate, err := logic.UpdateNetwork(&network, &newNetwork) if err != nil { returnErrorResponse(w, r, formatError(err, "badrequest")) return } - if rangeupdate { + if rangeupdate4 { err = logic.UpdateNetworkNodeAddresses(network.NetID) if err != nil { returnErrorResponse(w, r, formatError(err, "internal")) return } } + if rangeupdate6 { + err = logic.UpdateNetworkNodeAddresses6(network.NetID) + if err != nil { + returnErrorResponse(w, r, formatError(err, "internal")) + return + } + } if localrangeupdate { err = logic.UpdateNetworkLocalAddresses(network.NetID) if err != nil { @@ -174,7 +181,7 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) { return } } - if rangeupdate || localrangeupdate || holepunchupdate { + if rangeupdate4 || rangeupdate6 || localrangeupdate || holepunchupdate { nodes, err := logic.GetNetworkNodes(network.NetID) if err != nil { returnErrorResponse(w, r, formatError(err, "internal")) diff --git a/logic/networks.go b/logic/networks.go index b6cda805..c3b1c6bb 100644 --- a/logic/networks.go +++ b/logic/networks.go @@ -447,7 +447,7 @@ func UpdateNetworkNodeAddresses(networkName string) error { var node models.Node err := json.Unmarshal([]byte(value), &node) if err != nil { - fmt.Println("error in node address assignment!") + logger.Log(1, "error in node ipv4 address assignment!") return err } if node.Network == networkName { @@ -459,7 +459,7 @@ func UpdateNetworkNodeAddresses(networkName string) error { ipaddr, iperr = UniqueAddress(networkName, false) } if iperr != nil { - fmt.Println("error in node address assignment!") + logger.Log(1, "error in node ipv4 address assignment!") return iperr } @@ -475,6 +475,47 @@ func UpdateNetworkNodeAddresses(networkName string) error { return nil } +// UpdateNetworkNodeAddresses6 - updates network node addresses +func UpdateNetworkNodeAddresses6(networkName string) error { + + collections, err := database.FetchRecords(database.NODES_TABLE_NAME) + if err != nil { + return err + } + + for _, value := range collections { + + var node models.Node + err := json.Unmarshal([]byte(value), &node) + if err != nil { + logger.Log(1, "error in node ipv6 address assignment!") + return err + } + if node.Network == networkName { + var ipaddr string + var iperr error + if node.IsServer == "yes" { + ipaddr, iperr = UniqueAddress6(networkName, true) + } else { + ipaddr, iperr = UniqueAddress6(networkName, false) + } + if iperr != nil { + logger.Log(1, "error in node ipv6 address assignment!") + return iperr + } + + node.Address6 = ipaddr + data, err := json.Marshal(&node) + if err != nil { + return err + } + database.Insert(node.ID, string(data), database.NODES_TABLE_NAME) + } + } + + return nil +} + // IsNetworkNameUnique - checks to see if any other networks have the same name (id) func IsNetworkNameUnique(network *models.Network) (bool, error) { @@ -497,24 +538,25 @@ func IsNetworkNameUnique(network *models.Network) (bool, error) { } // UpdateNetwork - updates a network with another network's fields -func UpdateNetwork(currentNetwork *models.Network, newNetwork *models.Network) (bool, bool, bool, error) { +func UpdateNetwork(currentNetwork *models.Network, newNetwork *models.Network) (bool, bool, bool, bool, error) { if err := ValidateNetwork(newNetwork, true); err != nil { - return false, false, false, err + return false, false, false, false, err } if newNetwork.NetID == currentNetwork.NetID { - hasrangeupdate := newNetwork.AddressRange != currentNetwork.AddressRange + hasrangeupdate4 := newNetwork.AddressRange != currentNetwork.AddressRange + hasrangeupdate6 := newNetwork.AddressRange6 != currentNetwork.AddressRange6 localrangeupdate := newNetwork.LocalRange != currentNetwork.LocalRange hasholepunchupdate := newNetwork.DefaultUDPHolePunch != currentNetwork.DefaultUDPHolePunch data, err := json.Marshal(newNetwork) if err != nil { - return false, false, false, err + return false, false, false, false, err } newNetwork.SetNetworkLastModified() err = database.Insert(newNetwork.NetID, string(data), database.NETWORKS_TABLE_NAME) - return hasrangeupdate, localrangeupdate, hasholepunchupdate, err + return hasrangeupdate4, hasrangeupdate6, localrangeupdate, hasholepunchupdate, err } // copy values - return false, false, false, errors.New("failed to update network " + newNetwork.NetID + ", cannot change netid.") + return false, false, false, false, errors.New("failed to update network " + newNetwork.NetID + ", cannot change netid.") } // GetNetwork - gets a network from database diff --git a/netclient/functions/daemon.go b/netclient/functions/daemon.go index eeabc635..750d6feb 100644 --- a/netclient/functions/daemon.go +++ b/netclient/functions/daemon.go @@ -21,6 +21,7 @@ import ( "github.com/gravitl/netmaker/netclient/auth" "github.com/gravitl/netmaker/netclient/config" "github.com/gravitl/netmaker/netclient/daemon" + "github.com/gravitl/netmaker/netclient/local" "github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/netclient/wireguard" ssl "github.com/gravitl/netmaker/tls" @@ -57,6 +58,11 @@ func Daemon() error { } //initialPull(cfg.Network) } + // set ipforwarding on startup + err := local.SetIPForwarding() + if err != nil { + logger.Log(0, err.Error()) + } // == subscribe to all nodes for each on machine == for server, config := range serverSet { diff --git a/netclient/local/local.go b/netclient/local/local.go index e4679f8a..dcbeaa08 100644 --- a/netclient/local/local.go +++ b/netclient/local/local.go @@ -32,6 +32,8 @@ func SetIPForwarding() error { // SetIPForwardingLinux - sets the ipforwarding for linux func SetIPForwardingUnix() error { + + // ipv4 out, err := ncutils.RunCmd("sysctl net.ipv4.ip_forward", true) if err != nil { log.Println("WARNING: Error encountered setting ip forwarding. This can break functionality.") @@ -46,6 +48,23 @@ func SetIPForwardingUnix() error { } } } + + // ipv6 + out, err = ncutils.RunCmd("sysctl net.ipv6.conf.all.forwarding", true) + if err != nil { + log.Println("WARNING: Error encountered setting ipv6 forwarding. This can break functionality.") + return err + } else { + s := strings.Fields(string(out)) + if s[2] != "1" { + _, err = ncutils.RunCmd("sysctl -w net.ipv6.conf.all.forwarding=1", true) + if err != nil { + log.Println("WARNING: Error encountered setting ipv6 forwarding. You may want to investigate this.") + return err + } + } + } + return nil }