peers.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package functions
  2. import (
  3. "log"
  4. "net"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "github.com/gravitl/netmaker/models"
  9. "github.com/gravitl/netmaker/netclient/ncutils"
  10. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  11. )
  12. func CalculatePeers(thisNode models.Node, peernodes []models.Node, dualstack, egressgateway, server string) ([]wgtypes.Peer, error) {
  13. //hasGateway := false
  14. var gateways []string
  15. var peers []wgtypes.Peer
  16. keepalive := thisNode.PersistentKeepalive
  17. keepalivedur, _ := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
  18. keepaliveserver, err := time.ParseDuration(strconv.FormatInt(int64(5), 10) + "s")
  19. if err != nil {
  20. log.Fatalf("Issue with format of keepalive value. Please update netconfig: %v", err)
  21. }
  22. for _, node := range peernodes {
  23. pubkey, err := wgtypes.ParseKey(node.PublicKey)
  24. if err != nil {
  25. log.Println("error parsing key")
  26. //return peers, hasGateway, gateways, err
  27. }
  28. if thisNode.PublicKey == node.PublicKey {
  29. continue
  30. }
  31. if thisNode.Endpoint == node.Endpoint {
  32. if thisNode.LocalAddress != node.LocalAddress && node.LocalAddress != "" {
  33. node.Endpoint = node.LocalAddress
  34. } else {
  35. continue
  36. }
  37. }
  38. var peer wgtypes.Peer
  39. var peeraddr = net.IPNet{
  40. IP: net.ParseIP(node.Address),
  41. Mask: net.CIDRMask(32, 32),
  42. }
  43. var allowedips []net.IPNet
  44. allowedips = append(allowedips, peeraddr)
  45. // handle manually set peers
  46. for _, allowedIp := range node.AllowedIPs {
  47. if _, ipnet, err := net.ParseCIDR(allowedIp); err == nil {
  48. nodeEndpointArr := strings.Split(node.Endpoint, ":")
  49. if !ipnet.Contains(net.IP(nodeEndpointArr[0])) && ipnet.IP.String() != node.Address { // don't need to add an allowed ip that already exists..
  50. allowedips = append(allowedips, *ipnet)
  51. }
  52. } else if appendip := net.ParseIP(allowedIp); appendip != nil && allowedIp != node.Address {
  53. ipnet := net.IPNet{
  54. IP: net.ParseIP(allowedIp),
  55. Mask: net.CIDRMask(32, 32),
  56. }
  57. allowedips = append(allowedips, ipnet)
  58. }
  59. }
  60. // handle egress gateway peers
  61. if node.IsEgressGateway == "yes" {
  62. //hasGateway = true
  63. ranges := node.EgressGatewayRanges
  64. for _, iprange := range ranges { // go through each cidr for egress gateway
  65. _, ipnet, err := net.ParseCIDR(iprange) // confirming it's valid cidr
  66. if err != nil {
  67. ncutils.PrintLog("could not parse gateway IP range. Not adding "+iprange, 1)
  68. continue // if can't parse CIDR
  69. }
  70. nodeEndpointArr := strings.Split(node.Endpoint, ":") // getting the public ip of node
  71. if ipnet.Contains(net.ParseIP(nodeEndpointArr[0])) { // ensuring egress gateway range does not contain public ip of node
  72. ncutils.PrintLog("egress IP range of "+iprange+" overlaps with "+node.Endpoint+", omitting", 2)
  73. continue // skip adding egress range if overlaps with node's ip
  74. }
  75. if ipnet.Contains(net.ParseIP(thisNode.LocalAddress)) { // ensuring egress gateway range does not contain public ip of node
  76. ncutils.PrintLog("egress IP range of "+iprange+" overlaps with "+thisNode.LocalAddress+", omitting", 2)
  77. continue // skip adding egress range if overlaps with node's local ip
  78. }
  79. gateways = append(gateways, iprange)
  80. if err != nil {
  81. log.Println("ERROR ENCOUNTERED SETTING GATEWAY")
  82. } else {
  83. allowedips = append(allowedips, *ipnet)
  84. }
  85. }
  86. }
  87. if node.Address6 != "" && dualstack == "yes" {
  88. var addr6 = net.IPNet{
  89. IP: net.ParseIP(node.Address6),
  90. Mask: net.CIDRMask(128, 128),
  91. }
  92. allowedips = append(allowedips, addr6)
  93. }
  94. if thisNode.IsServer == "yes" && !(node.IsServer == "yes") {
  95. peer = wgtypes.Peer{
  96. PublicKey: pubkey,
  97. PersistentKeepaliveInterval: keepaliveserver,
  98. AllowedIPs: allowedips,
  99. }
  100. } else if keepalive != 0 {
  101. peer = wgtypes.Peer{
  102. PublicKey: pubkey,
  103. PersistentKeepaliveInterval: keepalivedur,
  104. Endpoint: &net.UDPAddr{
  105. IP: net.ParseIP(node.Endpoint),
  106. Port: int(node.ListenPort),
  107. },
  108. AllowedIPs: allowedips,
  109. }
  110. } else {
  111. peer = wgtypes.Peer{
  112. PublicKey: pubkey,
  113. Endpoint: &net.UDPAddr{
  114. IP: net.ParseIP(node.Endpoint),
  115. Port: int(node.ListenPort),
  116. },
  117. AllowedIPs: allowedips,
  118. }
  119. }
  120. peers = append(peers, peer)
  121. }
  122. return peers, nil
  123. }
  124. func CalculateExtPeers(thisNode models.Node, extPeers []models.ExtPeersResponse) ([]wgtypes.Peer, error) {
  125. var peers []wgtypes.Peer
  126. var err error
  127. for _, extPeer := range extPeers {
  128. pubkey, err := wgtypes.ParseKey(extPeer.PublicKey)
  129. if err != nil {
  130. log.Println("error parsing key")
  131. return peers, err
  132. }
  133. if thisNode.PublicKey == extPeer.PublicKey {
  134. continue
  135. }
  136. var peer wgtypes.Peer
  137. var peeraddr = net.IPNet{
  138. IP: net.ParseIP(extPeer.Address),
  139. Mask: net.CIDRMask(32, 32),
  140. }
  141. var allowedips []net.IPNet
  142. allowedips = append(allowedips, peeraddr)
  143. if extPeer.Address6 != "" && thisNode.IsDualStack == "yes" {
  144. var addr6 = net.IPNet{
  145. IP: net.ParseIP(extPeer.Address6),
  146. Mask: net.CIDRMask(128, 128),
  147. }
  148. allowedips = append(allowedips, addr6)
  149. }
  150. peer = wgtypes.Peer{
  151. PublicKey: pubkey,
  152. AllowedIPs: allowedips,
  153. }
  154. peers = append(peers, peer)
  155. }
  156. return peers, err
  157. }