routes.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package local
  2. import (
  3. "fmt"
  4. "net"
  5. "strings"
  6. "github.com/gravitl/netmaker/logger"
  7. "github.com/gravitl/netmaker/netclient/ncutils"
  8. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  9. )
  10. // TODO handle ipv6 in future
  11. // SetPeerRoutes - sets/removes ip routes for each peer on a network
  12. func SetPeerRoutes(iface string, oldPeers map[string]bool, newPeers []wgtypes.PeerConfig) {
  13. // get the default route
  14. var hasRoute bool
  15. gwIP, gwIface, err := GetDefaultRoute()
  16. if err != nil {
  17. logger.Log(0, "error getting default route:", err.Error())
  18. }
  19. if gwIP != "" && gwIface != "" && err == nil {
  20. hasRoute = true
  21. }
  22. // traverse through all recieved peers
  23. for _, peer := range newPeers {
  24. for _, allowedIP := range peer.AllowedIPs {
  25. if !oldPeers[allowedIP.String()] {
  26. if err := setRoute(iface, &allowedIP, allowedIP.IP.String()); err != nil {
  27. logger.Log(1, err.Error())
  28. }
  29. } else {
  30. delete(oldPeers, allowedIP.String())
  31. }
  32. }
  33. if peer.Endpoint == nil {
  34. continue
  35. }
  36. if hasRoute && !ncutils.IpIsPrivate(peer.Endpoint.IP) {
  37. ipNet, err := ncutils.GetIPNetFromString(peer.Endpoint.IP.String())
  38. if err != nil {
  39. logger.Log(0, "error parsing ip:", err.Error())
  40. }
  41. SetExplicitRoute(gwIface, &ipNet, gwIP)
  42. }
  43. }
  44. // traverse through all remaining existing peers
  45. for i := range oldPeers {
  46. ip, err := ncutils.GetIPNetFromString(i)
  47. if err != nil {
  48. logger.Log(1, err.Error())
  49. } else {
  50. deleteRoute(iface, &ip, ip.IP.String())
  51. }
  52. }
  53. }
  54. // SetCurrentPeerRoutes - sets all the current peers
  55. func SetCurrentPeerRoutes(iface, currentAddr string, peers []wgtypes.PeerConfig) {
  56. // get the default route
  57. var hasRoute bool
  58. gwIP, gwIface, err := GetDefaultRoute()
  59. if err != nil {
  60. logger.Log(0, "error getting default route:", err.Error())
  61. }
  62. if gwIP != "" && gwIface != "" && err == nil {
  63. hasRoute = true
  64. }
  65. // traverse through all recieved peers
  66. for _, peer := range peers {
  67. for _, allowedIP := range peer.AllowedIPs {
  68. setRoute(iface, &allowedIP, currentAddr)
  69. }
  70. if peer.Endpoint == nil {
  71. continue
  72. }
  73. if hasRoute && !ncutils.IpIsPrivate(peer.Endpoint.IP) {
  74. ipNet, err := ncutils.GetIPNetFromString(peer.Endpoint.IP.String())
  75. if err != nil {
  76. logger.Log(0, "error parsing ip:", err.Error())
  77. }
  78. SetExplicitRoute(gwIface, &ipNet, gwIP)
  79. }
  80. }
  81. }
  82. // FlushPeerRoutes - removes all current peer routes
  83. func FlushPeerRoutes(iface, currentAddr string, peers []wgtypes.Peer) {
  84. // get the default route
  85. var hasRoute bool
  86. gwIP, gwIface, err := GetDefaultRoute()
  87. if err != nil {
  88. logger.Log(0, "error getting default route:", err.Error())
  89. }
  90. if gwIP != "" && gwIface != "" && err == nil {
  91. hasRoute = true
  92. }
  93. for _, peer := range peers {
  94. for _, allowedIP := range peer.AllowedIPs {
  95. deleteRoute(iface, &allowedIP, currentAddr)
  96. }
  97. if hasRoute && !ncutils.IpIsPrivate(peer.Endpoint.IP) {
  98. ipNet, err := ncutils.GetIPNetFromString(peer.Endpoint.IP.String())
  99. if err != nil {
  100. logger.Log(0, "error parsing ip:", err.Error())
  101. }
  102. deleteRoute(gwIface, &ipNet, gwIP)
  103. }
  104. }
  105. }
  106. // SetCIDRRoute - sets the CIDR route, used on join and restarts
  107. func SetCIDRRoute(iface, currentAddr string, cidr *net.IPNet) {
  108. setCidr(iface, currentAddr, cidr)
  109. }
  110. // RemoveCIDRRoute - removes a static cidr route
  111. func RemoveCIDRRoute(iface, currentAddr string, cidr *net.IPNet) {
  112. removeCidr(iface, cidr, currentAddr)
  113. }
  114. // SetNetmakerDomainRoute - sets explicit route over Gateway for a given DNS name
  115. func SetNetmakerDomainRoute(domainRaw string) error {
  116. parts := strings.Split(domainRaw, ":")
  117. hostname := parts[0]
  118. var address net.IPNet
  119. gwIP, gwIface, err := GetDefaultRoute()
  120. if err != nil {
  121. return fmt.Errorf("error getting default route: %w", err)
  122. }
  123. ips, err := net.LookupIP(hostname)
  124. if err != nil {
  125. return err
  126. }
  127. for _, ip := range ips {
  128. if ipv4 := ip.To4(); ipv4 != nil {
  129. address, err = ncutils.GetIPNetFromString(ipv4.String())
  130. if err == nil {
  131. break
  132. }
  133. }
  134. }
  135. if err != nil || address.IP == nil {
  136. return fmt.Errorf("address not found")
  137. }
  138. return SetExplicitRoute(gwIface, &address, gwIP)
  139. }