server.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package server
  2. import (
  3. "fmt"
  4. "log"
  5. "net"
  6. "time"
  7. "github.com/gravitl/netmaker/nm-proxy/common"
  8. "github.com/gravitl/netmaker/nm-proxy/packet"
  9. )
  10. var (
  11. NmProxyServer = &ProxyServer{}
  12. )
  13. const (
  14. defaultBodySize = 10000
  15. defaultPort = common.NmProxyPort
  16. )
  17. type Config struct {
  18. Port int
  19. BodySize int
  20. IsRelay bool
  21. Addr net.Addr
  22. }
  23. type ProxyServer struct {
  24. Config Config
  25. Server *net.UDPConn
  26. }
  27. // Proxy.Listen - begins listening for packets
  28. func (p *ProxyServer) Listen() {
  29. // Buffer with indicated body size
  30. buffer := make([]byte, 1532)
  31. for {
  32. // Read Packet
  33. n, source, err := p.Server.ReadFromUDP(buffer)
  34. if err != nil { // in future log errors?
  35. log.Println("RECV ERROR: ", err)
  36. continue
  37. }
  38. var srcPeerKeyHash, dstPeerKeyHash string
  39. n, srcPeerKeyHash, dstPeerKeyHash = packet.ExtractInfo(buffer, n)
  40. //log.Printf("--------> RECV PKT [DSTPORT: %d], [SRCKEYHASH: %s], SourceIP: [%s] \n", localWgPort, srcPeerKeyHash, source.IP.String())
  41. if common.IsRelay && dstPeerKeyHash != "" {
  42. if _, ok := common.WgIfaceKeyMap[dstPeerKeyHash]; !ok {
  43. log.Println("----------> Relaying######")
  44. // check for routing map and forward to right proxy
  45. if remoteMap, ok := common.RelayPeerMap[srcPeerKeyHash]; ok {
  46. if conf, ok := remoteMap[dstPeerKeyHash]; ok {
  47. log.Printf("--------> Relaying PKT [ SourceIP: %s:%d ], [ SourceKeyHash: %s ], [ DstIP: %s:%d ], [ DstHashKey: %s ] \n",
  48. source.IP.String(), source.Port, srcPeerKeyHash, conf.Endpoint.String(), conf.Endpoint.Port, dstPeerKeyHash)
  49. _, err = NmProxyServer.Server.WriteToUDP(buffer[:n+32], conf.Endpoint)
  50. if err != nil {
  51. log.Println("Failed to send to remote: ", err)
  52. }
  53. }
  54. }
  55. }
  56. }
  57. if peerInfo, ok := common.PeerKeyHashMap[srcPeerKeyHash]; ok {
  58. if peers, ok := common.WgIFaceMap[peerInfo.Interface]; ok {
  59. if peerI, ok := peers[peerInfo.PeerKey]; ok {
  60. log.Printf("PROXING TO LOCAL!!!---> %s <<<< %s <<<<<<<< %s [[ RECV PKT [SRCKEYHASH: %s], [DSTKEYHASH: %s], SourceIP: [%s] ]]\n",
  61. peerI.Proxy.LocalConn.RemoteAddr(), peerI.Proxy.LocalConn.LocalAddr(),
  62. fmt.Sprintf("%s:%d", source.IP.String(), source.Port), srcPeerKeyHash, dstPeerKeyHash, source.IP.String())
  63. _, err = peerI.Proxy.LocalConn.Write(buffer[:n])
  64. if err != nil {
  65. log.Println("Failed to proxy to Wg local interface: ", err)
  66. continue
  67. }
  68. }
  69. }
  70. }
  71. }
  72. }
  73. // Create - creats a proxy listener
  74. // port - port for proxy to listen on localhost
  75. // bodySize - default 10000, leave 0 to use default
  76. // addr - the address for proxy to listen on
  77. // forwards - indicate address to forward to, {"<address:port>",...} format
  78. func (p *ProxyServer) CreateProxyServer(port, bodySize int, addr string) (err error) {
  79. if p == nil {
  80. p = &ProxyServer{}
  81. }
  82. p.Config.Port = port
  83. p.Config.BodySize = bodySize
  84. p.setDefaults()
  85. p.Server, err = net.ListenUDP("udp", &net.UDPAddr{
  86. Port: p.Config.Port,
  87. IP: net.ParseIP(addr),
  88. })
  89. return
  90. }
  91. func (p *ProxyServer) KeepAlive(ip string, port int) {
  92. for {
  93. _, _ = p.Server.WriteToUDP([]byte("hello-proxy"), &net.UDPAddr{
  94. IP: net.ParseIP(ip),
  95. Port: port,
  96. })
  97. //log.Println("Sending MSg: ", ip, port, err)
  98. time.Sleep(time.Second * 5)
  99. }
  100. }
  101. // Proxy.setDefaults - sets all defaults of proxy listener
  102. func (p *ProxyServer) setDefaults() {
  103. p.setDefaultBodySize()
  104. p.setDefaultPort()
  105. }
  106. // Proxy.setDefaultPort - sets default port of Proxy listener if 0
  107. func (p *ProxyServer) setDefaultPort() {
  108. if p.Config.Port == 0 {
  109. p.Config.Port = defaultPort
  110. }
  111. }
  112. // Proxy.setDefaultBodySize - sets default body size of Proxy listener if 0
  113. func (p *ProxyServer) setDefaultBodySize() {
  114. if p.Config.BodySize == 0 {
  115. p.Config.BodySize = defaultBodySize
  116. }
  117. }