server.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package server
  2. import (
  3. "fmt"
  4. "log"
  5. "net"
  6. "time"
  7. "github.com/gravitl/netmaker/netclient/netclient-proxy/common"
  8. "github.com/gravitl/netmaker/netclient/netclient-proxy/packet"
  9. )
  10. const (
  11. defaultBodySize = 10000
  12. defaultPort = 51722
  13. )
  14. type Config struct {
  15. Port int
  16. BodySize int
  17. Addr net.Addr
  18. LocalWgInterfaces []string
  19. }
  20. type ProxyServer struct {
  21. Config Config
  22. Server *net.UDPConn
  23. }
  24. // Proxy.Listen - begins listening for packets
  25. func (p *ProxyServer) Listen() {
  26. // Buffer with indicated body size
  27. buffer := make([]byte, 1502)
  28. for {
  29. // Read Packet
  30. n, source, err := p.Server.ReadFromUDP(buffer)
  31. if err != nil { // in future log errors?
  32. log.Println("RECV ERROR: ", err)
  33. continue
  34. }
  35. var localWgPort int
  36. localWgPort, n, err = packet.ExtractInfo(buffer, n)
  37. if err != nil {
  38. log.Println("failed to extract info: ", err)
  39. continue
  40. }
  41. log.Println("--------> RECV PKT: ", source.IP.String(), localWgPort)
  42. if val, ok := common.RemoteEndpointsMap[source.IP.String()]; ok {
  43. for _, peerKeys := range val {
  44. if peerI, ok := common.Peers[peerKeys]; ok {
  45. if peerI.Config.LocalWgPort == int(localWgPort) {
  46. log.Printf("PROXING TO LOCAL!!!---> %s <<<< %s <<<<<<<< %s\n", peerI.Proxy.LocalConn.RemoteAddr(),
  47. peerI.Proxy.LocalConn.LocalAddr(), fmt.Sprintf("%s:%d", source.IP.String(), source.Port))
  48. _, err = peerI.Proxy.LocalConn.Write(buffer[:n])
  49. if err != nil {
  50. log.Println("Failed to proxy to Wg local interface: ", err)
  51. continue
  52. }
  53. }
  54. }
  55. }
  56. }
  57. }
  58. }
  59. // Create - creats a proxy listener
  60. // port - port for proxy to listen on localhost
  61. // bodySize - default 10000, leave 0 to use default
  62. // addr - the address for proxy to listen on
  63. // forwards - indicate address to forward to, {"<address:port>",...} format
  64. func CreateProxyServer(port, bodySize int, addr string) (p *ProxyServer, err error) {
  65. if p == nil {
  66. p = &ProxyServer{}
  67. }
  68. p.Config.Port = port
  69. p.Config.BodySize = bodySize
  70. p.setDefaults()
  71. p.Server, err = net.ListenUDP("udp", &net.UDPAddr{
  72. Port: p.Config.Port,
  73. IP: net.ParseIP(addr),
  74. })
  75. return
  76. }
  77. func (p *ProxyServer) KeepAlive(ip string, port int) {
  78. for {
  79. _, _ = p.Server.Write([]byte("hello-proxy"))
  80. //fmt.Println("Sending MSg: ", err)
  81. time.Sleep(time.Second)
  82. }
  83. }
  84. // Proxy.setDefaults - sets all defaults of proxy listener
  85. func (p *ProxyServer) setDefaults() {
  86. p.setDefaultBodySize()
  87. p.setDefaultPort()
  88. }
  89. // Proxy.setDefaultPort - sets default port of Proxy listener if 0
  90. func (p *ProxyServer) setDefaultPort() {
  91. if p.Config.Port == 0 {
  92. p.Config.Port = defaultPort
  93. }
  94. }
  95. // Proxy.setDefaultBodySize - sets default body size of Proxy listener if 0
  96. func (p *ProxyServer) setDefaultBodySize() {
  97. if p.Config.BodySize == 0 {
  98. p.Config.BodySize = defaultBodySize
  99. }
  100. }