nodes.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package logic
  2. import (
  3. "errors"
  4. "fmt"
  5. "net"
  6. "github.com/google/uuid"
  7. "github.com/gravitl/netmaker/logic"
  8. "github.com/gravitl/netmaker/models"
  9. "golang.org/x/exp/slog"
  10. )
  11. const (
  12. IPv4Network = "0.0.0.0/0"
  13. IPv6Network = "::/0"
  14. )
  15. func ValidateInetGwReq(inetNode models.Node, req models.InetNodeReq, update bool) error {
  16. inetHost, err := logic.GetHost(inetNode.HostID.String())
  17. if err != nil {
  18. return err
  19. }
  20. if inetHost.FirewallInUse == models.FIREWALL_NONE {
  21. return errors.New("iptables or nftables needs to be installed")
  22. }
  23. if inetNode.EgressDetails.InternetGwID != "" {
  24. return fmt.Errorf("node %s is using a internet gateway already", inetHost.Name)
  25. }
  26. if inetNode.IsRelayed {
  27. return fmt.Errorf("node %s is being relayed", inetHost.Name)
  28. }
  29. for _, clientNodeID := range req.InetNodeClientIDs {
  30. clientNode, err := logic.GetNodeByID(clientNodeID)
  31. if err != nil {
  32. return err
  33. }
  34. if clientNode.IsFailOver {
  35. return errors.New("failover node cannot be set to use internet gateway")
  36. }
  37. clientHost, err := logic.GetHost(clientNode.HostID.String())
  38. if err != nil {
  39. return err
  40. }
  41. if clientHost.IsDefault {
  42. return errors.New("default host cannot be set to use internet gateway")
  43. }
  44. if clientHost.OS != models.OS_Types.Linux && clientHost.OS != models.OS_Types.Windows {
  45. return errors.New("can only attach linux or windows machine to a internet gateway")
  46. }
  47. if clientNode.EgressDetails.IsInternetGateway {
  48. return fmt.Errorf("node %s acting as internet gateway cannot use another internet gateway", clientHost.Name)
  49. }
  50. if update {
  51. if clientNode.EgressDetails.InternetGwID != "" && clientNode.EgressDetails.InternetGwID != inetNode.ID.String() {
  52. return fmt.Errorf("node %s is already using a internet gateway", clientHost.Name)
  53. }
  54. } else {
  55. if clientNode.EgressDetails.InternetGwID != "" {
  56. return fmt.Errorf("node %s is already using a internet gateway", clientHost.Name)
  57. }
  58. }
  59. if clientNode.FailedOverBy != uuid.Nil {
  60. ResetFailedOverPeer(&clientNode)
  61. }
  62. if clientNode.IsRelayed && clientNode.RelayedBy != inetNode.ID.String() {
  63. return fmt.Errorf("node %s is being relayed", clientHost.Name)
  64. }
  65. for _, nodeID := range clientHost.Nodes {
  66. node, err := logic.GetNodeByID(nodeID)
  67. if err != nil {
  68. continue
  69. }
  70. if node.EgressDetails.InternetGwID != "" && node.EgressDetails.InternetGwID != inetNode.ID.String() {
  71. return errors.New("nodes on same host cannot use different internet gateway")
  72. }
  73. }
  74. }
  75. return nil
  76. }
  77. // SetInternetGw - sets the node as internet gw based on flag bool
  78. func SetInternetGw(node *models.Node, req models.InetNodeReq) {
  79. node.EgressDetails.IsInternetGateway = true
  80. node.EgressDetails.InetNodeReq = req
  81. for _, clientNodeID := range req.InetNodeClientIDs {
  82. clientNode, err := logic.GetNodeByID(clientNodeID)
  83. if err != nil {
  84. continue
  85. }
  86. clientNode.EgressDetails.InternetGwID = node.ID.String()
  87. logic.UpsertNode(&clientNode)
  88. }
  89. }
  90. func UnsetInternetGw(node *models.Node) {
  91. nodes, err := logic.GetNetworkNodes(node.Network)
  92. if err != nil {
  93. slog.Error("failed to get network nodes", "network", node.Network, "error", err)
  94. return
  95. }
  96. for _, clientNode := range nodes {
  97. if node.ID.String() == clientNode.EgressDetails.InternetGwID {
  98. clientNode.EgressDetails.InternetGwID = ""
  99. logic.UpsertNode(&clientNode)
  100. }
  101. }
  102. node.EgressDetails.IsInternetGateway = false
  103. node.EgressDetails.InetNodeReq = models.InetNodeReq{}
  104. }
  105. func SetDefaultGwForRelayedUpdate(relayed, relay models.Node, peerUpdate models.HostPeerUpdate) models.HostPeerUpdate {
  106. if relay.EgressDetails.InternetGwID != "" {
  107. relayedHost, err := logic.GetHost(relayed.HostID.String())
  108. if err != nil {
  109. return peerUpdate
  110. }
  111. peerUpdate.ChangeDefaultGw = true
  112. peerUpdate.DefaultGwIp = relay.Address.IP
  113. if peerUpdate.DefaultGwIp == nil || relayedHost.EndpointIP == nil {
  114. peerUpdate.DefaultGwIp = relay.Address6.IP
  115. }
  116. }
  117. return peerUpdate
  118. }
  119. func SetDefaultGw(node models.Node, peerUpdate models.HostPeerUpdate) models.HostPeerUpdate {
  120. if node.EgressDetails.InternetGwID != "" {
  121. inetNode, err := logic.GetNodeByID(node.EgressDetails.InternetGwID)
  122. if err != nil {
  123. return peerUpdate
  124. }
  125. host, err := logic.GetHost(node.HostID.String())
  126. if err != nil {
  127. return peerUpdate
  128. }
  129. peerUpdate.ChangeDefaultGw = true
  130. peerUpdate.DefaultGwIp = inetNode.Address.IP
  131. if peerUpdate.DefaultGwIp == nil || host.EndpointIP == nil {
  132. peerUpdate.DefaultGwIp = inetNode.Address6.IP
  133. }
  134. }
  135. return peerUpdate
  136. }
  137. // GetNetworkIngresses - gets the gateways of a network
  138. func GetNetworkIngresses(network string) ([]models.Node, error) {
  139. var ingresses []models.Node
  140. netNodes, err := logic.GetNetworkNodes(network)
  141. if err != nil {
  142. return []models.Node{}, err
  143. }
  144. for i := range netNodes {
  145. if netNodes[i].IsIngressGateway {
  146. ingresses = append(ingresses, netNodes[i])
  147. }
  148. }
  149. return ingresses, nil
  150. }
  151. // GetAllowedIpForInetNodeClient - get inet cidr for node using a inet gw
  152. func GetAllowedIpForInetNodeClient(node, peer *models.Node) []net.IPNet {
  153. var allowedips = []net.IPNet{}
  154. if peer.Address.IP != nil {
  155. _, ipnet, _ := net.ParseCIDR(IPv4Network)
  156. allowedips = append(allowedips, *ipnet)
  157. }
  158. if peer.Address6.IP != nil {
  159. _, ipnet, _ := net.ParseCIDR(IPv6Network)
  160. allowedips = append(allowedips, *ipnet)
  161. }
  162. return allowedips
  163. }