netclient-proxy.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package netclientproxy
  2. import (
  3. "fmt"
  4. "log"
  5. "net"
  6. "runtime"
  7. "github.com/gravitl/netmaker/logger"
  8. "github.com/gravitl/netmaker/netclient/config"
  9. "github.com/gravitl/netmaker/netclient/ncutils"
  10. "github.com/gravitl/netmaker/netclient/netclient-proxy/common"
  11. peerpkg "github.com/gravitl/netmaker/netclient/netclient-proxy/peer"
  12. "github.com/gravitl/netmaker/netclient/netclient-proxy/server"
  13. "github.com/gravitl/netmaker/netclient/netclient-proxy/stun"
  14. "github.com/gravitl/netmaker/netclient/netclient-proxy/wg"
  15. "github.com/gravitl/netmaker/netclient/wireguard"
  16. )
  17. func Start() {
  18. log.Println("Starting Proxy...")
  19. hInfo := stun.GetHostInfo()
  20. stun.Host = hInfo
  21. log.Printf("HOSTINFO: %+v", hInfo)
  22. // start the netclient proxy server
  23. p, err := server.CreateProxyServer(0, 0, hInfo.PrivIp.String())
  24. if err != nil {
  25. log.Fatal("failed to create proxy: ", err)
  26. }
  27. go p.Listen()
  28. networks, _ := ncutils.GetSystemNetworks()
  29. for _, network := range networks {
  30. logger.Log(3, "initializing network", network)
  31. cfg := config.ClientConfig{}
  32. cfg.Network = network
  33. cfg.ReadConfig()
  34. node, err := peerpkg.GetNodeInfo(&cfg)
  35. if err != nil {
  36. log.Println("Failed to get node info: ", err)
  37. continue
  38. }
  39. for _, peerI := range node.Peers {
  40. ifaceName := node.Node.Interface
  41. log.Println("--------> IFACE: ", ifaceName)
  42. if runtime.GOOS == "darwin" {
  43. ifaceName, err = wireguard.GetRealIface(ifaceName)
  44. if err != nil {
  45. log.Println("failed to get real iface: ", err)
  46. }
  47. }
  48. wgInterface, err := wg.NewWGIFace(ifaceName, "127.0.0.1/32", wg.DefaultMTU)
  49. if err != nil {
  50. log.Fatal("Failed init new interface: ", err)
  51. }
  52. log.Printf("wg: %+v\n", wgInterface)
  53. peerpkg.AddNewPeer(p, wgInterface, &peerI)
  54. if val, ok := common.RemoteEndpointsMap[peerI.Endpoint.IP.String()]; ok {
  55. val = append(val, peerI.PublicKey.String())
  56. common.RemoteEndpointsMap[peerI.Endpoint.IP.String()] = val
  57. } else {
  58. common.RemoteEndpointsMap[peerI.Endpoint.IP.String()] = []string{peerI.PublicKey.String()}
  59. }
  60. }
  61. }
  62. fmt.Printf("\nPEERS-------> %+v\n", common.Peers)
  63. fmt.Printf("\nREMOTE ENDPOINTS-------> %+v\n", common.RemoteEndpointsMap)
  64. select {}
  65. }
  66. // IsPublicIP indicates whether IP is public or not.
  67. func IsPublicIP(ip net.IP) bool {
  68. if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() || ip.IsPrivate() {
  69. return false
  70. }
  71. return true
  72. }