peers.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. package logic
  2. import (
  3. "errors"
  4. "net"
  5. "net/netip"
  6. "github.com/gravitl/netmaker/database"
  7. "github.com/gravitl/netmaker/logger"
  8. "github.com/gravitl/netmaker/logic/acls/nodeacls"
  9. "github.com/gravitl/netmaker/models"
  10. "github.com/gravitl/netmaker/servercfg"
  11. "golang.org/x/exp/slices"
  12. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  13. )
  14. // NodePeersInfo - fetches node's peers with their ids and addrs.
  15. func NodePeersInfo(client *models.Client) (models.NodePeersInfo, error) {
  16. nodePeersInfo := models.NodePeersInfo{
  17. PeerIDs: make(models.PeerMap),
  18. Peers: []wgtypes.PeerConfig{},
  19. }
  20. nodes, err := GetNetworkNodes(client.Node.Network)
  21. if err != nil {
  22. return models.NodePeersInfo{}, err
  23. }
  24. for _, peer := range nodes {
  25. if peer.ID == client.Node.ID {
  26. continue
  27. }
  28. if peer.Action == models.NODE_DELETE || peer.PendingDelete || !peer.Connected ||
  29. !nodeacls.AreNodesAllowed(nodeacls.NetworkID(peer.Network), nodeacls.NodeID(client.Node.ID.String()), nodeacls.NodeID(peer.ID.String())) {
  30. continue
  31. }
  32. peerHost, err := GetHost(peer.HostID.String())
  33. if err != nil {
  34. continue
  35. }
  36. var peerConfig wgtypes.PeerConfig
  37. peerConfig.PublicKey = peerHost.PublicKey
  38. peerConfig.PersistentKeepaliveInterval = &peer.PersistentKeepalive
  39. peerConfig.ReplaceAllowedIPs = true
  40. uselocal := false
  41. if client.Host.EndpointIP.String() == peerHost.EndpointIP.String() {
  42. // peer is on same network
  43. // set to localaddress
  44. uselocal = true
  45. if client.Node.LocalAddress.IP == nil {
  46. // use public endpint
  47. uselocal = false
  48. }
  49. if client.Node.LocalAddress.String() == peer.LocalAddress.String() {
  50. uselocal = false
  51. }
  52. }
  53. peerConfig.Endpoint = &net.UDPAddr{
  54. IP: peerHost.EndpointIP,
  55. Port: getPeerWgListenPort(peerHost),
  56. }
  57. if uselocal {
  58. peerConfig.Endpoint.IP = peer.LocalAddress.IP
  59. peerConfig.Endpoint.Port = peerHost.ListenPort
  60. }
  61. allowedips := GetAllowedIPs(&client.Node, &peer, nil)
  62. if peer.IsIngressGateway {
  63. for _, entry := range peer.IngressGatewayRange {
  64. _, cidr, err := net.ParseCIDR(string(entry))
  65. if err == nil {
  66. allowedips = append(allowedips, *cidr)
  67. }
  68. }
  69. }
  70. if peer.IsEgressGateway {
  71. allowedips = append(allowedips, getEgressIPs(
  72. &models.Client{
  73. Host: *peerHost,
  74. Node: peer,
  75. })...)
  76. }
  77. peerConfig.AllowedIPs = allowedips
  78. nodePeersInfo.Peers = append(nodePeersInfo.Peers, peerConfig)
  79. nodePeersInfo.PeerIDs[peerHost.PublicKey.String()] = models.IDandAddr{
  80. ID: peer.ID.String(),
  81. Address: peer.Address.IP.String(),
  82. Name: peerHost.Name,
  83. Network: peer.Network,
  84. ListenPort: GetPeerListenPort(peerHost),
  85. }
  86. }
  87. if client.Node.IsIngressGateway {
  88. extPeers, extPeerIDAndAddrs, err := GetExtPeers(&client.Node)
  89. if err == nil {
  90. nodePeersInfo.Peers = append(nodePeersInfo.Peers, extPeers...)
  91. for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
  92. extPeerIdAndAddr := extPeerIdAndAddr
  93. nodePeersInfo.PeerIDs[extPeerIdAndAddr.ID] = extPeerIdAndAddr
  94. }
  95. } else if !database.IsEmptyRecord(err) {
  96. logger.Log(1, "error retrieving external clients:", err.Error())
  97. }
  98. }
  99. return nodePeersInfo, nil
  100. }
  101. // GetPeerUpdateForHost - gets the consolidated peer update for the host from all networks
  102. func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) {
  103. if host == nil {
  104. return models.HostPeerUpdate{}, errors.New("host is nil")
  105. }
  106. allNodes, err := GetAllNodes()
  107. if err != nil {
  108. return models.HostPeerUpdate{}, err
  109. }
  110. // track which nodes are deleted
  111. // after peer calculation, if peer not in list, add delete config of peer
  112. hostPeerUpdate := models.HostPeerUpdate{
  113. Host: *host,
  114. Server: servercfg.GetServer(),
  115. ServerVersion: servercfg.GetVersion(),
  116. Peers: []wgtypes.PeerConfig{},
  117. HostNetworkInfo: models.HostInfoMap{},
  118. }
  119. logger.Log(1, "peer update for host", host.ID.String())
  120. peerIndexMap := make(map[string]int)
  121. for _, nodeID := range host.Nodes {
  122. nodeID := nodeID
  123. node, err := GetNodeByID(nodeID)
  124. if err != nil {
  125. continue
  126. }
  127. if !node.Connected || node.PendingDelete || node.Action == models.NODE_DELETE {
  128. continue
  129. }
  130. currentPeers := GetNetworkNodesMemory(allNodes, node.Network)
  131. for _, peer := range currentPeers {
  132. peer := peer
  133. if peer.ID.String() == node.ID.String() {
  134. logger.Log(2, "peer update, skipping self")
  135. //skip yourself
  136. continue
  137. }
  138. if peer.IsRelayed {
  139. // skip relayed peers; will be included in relay peer
  140. continue
  141. }
  142. var peerConfig wgtypes.PeerConfig
  143. peerHost, err := GetHost(peer.HostID.String())
  144. if err != nil {
  145. logger.Log(1, "no peer host", peer.HostID.String(), err.Error())
  146. return models.HostPeerUpdate{}, err
  147. }
  148. peerConfig.PublicKey = peerHost.PublicKey
  149. peerConfig.PersistentKeepaliveInterval = &peer.PersistentKeepalive
  150. peerConfig.ReplaceAllowedIPs = true
  151. uselocal := false
  152. if host.EndpointIP.String() == peerHost.EndpointIP.String() {
  153. // peer is on same network
  154. // set to localaddress
  155. uselocal = true
  156. if node.LocalAddress.IP == nil {
  157. // use public endpint
  158. uselocal = false
  159. }
  160. if node.LocalAddress.String() == peer.LocalAddress.String() {
  161. uselocal = false
  162. }
  163. }
  164. peerConfig.Endpoint = &net.UDPAddr{
  165. IP: peerHost.EndpointIP,
  166. Port: getPeerWgListenPort(peerHost),
  167. }
  168. if uselocal {
  169. peerConfig.Endpoint.IP = peer.LocalAddress.IP
  170. peerConfig.Endpoint.Port = peerHost.ListenPort
  171. }
  172. allowedips := GetAllowedIPs(&node, &peer, nil)
  173. if peer.IsIngressGateway {
  174. for _, entry := range peer.IngressGatewayRange {
  175. _, cidr, err := net.ParseCIDR(string(entry))
  176. if err == nil {
  177. allowedips = append(allowedips, *cidr)
  178. }
  179. }
  180. }
  181. if peer.IsEgressGateway {
  182. host, err := GetHost(peer.HostID.String())
  183. if err == nil {
  184. allowedips = append(allowedips, getEgressIPs(
  185. &models.Client{
  186. Host: *host,
  187. Node: peer,
  188. })...)
  189. }
  190. }
  191. if peer.Action != models.NODE_DELETE &&
  192. !peer.PendingDelete &&
  193. peer.Connected &&
  194. nodeacls.AreNodesAllowed(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), nodeacls.NodeID(peer.ID.String())) {
  195. peerConfig.AllowedIPs = allowedips // only append allowed IPs if valid connection
  196. }
  197. if _, ok := peerIndexMap[peerHost.PublicKey.String()]; !ok {
  198. hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, peerConfig)
  199. peerIndexMap[peerHost.PublicKey.String()] = len(hostPeerUpdate.Peers) - 1
  200. hostPeerUpdate.HostNetworkInfo[peerHost.PublicKey.String()] = models.HostNetworkInfo{
  201. Interfaces: peerHost.Interfaces,
  202. }
  203. } else {
  204. peerAllowedIPs := hostPeerUpdate.Peers[peerIndexMap[peerHost.PublicKey.String()]].AllowedIPs
  205. peerAllowedIPs = append(peerAllowedIPs, allowedips...)
  206. hostPeerUpdate.Peers[peerIndexMap[peerHost.PublicKey.String()]].AllowedIPs = peerAllowedIPs
  207. hostPeerUpdate.HostNetworkInfo[peerHost.PublicKey.String()] = models.HostNetworkInfo{
  208. Interfaces: peerHost.Interfaces,
  209. }
  210. }
  211. }
  212. if node.IsIngressGateway {
  213. extPeers, _, err := GetExtPeers(&node)
  214. if err == nil {
  215. hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, extPeers...)
  216. } else if !database.IsEmptyRecord(err) {
  217. logger.Log(1, "error retrieving external clients:", err.Error())
  218. }
  219. }
  220. }
  221. return hostPeerUpdate, nil
  222. }
  223. // GetFwUpdate - fetches the firewall update for the gateway nodes on the host
  224. func GetFwUpdate(host *models.Host) (models.FwUpdate, error) {
  225. fwUpdate := models.FwUpdate{
  226. IngressInfo: models.IngressInfo{
  227. ExtPeers: make(map[string]models.ExtClientInfo),
  228. },
  229. EgressInfo: make(map[string]models.EgressInfo),
  230. }
  231. allNodes, err := GetAllNodes()
  232. if err != nil {
  233. return fwUpdate, err
  234. }
  235. for _, nodeID := range host.Nodes {
  236. nodeID := nodeID
  237. node, err := GetNodeByID(nodeID)
  238. if err != nil {
  239. continue
  240. }
  241. if !node.Connected || node.PendingDelete || node.Action == models.NODE_DELETE {
  242. continue
  243. }
  244. currentPeers := GetNetworkNodesMemory(allNodes, node.Network)
  245. var nodePeerMap map[string]models.PeerRouteInfo
  246. if node.IsIngressGateway || node.IsEgressGateway {
  247. nodePeerMap = make(map[string]models.PeerRouteInfo)
  248. }
  249. for _, peer := range currentPeers {
  250. peer := peer
  251. if peer.ID.String() == node.ID.String() {
  252. logger.Log(2, "fw update, skipping self")
  253. //skip yourself
  254. continue
  255. }
  256. peerHost, err := GetHost(peer.HostID.String())
  257. if err != nil {
  258. logger.Log(1, "no peer host", peer.HostID.String(), err.Error())
  259. continue
  260. }
  261. if node.IsIngressGateway || node.IsEgressGateway {
  262. if peer.IsIngressGateway {
  263. _, extPeerIDAndAddrs, err := GetExtPeers(&peer)
  264. if err == nil {
  265. for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
  266. extPeerIdAndAddr := extPeerIdAndAddr
  267. nodePeerMap[extPeerIdAndAddr.ID] = models.PeerRouteInfo{
  268. PeerAddr: net.IPNet{
  269. IP: net.ParseIP(extPeerIdAndAddr.Address),
  270. Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
  271. },
  272. PeerKey: extPeerIdAndAddr.ID,
  273. Allow: true,
  274. ID: extPeerIdAndAddr.ID,
  275. }
  276. }
  277. }
  278. }
  279. if node.IsIngressGateway && peer.IsEgressGateway {
  280. fwUpdate.IngressInfo.EgressRanges = append(fwUpdate.IngressInfo.EgressRanges,
  281. peer.EgressGatewayRanges...)
  282. }
  283. nodePeerMap[peerHost.PublicKey.String()] = models.PeerRouteInfo{
  284. PeerAddr: net.IPNet{
  285. IP: net.ParseIP(peer.PrimaryAddress()),
  286. Mask: getCIDRMaskFromAddr(peer.PrimaryAddress()),
  287. },
  288. PeerKey: peerHost.PublicKey.String(),
  289. Allow: true,
  290. ID: peer.ID.String(),
  291. }
  292. }
  293. }
  294. var extPeerIDAndAddrs []models.IDandAddr
  295. if node.IsIngressGateway {
  296. fwUpdate.IsIngressGw = true
  297. _, extPeerIDAndAddrs, err = GetExtPeers(&node)
  298. if err == nil {
  299. for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
  300. extPeerIdAndAddr := extPeerIdAndAddr
  301. nodePeerMap[extPeerIdAndAddr.ID] = models.PeerRouteInfo{
  302. PeerAddr: net.IPNet{
  303. IP: net.ParseIP(extPeerIdAndAddr.Address),
  304. Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
  305. },
  306. PeerKey: extPeerIdAndAddr.ID,
  307. Allow: true,
  308. ID: extPeerIdAndAddr.ID,
  309. }
  310. }
  311. for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
  312. extPeerIdAndAddr := extPeerIdAndAddr
  313. fwUpdate.IngressInfo.ExtPeers[extPeerIdAndAddr.ID] = models.ExtClientInfo{
  314. Masquerade: true,
  315. IngGwAddr: net.IPNet{
  316. IP: net.ParseIP(node.PrimaryAddress()),
  317. Mask: getCIDRMaskFromAddr(node.PrimaryAddress()),
  318. },
  319. Network: node.PrimaryNetworkRange(),
  320. ExtPeerAddr: net.IPNet{
  321. IP: net.ParseIP(extPeerIdAndAddr.Address),
  322. Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
  323. },
  324. ExtPeerKey: extPeerIdAndAddr.ID,
  325. Peers: filterNodeMapForClientACLs(extPeerIdAndAddr.ID, node.Network, nodePeerMap),
  326. }
  327. }
  328. } else if !database.IsEmptyRecord(err) {
  329. logger.Log(1, "error retrieving external clients:", err.Error())
  330. }
  331. }
  332. if node.IsEgressGateway {
  333. fwUpdate.IsEgressGw = true
  334. fwUpdate.EgressInfo[node.ID.String()] = models.EgressInfo{
  335. EgressID: node.ID.String(),
  336. Network: node.PrimaryNetworkRange(),
  337. EgressGwAddr: net.IPNet{
  338. IP: net.ParseIP(node.PrimaryAddress()),
  339. Mask: getCIDRMaskFromAddr(node.PrimaryAddress()),
  340. },
  341. GwPeers: nodePeerMap,
  342. EgressGWCfg: node.EgressGatewayRequest,
  343. }
  344. }
  345. }
  346. return fwUpdate, nil
  347. }
  348. // getPeerWgListenPort - fetches the wg listen port for the host
  349. func getPeerWgListenPort(host *models.Host) int {
  350. peerPort := host.ListenPort
  351. if host.WgPublicListenPort != 0 {
  352. peerPort = host.WgPublicListenPort
  353. }
  354. return peerPort
  355. }
  356. // GetPeerListenPort - given a host, retrieve it's appropriate listening port
  357. func GetPeerListenPort(host *models.Host) int {
  358. peerPort := host.ListenPort
  359. if host.WgPublicListenPort != 0 {
  360. peerPort = host.WgPublicListenPort
  361. }
  362. return peerPort
  363. }
  364. func GetExtPeers(node *models.Node) ([]wgtypes.PeerConfig, []models.IDandAddr, error) {
  365. var peers []wgtypes.PeerConfig
  366. var idsAndAddr []models.IDandAddr
  367. extPeers, err := GetNetworkExtClients(node.Network)
  368. if err != nil {
  369. return peers, idsAndAddr, err
  370. }
  371. host, err := GetHost(node.HostID.String())
  372. if err != nil {
  373. return peers, idsAndAddr, err
  374. }
  375. for _, extPeer := range extPeers {
  376. extPeer := extPeer
  377. pubkey, err := wgtypes.ParseKey(extPeer.PublicKey)
  378. if err != nil {
  379. logger.Log(1, "error parsing ext pub key:", err.Error())
  380. continue
  381. }
  382. if host.PublicKey.String() == extPeer.PublicKey ||
  383. extPeer.IngressGatewayID != node.ID.String() || !extPeer.Enabled {
  384. continue
  385. }
  386. var allowedips []net.IPNet
  387. var peer wgtypes.PeerConfig
  388. if extPeer.Address != "" {
  389. var peeraddr = net.IPNet{
  390. IP: net.ParseIP(extPeer.Address),
  391. Mask: net.CIDRMask(32, 32),
  392. }
  393. if peeraddr.IP != nil && peeraddr.Mask != nil {
  394. allowedips = append(allowedips, peeraddr)
  395. }
  396. }
  397. if extPeer.Address6 != "" {
  398. var addr6 = net.IPNet{
  399. IP: net.ParseIP(extPeer.Address6),
  400. Mask: net.CIDRMask(128, 128),
  401. }
  402. if addr6.IP != nil && addr6.Mask != nil {
  403. allowedips = append(allowedips, addr6)
  404. }
  405. }
  406. primaryAddr := extPeer.Address
  407. if primaryAddr == "" {
  408. primaryAddr = extPeer.Address6
  409. }
  410. peer = wgtypes.PeerConfig{
  411. PublicKey: pubkey,
  412. ReplaceAllowedIPs: true,
  413. AllowedIPs: allowedips,
  414. }
  415. peers = append(peers, peer)
  416. idsAndAddr = append(idsAndAddr, models.IDandAddr{
  417. ID: peer.PublicKey.String(),
  418. Name: extPeer.ClientID,
  419. Address: primaryAddr,
  420. IsExtclient: true,
  421. })
  422. }
  423. return peers, idsAndAddr, nil
  424. }
  425. // GetAllowedIPs - calculates the wireguard allowedip field for a peer of a node based on the peer and node settings
  426. func GetAllowedIPs(node, peer *models.Node, metrics *models.Metrics) []net.IPNet {
  427. var allowedips []net.IPNet
  428. allowedips = getNodeAllowedIPs(peer, node)
  429. // handle ingress gateway peers
  430. if peer.IsIngressGateway {
  431. extPeers, _, err := GetExtPeers(peer)
  432. if err != nil {
  433. logger.Log(2, "could not retrieve ext peers for ", peer.ID.String(), err.Error())
  434. }
  435. for _, extPeer := range extPeers {
  436. allowedips = append(allowedips, extPeer.AllowedIPs...)
  437. }
  438. // if node is a failover node, add allowed ips from nodes it is handling
  439. if metrics != nil && peer.Failover && metrics.FailoverPeers != nil {
  440. // traverse through nodes that need handling
  441. logger.Log(3, "peer", peer.ID.String(), "was found to be failover for", node.ID.String(), "checking failover peers...")
  442. for k := range metrics.FailoverPeers {
  443. // if FailoverNode is me for this node, add allowedips
  444. if metrics.FailoverPeers[k] == peer.ID.String() {
  445. // get original node so we can traverse the allowed ips
  446. nodeToFailover, err := GetNodeByID(k)
  447. if err == nil {
  448. failoverNodeMetrics, err := GetMetrics(nodeToFailover.ID.String())
  449. if err == nil && failoverNodeMetrics != nil {
  450. if len(failoverNodeMetrics.NodeName) > 0 {
  451. allowedips = append(allowedips, getNodeAllowedIPs(&nodeToFailover, peer)...)
  452. logger.Log(0, "failing over node", nodeToFailover.ID.String(), nodeToFailover.PrimaryAddress(), "to failover node", peer.ID.String())
  453. }
  454. }
  455. }
  456. }
  457. }
  458. }
  459. }
  460. return allowedips
  461. }
  462. // getEgressIPs - gets the egress IPs for a client
  463. func getEgressIPs(client *models.Client) []net.IPNet {
  464. //check for internet gateway
  465. internetGateway := false
  466. if slices.Contains(client.Node.EgressGatewayRanges, "0.0.0.0/0") || slices.Contains(client.Node.EgressGatewayRanges, "::/0") {
  467. internetGateway = true
  468. }
  469. allowedips := []net.IPNet{}
  470. for _, iprange := range client.Node.EgressGatewayRanges { // go through each cidr for egress gateway
  471. ip, cidr, err := net.ParseCIDR(iprange) // confirming it's valid cidr
  472. if err != nil {
  473. logger.Log(1, "could not parse gateway IP range. Not adding ", iprange)
  474. continue // if can't parse CIDR
  475. }
  476. cidr.IP = ip
  477. // getting the public ip of node
  478. if cidr.Contains(client.Host.EndpointIP) && !internetGateway { // ensuring egress gateway range does not contain endpoint of node
  479. logger.Log(2, "egress IP range of ", iprange, " overlaps with ", client.Host.EndpointIP.String(), ", omitting")
  480. continue // skip adding egress range if overlaps with node's ip
  481. }
  482. // TODO: Could put in a lot of great logic to avoid conflicts / bad routes
  483. if cidr.Contains(client.Node.LocalAddress.IP) && !internetGateway { // ensuring egress gateway range does not contain public ip of node
  484. logger.Log(2, "egress IP range of ", iprange, " overlaps with ", client.Node.LocalAddress.String(), ", omitting")
  485. continue // skip adding egress range if overlaps with node's local ip
  486. }
  487. if err != nil {
  488. logger.Log(1, "error encountered when setting egress range", err.Error())
  489. } else {
  490. allowedips = append(allowedips, *cidr)
  491. }
  492. }
  493. return allowedips
  494. }
  495. func getNodeAllowedIPs(peer, node *models.Node) []net.IPNet {
  496. var allowedips = []net.IPNet{}
  497. if peer.Address.IP != nil {
  498. allowed := net.IPNet{
  499. IP: peer.Address.IP,
  500. Mask: net.CIDRMask(32, 32),
  501. }
  502. allowedips = append(allowedips, allowed)
  503. }
  504. if peer.Address6.IP != nil {
  505. allowed := net.IPNet{
  506. IP: peer.Address6.IP,
  507. Mask: net.CIDRMask(128, 128),
  508. }
  509. allowedips = append(allowedips, allowed)
  510. }
  511. // handle egress gateway peers
  512. if peer.IsEgressGateway {
  513. //hasGateway = true
  514. host, err := GetHost(peer.HostID.String())
  515. if err == nil {
  516. egressIPs := getEgressIPs(
  517. &models.Client{
  518. Host: *host,
  519. Node: *peer,
  520. })
  521. allowedips = append(allowedips, egressIPs...)
  522. }
  523. }
  524. if peer.IsRelay {
  525. for _, relayed := range peer.RelayedNodes {
  526. allowed := getRelayedAddresses(relayed)
  527. allowedips = append(allowedips, allowed...)
  528. }
  529. }
  530. return allowedips
  531. }
  532. func getCIDRMaskFromAddr(addr string) net.IPMask {
  533. cidr := net.CIDRMask(32, 32)
  534. ipAddr, err := netip.ParseAddr(addr)
  535. if err != nil {
  536. return cidr
  537. }
  538. if ipAddr.Is6() {
  539. cidr = net.CIDRMask(128, 128)
  540. }
  541. return cidr
  542. }
  543. // accounts for ext client ACLs
  544. func filterNodeMapForClientACLs(publicKey, network string, nodePeerMap map[string]models.PeerRouteInfo) map[string]models.PeerRouteInfo {
  545. if !isEE {
  546. return nodePeerMap
  547. }
  548. if nodePeerMap == nil {
  549. return map[string]models.PeerRouteInfo{}
  550. }
  551. if len(publicKey) == 0 || len(network) == 0 {
  552. return nodePeerMap
  553. }
  554. client, err := GetExtClientByPubKey(publicKey, network)
  555. if err != nil {
  556. return nodePeerMap
  557. }
  558. for k := range nodePeerMap {
  559. currNodePeer := nodePeerMap[k]
  560. if _, ok := client.ACLs[currNodePeer.ID]; ok {
  561. delete(nodePeerMap, k)
  562. }
  563. }
  564. return nodePeerMap
  565. }
  566. func GetPeerUpdate(host *models.Host) []wgtypes.PeerConfig {
  567. peerUpdate := []wgtypes.PeerConfig{}
  568. for _, nodeStr := range host.Nodes {
  569. node, err := GetNodeByID(nodeStr)
  570. if err != nil {
  571. continue
  572. }
  573. client := models.Client{Host: *host, Node: node}
  574. peers, err := GetNetworkClients(node.Network)
  575. if err != nil {
  576. continue
  577. }
  578. if node.IsRelayed {
  579. peerUpdate = append(peerUpdate, peerUpdateForRelayed(&client, peers)...)
  580. continue
  581. }
  582. if node.IsRelay {
  583. peerUpdate = append(peerUpdate, peerUpdateForRelay(&client, peers)...)
  584. continue
  585. }
  586. for _, peer := range peers {
  587. if peer.Host.ID == client.Host.ID {
  588. continue
  589. }
  590. // if peer is relayed by some other node, remove it from the peer list, it
  591. // will be added to allowedips of relay peer
  592. if peer.Node.IsRelayed {
  593. update := wgtypes.PeerConfig{
  594. PublicKey: peer.Host.PublicKey,
  595. Remove: true,
  596. }
  597. peerUpdate = append(peerUpdate, update)
  598. continue
  599. }
  600. update := wgtypes.PeerConfig{
  601. PublicKey: peer.Host.PublicKey,
  602. ReplaceAllowedIPs: true,
  603. Endpoint: &net.UDPAddr{
  604. IP: peer.Host.EndpointIP,
  605. Port: peer.Host.ListenPort,
  606. },
  607. PersistentKeepaliveInterval: &peer.Node.PersistentKeepalive,
  608. }
  609. // if peer is a relay that relays us, don't do anything
  610. if peer.Node.IsRelay && client.Node.RelayedBy == peer.Node.ID.String() {
  611. continue
  612. } else {
  613. update.AllowedIPs = append(update.AllowedIPs, getRelayAllowedIPs(&peer)...)
  614. }
  615. //normal peer
  616. if nodeacls.AreNodesAllowed(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), nodeacls.NodeID(peer.Node.ID.String())) {
  617. update.AllowedIPs = append(update.AllowedIPs, AddAllowedIPs(&peer)...)
  618. peerUpdate = append(peerUpdate, update)
  619. } else {
  620. update.Remove = true
  621. peerUpdate = append(peerUpdate, update)
  622. }
  623. }
  624. }
  625. return peerUpdate
  626. }
  627. func AddAllowedIPs(peer *models.Client) []net.IPNet {
  628. allowedIPs := []net.IPNet{}
  629. if peer.Node.Address.IP != nil {
  630. peer.Node.Address.Mask = net.CIDRMask(32, 32)
  631. allowedIPs = append(allowedIPs, peer.Node.Address)
  632. }
  633. if peer.Node.Address6.IP != nil {
  634. peer.Node.Address6.Mask = net.CIDRMask(128, 128)
  635. allowedIPs = append(allowedIPs, peer.Node.Address6)
  636. }
  637. if peer.Node.IsEgressGateway {
  638. allowedIPs = append(allowedIPs, getEgressIPs(peer)...)
  639. }
  640. if peer.Node.IsIngressGateway {
  641. allowedIPs = append(allowedIPs, getIngressIPs(peer)...)
  642. }
  643. return allowedIPs
  644. }
  645. // getRelayAllowedIPs returns the list of allowedips for a peer that is a relay
  646. func getRelayAllowedIPs(peer *models.Client) []net.IPNet {
  647. var relayIPs []net.IPNet
  648. if !peer.Node.IsRelay {
  649. logger.Log(0, "getRelayAllowedIPs called for a non-relay node", peer.Host.Name)
  650. return relayIPs
  651. }
  652. //if !client.Node.IsRelayed || client.Node.RelayedBy != peer.Node.ID.String() {
  653. //logger.Log(0, "getRelayAllowedIPs called for non-relayed node", client.Host.Name, peer.Host.Name)
  654. //return relayIPs
  655. //}
  656. for _, relayed := range peer.Node.RelayedNodes {
  657. relayedNode, err := GetNodeByID(relayed)
  658. if err != nil {
  659. logger.Log(0, "retrieve relayed node", err.Error())
  660. continue
  661. }
  662. if relayedNode.Address.IP != nil {
  663. relayedNode.Address.Mask = net.CIDRMask(32, 32)
  664. relayIPs = append(relayIPs, relayedNode.Address)
  665. }
  666. if relayedNode.Address6.IP != nil {
  667. relayedNode.Address.Mask = net.CIDRMask(128, 128)
  668. relayIPs = append(relayIPs, relayedNode.Address6)
  669. }
  670. host, err := GetHost(relayedNode.HostID.String())
  671. if err == nil {
  672. if relayedNode.IsRelay {
  673. relayIPs = append(relayIPs, getRelayAllowedIPs(
  674. &models.Client{
  675. Host: *host,
  676. Node: relayedNode,
  677. })...)
  678. }
  679. if relayedNode.IsEgressGateway {
  680. relayIPs = append(relayIPs, getEgressIPs(
  681. &models.Client{
  682. Host: *host,
  683. Node: relayedNode,
  684. })...)
  685. }
  686. if relayedNode.IsIngressGateway {
  687. relayIPs = append(relayIPs, getIngressIPs(
  688. &models.Client{
  689. Host: *host,
  690. Node: relayedNode,
  691. })...)
  692. }
  693. }
  694. }
  695. return relayIPs
  696. }
  697. // getIngressIPs returns the additional allowedips (ext client addresses) that need
  698. // to be included for an ingress gateway peer
  699. // TODO: add ExtraAllowedIPs
  700. func getIngressIPs(peer *models.Client) []net.IPNet {
  701. var ingressIPs []net.IPNet
  702. extclients, err := GetNetworkExtClients(peer.Node.Network)
  703. if err != nil {
  704. return ingressIPs
  705. }
  706. for _, ec := range extclients {
  707. if ec.IngressGatewayID == peer.Node.ID.String() {
  708. if ec.Address != "" {
  709. ip, cidr, err := net.ParseCIDR(ec.Address)
  710. if err != nil {
  711. continue
  712. }
  713. cidr.IP = ip
  714. ingressIPs = append(ingressIPs, *cidr)
  715. }
  716. if ec.Address6 != "" {
  717. ip, cidr, err := net.ParseCIDR(ec.Address6)
  718. if err != nil {
  719. continue
  720. }
  721. cidr.IP = ip
  722. ingressIPs = append(ingressIPs, *cidr)
  723. }
  724. }
  725. }
  726. return ingressIPs
  727. }
  728. // GetPeerUpdateForRelay - returns the peer update for a relay node
  729. func GetPeerUpdateForRelay(client *models.Client, peers []models.Client) []wgtypes.PeerConfig {
  730. peerConfig := []wgtypes.PeerConfig{}
  731. if !client.Node.IsRelay {
  732. return []wgtypes.PeerConfig{}
  733. }
  734. for _, peer := range peers {
  735. if peer.Host.ID == client.Host.ID {
  736. continue
  737. }
  738. update := wgtypes.PeerConfig{
  739. PublicKey: peer.Host.PublicKey,
  740. ReplaceAllowedIPs: true,
  741. Remove: false,
  742. Endpoint: &net.UDPAddr{
  743. IP: peer.Host.EndpointIP,
  744. Port: peer.Host.ListenPort,
  745. },
  746. PersistentKeepaliveInterval: &peer.Node.PersistentKeepalive,
  747. }
  748. update.AllowedIPs = append(update.AllowedIPs, AddAllowedIPs(&peer)...)
  749. peerConfig = append(peerConfig, update)
  750. }
  751. return peerConfig
  752. }