iptables.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package serverctl
  2. import (
  3. "net"
  4. "os/exec"
  5. "strings"
  6. "github.com/gravitl/netmaker/netclient/ncutils"
  7. "github.com/gravitl/netmaker/servercfg"
  8. )
  9. // InitServerNetclient - intializes the server netclient
  10. func InitIPTables() error {
  11. _, err := exec.LookPath("iptables")
  12. if err != nil {
  13. return err
  14. }
  15. setForwardPolicy()
  16. portForwardServices()
  17. return nil
  18. }
  19. func portForwardServices() {
  20. services := servercfg.GetPortForwardServiceList()
  21. for _, service := range services {
  22. switch service {
  23. case "mq":
  24. iptablesPortForward("mq", "1883", false)
  25. case "dns":
  26. iptablesPortForward("mq", "1883", false)
  27. case "ssh":
  28. iptablesPortForward("127.0.0.1", "22", true)
  29. default:
  30. params := strings.Split(service, ":")
  31. iptablesPortForward(params[0], params[1], true)
  32. }
  33. }
  34. }
  35. func setForwardPolicy() {
  36. ncutils.RunCmd("iptables --policy FORWARD ACCEPT", true)
  37. }
  38. func iptablesPortForward(entry string, port string, isIP bool) {
  39. var address string
  40. if !isIP {
  41. ips, _ := net.LookupIP(entry)
  42. for _, ip := range ips {
  43. if ipv4 := ip.To4(); ipv4 != nil {
  44. address = ip.String()
  45. break
  46. }
  47. }
  48. } else {
  49. address = entry
  50. }
  51. ncutils.RunCmd("iptables -t nat -A PREROUTING -p tcp --dport "+port+" -j DNAT --to-destination "+address+":"+port, true)
  52. ncutils.RunCmd("iptables -t nat -A POSTROUTING -j MASQUERADE", true)
  53. }