mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-05 08:47:35 +08:00

* internet gws apis * add validate check for inet request * add default gw changes to peer update * update json tag * add OS checks for inet gws * add set defaul gw pro func * allow disable and enable inet gw * add inet handlers to pro * add fields to api node * add inet allowed ips * add default gw to pull * unset node inet details on deletion * unset internet gw on network nodes * unset inet gw fix * unset inet gw fix * send default gw ip * fix inet node endpoint * add default gw endpoint ip to pull resp * validate after unset gws * add inet client peer allowedips to inet node * validate after unset gws * fix allowed ips for inet peer and gw node * fix allowed ips for inet peer and gw node * fix allowed ips for inet peer and gw node * fix allowed ips for inet peer and gw node * fix inet gw and relayed conflict * fix inet gw and relayed conflict * fix update req * fix update inet gw api * when inet gw is peer ignore other allowedIps * test relay * revert test relay * revert inet peer update changes * channel internet traffic of relayed node to relay's inetgw * channel internet traffic of relayed node to relay's inetgw * channel internet traffic of relayed node to relay's inetgw * add check for relayed node * add inet info to peer update * add inet info to peer update * fix update node to persist inet info * fix go tests * egress ranges with inet gw fix * egress ranges with inet gw fix * disallow node acting using inet gw to act as inet gw * add check to validate inet gw * fix typos * add firewall check * set inetgw on ingress req on community * set inetgw to false on community on ingress del
146 lines
3.9 KiB
Go
146 lines
3.9 KiB
Go
package logic
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
|
|
"github.com/gravitl/netmaker/logic"
|
|
"github.com/gravitl/netmaker/models"
|
|
"golang.org/x/exp/slog"
|
|
)
|
|
|
|
func ValidateInetGwReq(inetNode models.Node, req models.InetNodeReq, update bool) error {
|
|
inetHost, err := logic.GetHost(inetNode.HostID.String())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if inetHost.FirewallInUse == models.FIREWALL_NONE {
|
|
return errors.New("iptables or nftables needs to be installed")
|
|
}
|
|
if inetNode.InternetGwID != "" {
|
|
return fmt.Errorf("node %s is using a internet gateway already", inetHost.Name)
|
|
}
|
|
if inetNode.IsRelayed {
|
|
return fmt.Errorf("node %s is being relayed", inetHost.Name)
|
|
}
|
|
for _, clientNodeID := range req.InetNodeClientIDs {
|
|
clientNode, err := logic.GetNodeByID(clientNodeID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
clientHost, err := logic.GetHost(clientNode.HostID.String())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if clientHost.OS != models.OS_Types.Linux && clientHost.OS != models.OS_Types.Windows {
|
|
return errors.New("can only attach linux or windows machine to a internet gateway")
|
|
}
|
|
if clientNode.IsInternetGateway {
|
|
return fmt.Errorf("node %s acting as internet gateway cannot use another internet gateway", clientHost.Name)
|
|
}
|
|
if update {
|
|
if clientNode.InternetGwID != "" && clientNode.InternetGwID != inetNode.ID.String() {
|
|
return fmt.Errorf("node %s is already using a internet gateway", clientHost.Name)
|
|
}
|
|
} else {
|
|
if clientNode.InternetGwID != "" {
|
|
return fmt.Errorf("node %s is already using a internet gateway", clientHost.Name)
|
|
}
|
|
}
|
|
|
|
if clientNode.IsRelayed {
|
|
return fmt.Errorf("node %s is being relayed", clientHost.Name)
|
|
}
|
|
|
|
for _, nodeID := range clientHost.Nodes {
|
|
node, err := logic.GetNodeByID(nodeID)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
if node.InternetGwID != "" && node.InternetGwID != inetNode.ID.String() {
|
|
return errors.New("nodes on same host cannot use different internet gateway")
|
|
}
|
|
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// SetInternetGw - sets the node as internet gw based on flag bool
|
|
func SetInternetGw(node *models.Node, req models.InetNodeReq) {
|
|
node.IsInternetGateway = true
|
|
node.InetNodeReq = req
|
|
for _, clientNodeID := range req.InetNodeClientIDs {
|
|
clientNode, err := logic.GetNodeByID(clientNodeID)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
clientNode.InternetGwID = node.ID.String()
|
|
logic.UpsertNode(&clientNode)
|
|
}
|
|
|
|
}
|
|
|
|
func UnsetInternetGw(node *models.Node) {
|
|
nodes, err := logic.GetNetworkNodes(node.Network)
|
|
if err != nil {
|
|
slog.Error("failed to get network nodes", "network", node.Network, "error", err)
|
|
return
|
|
}
|
|
for _, clientNode := range nodes {
|
|
if node.ID.String() == clientNode.InternetGwID {
|
|
clientNode.InternetGwID = ""
|
|
logic.UpsertNode(&clientNode)
|
|
}
|
|
|
|
}
|
|
node.IsInternetGateway = false
|
|
node.InetNodeReq = models.InetNodeReq{}
|
|
|
|
}
|
|
|
|
func SetDefaultGwForRelayedUpdate(relayed, relay models.Node, peerUpdate models.HostPeerUpdate) models.HostPeerUpdate {
|
|
if relay.InternetGwID != "" {
|
|
peerUpdate.ChangeDefaultGw = true
|
|
peerUpdate.DefaultGwIp = relay.Address.IP
|
|
|
|
}
|
|
return peerUpdate
|
|
}
|
|
|
|
func SetDefaultGw(node models.Node, peerUpdate models.HostPeerUpdate) models.HostPeerUpdate {
|
|
if node.InternetGwID != "" {
|
|
|
|
inetNode, err := logic.GetNodeByID(node.InternetGwID)
|
|
if err != nil {
|
|
return peerUpdate
|
|
}
|
|
peerUpdate.ChangeDefaultGw = true
|
|
peerUpdate.DefaultGwIp = inetNode.Address.IP
|
|
|
|
}
|
|
return peerUpdate
|
|
}
|
|
|
|
// GetNetworkIngresses - gets the gateways of a network
|
|
func GetNetworkIngresses(network string) ([]models.Node, error) {
|
|
var ingresses []models.Node
|
|
netNodes, err := logic.GetNetworkNodes(network)
|
|
if err != nil {
|
|
return []models.Node{}, err
|
|
}
|
|
for i := range netNodes {
|
|
if netNodes[i].IsIngressGateway {
|
|
ingresses = append(ingresses, netNodes[i])
|
|
}
|
|
}
|
|
return ingresses, nil
|
|
}
|
|
|
|
// GetAllowedIpsForInet - get inet cidr for node using a inet gw
|
|
func GetAllowedIpForInetNodeClient(node, peer *models.Node) []net.IPNet {
|
|
_, ipnet, _ := net.ParseCIDR("0.0.0.0/0")
|
|
return []net.IPNet{*ipnet}
|
|
}
|