iptables.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package serverctl
  2. import (
  3. "errors"
  4. "net"
  5. "os"
  6. "os/exec"
  7. "strings"
  8. "time"
  9. "github.com/gravitl/netmaker/logger"
  10. "github.com/gravitl/netmaker/netclient/ncutils"
  11. "github.com/gravitl/netmaker/servercfg"
  12. )
  13. const netmakerProcessName = "netmaker"
  14. // InitServerNetclient - intializes the server netclient
  15. func InitIPTables() error {
  16. _, err := exec.LookPath("iptables")
  17. if err != nil {
  18. return err
  19. }
  20. err = setForwardPolicy()
  21. if err != nil {
  22. logger.Log(0, "error setting iptables forward policy: "+err.Error())
  23. }
  24. err = portForwardServices()
  25. if err != nil {
  26. return err
  27. }
  28. if isContainerized() && servercfg.IsHostNetwork() {
  29. err = setHostCoreDNSMapping()
  30. }
  31. return err
  32. }
  33. // set up port forwarding for services listed in config
  34. func portForwardServices() error {
  35. var err error
  36. services := servercfg.GetPortForwardServiceList()
  37. if len(services) == 0 || services[0] == "" {
  38. return nil
  39. }
  40. for _, service := range services {
  41. switch service {
  42. case "mq":
  43. err = iptablesPortForward("mq", "1883", "1883", false)
  44. case "dns":
  45. err = iptablesPortForward("coredns", "53", "53", false)
  46. case "ssh":
  47. err = iptablesPortForward("127.0.0.1", "22", "22", true)
  48. default:
  49. params := strings.Split(service, ":")
  50. err = iptablesPortForward(params[0], params[1], params[2], true)
  51. }
  52. if err != nil {
  53. return err
  54. }
  55. }
  56. return nil
  57. }
  58. // determine if process is running in container
  59. func isContainerized() bool {
  60. fileBytes, err := os.ReadFile("/proc/1/sched")
  61. if err != nil {
  62. logger.Log(1, "error determining containerization: "+err.Error())
  63. return false
  64. }
  65. fileString := string(fileBytes)
  66. return strings.Contains(fileString, netmakerProcessName)
  67. }
  68. // make sure host allows forwarding
  69. func setForwardPolicy() error {
  70. logger.Log(1, "setting iptables forward policy")
  71. _, err := ncutils.RunCmd("iptables --policy FORWARD ACCEPT", false)
  72. return err
  73. }
  74. // port forward from an entry, can contain a dns name for lookup
  75. func iptablesPortForward(entry string, inport string, outport string, isIP bool) error {
  76. logger.Log(1, "forwarding "+entry+" traffic from host port "+inport+" to container port "+outport)
  77. var address string
  78. if !isIP {
  79. out:
  80. for i := 1; i < 4; i++ {
  81. ips, err := net.LookupIP(entry)
  82. if err != nil && i > 2 {
  83. return err
  84. }
  85. for _, ip := range ips {
  86. if ipv4 := ip.To4(); ipv4 != nil {
  87. address = ipv4.String()
  88. }
  89. }
  90. if address != "" {
  91. break out
  92. }
  93. time.Sleep(time.Second)
  94. }
  95. } else {
  96. address = entry
  97. }
  98. if address == "" {
  99. return errors.New("could not locate ip for " + entry)
  100. }
  101. _, err := ncutils.RunCmd("iptables -t nat -A PREROUTING -p tcp --dport "+inport+" -j DNAT --to-destination "+address+":"+outport, false)
  102. if err != nil {
  103. return err
  104. }
  105. _, err = ncutils.RunCmd("iptables -t nat -A PREROUTING -p udp --dport "+inport+" -j DNAT --to-destination "+address+":"+outport, false)
  106. if err != nil {
  107. return err
  108. }
  109. _, err = ncutils.RunCmd("iptables -t nat -A POSTROUTING -j MASQUERADE", false)
  110. return err
  111. }
  112. // if running in host networking mode, run iptables to map to CoreDNS container
  113. func setHostCoreDNSMapping() error {
  114. logger.Log(1, "forwarding dns traffic on host from netmaker interfaces to 53053")
  115. ncutils.RunCmd("iptables -t nat -A PREROUTING -i nm-+ -p tcp --match tcp --dport 53 --jump REDIRECT --to-ports 53053", true)
  116. _, err := ncutils.RunCmd("iptables -t nat -A PREROUTING -i nm-+ -p udp --match udp --dport 53 --jump REDIRECT --to-ports 53053", true)
  117. return err
  118. }