proxy.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package proxy
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "log"
  7. "net"
  8. "time"
  9. "github.com/google/gopacket"
  10. "github.com/google/gopacket/layers"
  11. "github.com/google/gopacket/pcap"
  12. "github.com/gravitl/netmaker/nm-proxy/common"
  13. "github.com/gravitl/netmaker/nm-proxy/wg"
  14. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  15. )
  16. const (
  17. defaultBodySize = 10000
  18. defaultPort = 51722
  19. )
  20. type Config struct {
  21. Port int
  22. BodySize int
  23. Addr string
  24. RemoteKey string
  25. LocalKey string
  26. WgInterface *wg.WGIface
  27. AllowedIps []net.IPNet
  28. PreSharedKey *wgtypes.Key
  29. }
  30. // Proxy - WireguardProxy proxies
  31. type Proxy struct {
  32. Ctx context.Context
  33. Cancel context.CancelFunc
  34. Config Config
  35. RemoteConn *net.UDPAddr
  36. LocalConn net.Conn
  37. }
  38. func GetInterfaceIpv4Addr(interfaceName string) (addr string, err error) {
  39. var (
  40. ief *net.Interface
  41. addrs []net.Addr
  42. ipv4Addr net.IP
  43. )
  44. if ief, err = net.InterfaceByName(interfaceName); err != nil { // get interface
  45. return
  46. }
  47. if addrs, err = ief.Addrs(); err != nil { // get addresses
  48. return
  49. }
  50. for _, addr := range addrs { // get ipv4 address
  51. if ipv4Addr = addr.(*net.IPNet).IP.To4(); ipv4Addr != nil {
  52. break
  53. }
  54. }
  55. if ipv4Addr == nil {
  56. return "", errors.New(fmt.Sprintf("interface %s don't have an ipv4 address\n", interfaceName))
  57. }
  58. return ipv4Addr.String(), nil
  59. }
  60. func GetInterfaceListenAddr(port int) (*net.UDPAddr, error) {
  61. locallistenAddr := "127.0.0.1"
  62. udpAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", locallistenAddr, port))
  63. if err != nil {
  64. return udpAddr, err
  65. }
  66. if !common.IsHostNetwork {
  67. addrs, err := getBoardCastAddress()
  68. if err != nil {
  69. return udpAddr, err
  70. }
  71. for _, addr := range addrs {
  72. if liAddr := addr.(*net.IPNet).IP; liAddr != nil {
  73. udpAddr.IP = liAddr
  74. break
  75. }
  76. }
  77. }
  78. return udpAddr, nil
  79. }
  80. func getBoardCastAddress() ([]net.Addr, error) {
  81. localnets, err := net.Interfaces()
  82. if err != nil {
  83. return nil, err
  84. }
  85. var (
  86. ief net.Interface
  87. addrs []net.Addr
  88. )
  89. for _, ief = range localnets {
  90. if ief.Flags&net.FlagBroadcast != 0 && ief.Flags&net.FlagUp != 0 {
  91. addrs, err = ief.Addrs()
  92. if err == nil {
  93. return addrs, nil
  94. }
  95. }
  96. }
  97. return nil, errors.New("couldn't obtain the broadcast addr")
  98. }
  99. func StartSniffer(ctx context.Context, ifaceName, extClientAddr string, port int) {
  100. log.Println("Starting Packet Sniffer for iface: ", ifaceName)
  101. var (
  102. snapshotLen int32 = 1024
  103. promiscuous bool = false
  104. err error
  105. timeout time.Duration = 1 * time.Microsecond
  106. handle *pcap.Handle
  107. )
  108. // Open device
  109. handle, err = pcap.OpenLive(ifaceName, snapshotLen, promiscuous, timeout)
  110. if err != nil {
  111. log.Println("failed to start sniffer for iface: ", ifaceName, err)
  112. return
  113. }
  114. // if err := handle.SetBPFFilter(fmt.Sprintf("src %s and port %d", extClientAddr, port)); err != nil {
  115. // log.Println("failed to set bpf filter: ", err)
  116. // return
  117. // }
  118. defer handle.Close()
  119. // var tcp layers.TCP
  120. // var icmp layers.ICMPv4
  121. // var udp layers.UDP
  122. // parser := gopacket.NewDecodingLayerParser(layers.LayerTypeIPv4, &udp, &tcp, &icmp)
  123. packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
  124. for {
  125. select {
  126. case <-ctx.Done():
  127. log.Println("Stopping packet sniffer for iface: ", ifaceName, " port: ", port)
  128. return
  129. default:
  130. packet, err := packetSource.NextPacket()
  131. if err == nil {
  132. //processPkt(ifaceName, packet)
  133. ipLayer := packet.Layer(layers.LayerTypeIPv4)
  134. if ipLayer != nil {
  135. fmt.Println("IPv4 layer detected.")
  136. ip, _ := ipLayer.(*layers.IPv4)
  137. // IP layer variables:
  138. // Version (Either 4 or 6)
  139. // IHL (IP Header Length in 32-bit words)
  140. // TOS, Length, Id, Flags, FragOffset, TTL, Protocol (TCP?),
  141. // Checksum, SrcIP, DstIP
  142. fmt.Println("#########################")
  143. fmt.Printf("From %s to %s\n", ip.SrcIP, ip.DstIP)
  144. fmt.Println("Protocol: ", ip.Protocol)
  145. if ip.DstIP.String() == extClientAddr || ip.SrcIP.String() == extClientAddr {
  146. if ifacePeers, ok := common.PeerAddrMap[ifaceName]; ok {
  147. if peerConf, ok := ifacePeers[ip.DstIP.String()]; ok {
  148. log.Println("-----> Fowarding PKT From ExtClient: ", extClientAddr, " to: ", peerConf)
  149. //server.NmProxyServer.Server.WriteTo(packet.Data(), )
  150. }
  151. }
  152. }
  153. fmt.Println("#########################")
  154. }
  155. }
  156. }
  157. }
  158. }
  159. func processPkt(iface string, packet gopacket.Packet) {
  160. // Let's see if the packet is an ethernet packet
  161. // ethernetLayer := packet.Layer(layers.LayerTypeEthernet)
  162. // if ethernetLayer != nil {
  163. // fmt.Println("Ethernet layer detected.")
  164. // ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)
  165. // fmt.Println("Source MAC: ", ethernetPacket.SrcMAC)
  166. // fmt.Println("Destination MAC: ", ethernetPacket.DstMAC)
  167. // // Ethernet type is typically IPv4 but could be ARP or other
  168. // fmt.Println("Ethernet type: ", ethernetPacket.EthernetType)
  169. // fmt.Println()
  170. // }
  171. // Let's see if the packet is IP (even though the ether type told us)
  172. ipLayer := packet.Layer(layers.LayerTypeIPv4)
  173. if ipLayer != nil {
  174. fmt.Println("IPv4 layer detected.")
  175. ip, _ := ipLayer.(*layers.IPv4)
  176. // IP layer variables:
  177. // Version (Either 4 or 6)
  178. // IHL (IP Header Length in 32-bit words)
  179. // TOS, Length, Id, Flags, FragOffset, TTL, Protocol (TCP?),
  180. // Checksum, SrcIP, DstIP
  181. fmt.Printf("From %s to %s\n", ip.SrcIP, ip.DstIP)
  182. fmt.Println("Protocol: ", ip.Protocol)
  183. fmt.Println()
  184. }
  185. // udpLayer := packet.Layer(layers.LayerTypeUDP)
  186. // if udpLayer != nil {
  187. // udp, _ := udpLayer.(*layers.UDP)
  188. // fmt.Printf("UDP: From port %d to %d\n", udp.SrcPort, udp.DstPort)
  189. // fmt.Println()
  190. // }
  191. // // Iterate over all layers, printing out each layer type
  192. // fmt.Println("All packet layers:")
  193. // for _, layer := range packet.Layers() {
  194. // fmt.Println("- ", layer.LayerType())
  195. // }
  196. // When iterating through packet.Layers() above,
  197. // if it lists Payload layer then that is the same as
  198. // this applicationLayer. applicationLayer contains the payload
  199. // applicationLayer := packet.ApplicationLayer()
  200. // if applicationLayer != nil {
  201. // fmt.Println("Application layer/Payload found.")
  202. // fmt.Printf("%s\n", applicationLayer.Payload())
  203. // // Search for a string inside the payload
  204. // if strings.Contains(string(applicationLayer.Payload()), "HTTP") {
  205. // fmt.Println("HTTP found!")
  206. // }
  207. // }
  208. // Check for errors
  209. if err := packet.ErrorLayer(); err != nil {
  210. fmt.Println("Error decoding some part of the packet:", err)
  211. }
  212. }