server.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package server
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "net"
  7. "time"
  8. "github.com/gravitl/netmaker/nm-proxy/common"
  9. "github.com/gravitl/netmaker/nm-proxy/packet"
  10. )
  11. var (
  12. NmProxyServer = &ProxyServer{}
  13. )
  14. const (
  15. defaultBodySize = 10000
  16. defaultPort = common.NmProxyPort
  17. )
  18. type Config struct {
  19. Port int
  20. BodySize int
  21. IsRelay bool
  22. Addr net.Addr
  23. }
  24. type ProxyServer struct {
  25. Config Config
  26. Server *net.UDPConn
  27. }
  28. // Proxy.Listen - begins listening for packets
  29. func (p *ProxyServer) Listen(ctx context.Context) {
  30. // Buffer with indicated body size
  31. buffer := make([]byte, 1532)
  32. for {
  33. select {
  34. case <-ctx.Done():
  35. log.Println("--------->### Shutting down Proxy.....")
  36. // clean up proxy connections
  37. for iface, peers := range common.WgIFaceMap {
  38. log.Println("########------------> CLEANING UP: ", iface)
  39. for _, peerI := range peers {
  40. peerI.Proxy.Cancel()
  41. }
  42. }
  43. // close server connection
  44. NmProxyServer.Server.Close()
  45. return
  46. default:
  47. // Read Packet
  48. n, source, err := p.Server.ReadFromUDP(buffer)
  49. if err != nil { // in future log errors?
  50. log.Println("RECV ERROR: ", err)
  51. continue
  52. }
  53. go func() {
  54. var srcPeerKeyHash, dstPeerKeyHash string
  55. n, srcPeerKeyHash, dstPeerKeyHash = packet.ExtractInfo(buffer, n)
  56. //log.Printf("--------> RECV PKT [DSTPORT: %d], [SRCKEYHASH: %s], SourceIP: [%s] \n", localWgPort, srcPeerKeyHash, source.IP.String())
  57. if _, ok := common.WgIfaceKeyMap[dstPeerKeyHash]; !ok {
  58. // if common.IsIngressGateway {
  59. // log.Println("----> fowarding PKT to EXT client...")
  60. // if val, ok := common.PeerKeyHashMap[dstPeerKeyHash]; ok && val.IsAttachedExtClient {
  61. // log.Printf("-------->Forwarding the pkt to extClient [ SourceIP: %s ], [ SourceKeyHash: %s ], [ DstIP: %s ], [ DstHashKey: %s ] \n",
  62. // source.String(), srcPeerKeyHash, val.Endpoint.String(), dstPeerKeyHash)
  63. // _, err = NmProxyServer.Server.WriteToUDP(buffer[:n], val.Endpoint)
  64. // if err != nil {
  65. // log.Println("Failed to send to remote: ", err)
  66. // }
  67. // continue
  68. // }
  69. // }
  70. if common.IsRelay {
  71. log.Println("----------> Relaying######")
  72. // check for routing map and forward to right proxy
  73. if remoteMap, ok := common.RelayPeerMap[srcPeerKeyHash]; ok {
  74. if conf, ok := remoteMap[dstPeerKeyHash]; ok {
  75. log.Printf("--------> Relaying PKT [ SourceIP: %s:%d ], [ SourceKeyHash: %s ], [ DstIP: %s:%d ], [ DstHashKey: %s ] \n",
  76. source.IP.String(), source.Port, srcPeerKeyHash, conf.Endpoint.String(), conf.Endpoint.Port, dstPeerKeyHash)
  77. _, err = NmProxyServer.Server.WriteToUDP(buffer[:n+32], conf.Endpoint)
  78. if err != nil {
  79. log.Println("Failed to send to remote: ", err)
  80. }
  81. return
  82. }
  83. } else {
  84. if remoteMap, ok := common.RelayPeerMap[dstPeerKeyHash]; ok {
  85. if conf, ok := remoteMap[dstPeerKeyHash]; ok {
  86. log.Printf("--------> Relaying BACK TO RELAYED NODE PKT [ SourceIP: %s ], [ SourceKeyHash: %s ], [ DstIP: %s ], [ DstHashKey: %s ] \n",
  87. source.String(), srcPeerKeyHash, conf.Endpoint.String(), dstPeerKeyHash)
  88. _, err = NmProxyServer.Server.WriteToUDP(buffer[:n+32], conf.Endpoint)
  89. if err != nil {
  90. log.Println("Failed to send to remote: ", err)
  91. }
  92. return
  93. }
  94. }
  95. }
  96. }
  97. }
  98. if peerInfo, ok := common.PeerKeyHashMap[srcPeerKeyHash]; ok {
  99. if peers, ok := common.WgIFaceMap[peerInfo.Interface]; ok {
  100. if peerI, ok := peers[peerInfo.PeerKey]; ok {
  101. log.Printf("PROXING TO LOCAL!!!---> %s <<<< %s <<<<<<<< %s [[ RECV PKT [SRCKEYHASH: %s], [DSTKEYHASH: %s], SourceIP: [%s] ]]\n",
  102. peerI.Proxy.LocalConn.RemoteAddr(), peerI.Proxy.LocalConn.LocalAddr(),
  103. fmt.Sprintf("%s:%d", source.IP.String(), source.Port), srcPeerKeyHash, dstPeerKeyHash, source.IP.String())
  104. _, err = peerI.Proxy.LocalConn.Write(buffer[:n])
  105. if err != nil {
  106. log.Println("Failed to proxy to Wg local interface: ", err)
  107. return
  108. }
  109. }
  110. }
  111. return
  112. }
  113. // // forward to all interfaces
  114. // for _, ifaceCfg := range common.WgIfaceKeyMap {
  115. // log.Println("###--------> Forwarding Unknown PKT to ", ifaceCfg.Interface)
  116. // conn, err := net.DialUDP("udp", nil, ifaceCfg.Endpoint)
  117. // if err == nil {
  118. // _, err := conn.Write(buffer[:n])
  119. // if err != nil {
  120. // log.Println("Failed to forward the unknown pkt to ifcace: ", ifaceCfg.Interface, err)
  121. // }
  122. // conn.Close()
  123. // }
  124. // }
  125. }()
  126. }
  127. }
  128. }
  129. // Create - creats a proxy listener
  130. // port - port for proxy to listen on localhost
  131. // bodySize - default 10000, leave 0 to use default
  132. // addr - the address for proxy to listen on
  133. // forwards - indicate address to forward to, {"<address:port>",...} format
  134. func (p *ProxyServer) CreateProxyServer(port, bodySize int, addr string) (err error) {
  135. if p == nil {
  136. p = &ProxyServer{}
  137. }
  138. p.Config.Port = port
  139. p.Config.BodySize = bodySize
  140. p.setDefaults()
  141. p.Server, err = net.ListenUDP("udp", &net.UDPAddr{
  142. Port: p.Config.Port,
  143. IP: net.ParseIP(addr),
  144. })
  145. return
  146. }
  147. func (p *ProxyServer) KeepAlive(ip string, port int) {
  148. for {
  149. _, _ = p.Server.WriteToUDP([]byte("hello-proxy"), &net.UDPAddr{
  150. IP: net.ParseIP(ip),
  151. Port: port,
  152. })
  153. //log.Println("Sending MSg: ", ip, port, err)
  154. time.Sleep(time.Second * 5)
  155. }
  156. }
  157. // Proxy.setDefaults - sets all defaults of proxy listener
  158. func (p *ProxyServer) setDefaults() {
  159. p.setDefaultBodySize()
  160. p.setDefaultPort()
  161. }
  162. // Proxy.setDefaultPort - sets default port of Proxy listener if 0
  163. func (p *ProxyServer) setDefaultPort() {
  164. if p.Config.Port == 0 {
  165. p.Config.Port = defaultPort
  166. }
  167. }
  168. // Proxy.setDefaultBodySize - sets default body size of Proxy listener if 0
  169. func (p *ProxyServer) setDefaultBodySize() {
  170. if p.Config.BodySize == 0 {
  171. p.Config.BodySize = defaultBodySize
  172. }
  173. }