123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package server
- import (
- "fmt"
- "log"
- "net"
- "time"
- "github.com/gravitl/netmaker/netclient/netclient-proxy/common"
- "github.com/gravitl/netmaker/netclient/netclient-proxy/packet"
- )
- const (
- defaultBodySize = 10000
- defaultPort = 51722
- )
- type Config struct {
- Port int
- BodySize int
- Addr net.Addr
- LocalWgInterfaces []string
- }
- type ProxyServer struct {
- Config Config
- Server *net.UDPConn
- }
- // Proxy.Listen - begins listening for packets
- func (p *ProxyServer) Listen() {
- // Buffer with indicated body size
- buffer := make([]byte, 1502)
- for {
- // Read Packet
- n, source, err := p.Server.ReadFromUDP(buffer)
- if err != nil { // in future log errors?
- log.Println("RECV ERROR: ", err)
- continue
- }
- var localWgPort int
- localWgPort, n, err = packet.ExtractInfo(buffer, n)
- if err != nil {
- log.Println("failed to extract info: ", err)
- continue
- }
- log.Println("--------> RECV PKT: ", source.IP.String(), localWgPort)
- if val, ok := common.RemoteEndpointsMap[source.IP.String()]; ok {
- for _, peerKeys := range val {
- if peerI, ok := common.Peers[peerKeys]; ok {
- if peerI.Config.LocalWgPort == int(localWgPort) {
- log.Printf("PROXING TO LOCAL!!!---> %s <<<< %s <<<<<<<< %s\n", peerI.Proxy.LocalConn.RemoteAddr(),
- peerI.Proxy.LocalConn.LocalAddr(), fmt.Sprintf("%s:%d", source.IP.String(), source.Port))
- _, err = peerI.Proxy.LocalConn.Write(buffer[:n])
- if err != nil {
- log.Println("Failed to proxy to Wg local interface: ", err)
- continue
- }
- }
- }
- }
- }
- }
- }
- // Create - creats a proxy listener
- // port - port for proxy to listen on localhost
- // bodySize - default 10000, leave 0 to use default
- // addr - the address for proxy to listen on
- // forwards - indicate address to forward to, {"<address:port>",...} format
- func CreateProxyServer(port, bodySize int, addr string) (p *ProxyServer, err error) {
- if p == nil {
- p = &ProxyServer{}
- }
- p.Config.Port = port
- p.Config.BodySize = bodySize
- p.setDefaults()
- p.Server, err = net.ListenUDP("udp", &net.UDPAddr{
- Port: p.Config.Port,
- IP: net.ParseIP(addr),
- })
- return
- }
- func (p *ProxyServer) KeepAlive(ip string, port int) {
- for {
- _, _ = p.Server.Write([]byte("hello-proxy"))
- //fmt.Println("Sending MSg: ", err)
- time.Sleep(time.Second)
- }
- }
- // Proxy.setDefaults - sets all defaults of proxy listener
- func (p *ProxyServer) setDefaults() {
- p.setDefaultBodySize()
- p.setDefaultPort()
- }
- // Proxy.setDefaultPort - sets default port of Proxy listener if 0
- func (p *ProxyServer) setDefaultPort() {
- if p.Config.Port == 0 {
- p.Config.Port = defaultPort
- }
- }
- // Proxy.setDefaultBodySize - sets default body size of Proxy listener if 0
- func (p *ProxyServer) setDefaultBodySize() {
- if p.Config.BodySize == 0 {
- p.Config.BodySize = defaultBodySize
- }
- }
|