Browse Source

add upd addr fro remote peer connections

Abhishek Kondur 2 years ago
parent
commit
d0463628d1

+ 1 - 1
nm-proxy/common/common.go

@@ -59,7 +59,7 @@ type Proxy struct {
 	Cancel context.CancelFunc
 
 	Config     Config
-	RemoteConn net.Conn
+	RemoteConn *net.UDPAddr
 	LocalConn  net.Conn
 }
 

+ 49 - 13
nm-proxy/manager/manager.go

@@ -22,9 +22,9 @@ type ManagerPayload struct {
 }
 
 const (
-	AddInterface    ProxyAction = "ADD_INTERFACE"
-	DeleteInterface ProxyAction = "DELETE_INTERFACE"
-	UpdatePeer      ProxyAction = "UPDATE_PEER"
+	AddInterface ProxyAction = "ADD_INTERFACE"
+	DeletePeer   ProxyAction = "DELETE_PEER"
+	UpdatePeer   ProxyAction = "UPDATE_PEER"
 )
 
 type ManagerAction struct {
@@ -46,11 +46,14 @@ func StartProxyManager(manageChan chan *ManagerAction) {
 				}
 			case UpdatePeer:
 				mI.UpdatePeerProxy()
+			case DeletePeer:
+
 			}
 
 		}
 	}
 }
+
 func cleanUp(iface string) {
 	if peers, ok := common.WgIFaceMap[iface]; ok {
 		log.Println("########------------>  CLEANING UP: ", iface)
@@ -61,23 +64,52 @@ func cleanUp(iface string) {
 	delete(common.WgIFaceMap, iface)
 }
 
-func (m *ManagerAction) UpdatePeerProxy() error {
+func (m *ManagerAction) DeletePeers() {
+	if len(m.Payload.Peers) == 0 {
+		log.Println("No Peers to delete...")
+		return
+	}
+	peersMap, ok := common.WgIFaceMap[m.Payload.InterfaceName]
+	if !ok {
+		log.Println("interface not found: ", m.Payload.InterfaceName)
+		return
+	}
+
+	for _, peerI := range m.Payload.Peers {
+		if peerConf, ok := peersMap[peerI.PublicKey.String()]; ok {
+			peerConf.Proxy.Cancel()
+			delete(peersMap, peerI.PublicKey.String())
+		}
+	}
+	common.WgIFaceMap[m.Payload.InterfaceName] = peersMap
+}
+
+func (m *ManagerAction) UpdatePeerProxy() {
 	if len(m.Payload.Peers) == 0 {
 		log.Println("No Peers to add...")
-		return nil
+		return
+	}
+	peers, ok := common.WgIFaceMap[m.Payload.InterfaceName]
+	if !ok {
+		log.Println("interface not found: ", m.Payload.InterfaceName)
+		return
 	}
+
 	for _, peerI := range m.Payload.Peers {
-		if peers, ok := common.WgIFaceMap[m.Payload.InterfaceName]; ok {
-			if peerConf, ok := peers[peerI.PublicKey.String()]; ok {
+		if peerI.Endpoint == nil {
+			log.Println("Endpoint nil for peer: ", peerI.PublicKey.String())
+			continue
+		}
 
-				peerConf.Config.RemoteWgPort = peerI.Endpoint.Port
-				peers[peerI.PublicKey.String()] = peerConf
-				common.WgIFaceMap[m.Payload.InterfaceName] = peers
-				log.Printf("---->####### UPdated PEER: %+v\n", peerConf)
-			}
+		if peerConf, ok := peers[peerI.PublicKey.String()]; ok {
+
+			peerConf.Config.RemoteWgPort = peerI.Endpoint.Port
+			peers[peerI.PublicKey.String()] = peerConf
+			common.WgIFaceMap[m.Payload.InterfaceName] = peers
+			log.Printf("---->####### Updated PEER: %+v\n", peerConf)
 		}
 	}
-	return nil
+
 }
 
 func (m *ManagerAction) AddInterfaceToProxy() error {
@@ -106,6 +138,10 @@ func (m *ManagerAction) AddInterfaceToProxy() error {
 	log.Printf("wg: %+v\n", wgInterface)
 
 	for _, peerI := range m.Payload.Peers {
+		if peerI.Endpoint == nil {
+			log.Println("Endpoint nil for peer: ", peerI.PublicKey.String())
+			continue
+		}
 		common.PeerKeyHashMap[fmt.Sprintf("%x", md5.Sum([]byte(peerI.PublicKey.String())))] = common.RemotePeer{
 			Interface: ifaceName,
 			PeerKey:   peerI.PublicKey.String(),

+ 2 - 2
nm-proxy/peer/peer.go

@@ -41,11 +41,11 @@ func AddNewPeer(wgInterface *wg.WGIface, peer *wgtypes.PeerConfig) error {
 		AllowedIps:  peer.AllowedIPs,
 	}
 	p := proxy.NewProxy(c)
-	remoteConn, err := net.Dial("udp", fmt.Sprintf("%s:%d", peer.Endpoint.IP.String(), common.NmProxyPort))
+	remoteConn, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", peer.Endpoint.IP.String(), common.NmProxyPort))
 	if err != nil {
 		return err
 	}
-	log.Printf("----> Established Remote Conn with RPeer: %s, LAddr: %s ----> RAddr: %s", peer.PublicKey, remoteConn.LocalAddr().String(), remoteConn.RemoteAddr().String())
+	log.Printf("----> Established Remote Conn with RPeer: %s, ----> RAddr: %s", peer.PublicKey, remoteConn.String())
 	log.Printf("Starting proxy for Peer: %s\n", peer.PublicKey.String())
 	err = p.Start(remoteConn)
 	if err != nil {

+ 1 - 1
nm-proxy/proxy/proxy.go

@@ -32,7 +32,7 @@ type Proxy struct {
 	Cancel context.CancelFunc
 
 	Config     Config
-	RemoteConn net.Conn
+	RemoteConn *net.UDPAddr
 	LocalConn  net.Conn
 }
 

+ 4 - 10
nm-proxy/proxy/wireguard.go

@@ -7,7 +7,6 @@ import (
 	"log"
 	"net"
 	"runtime"
-	"strconv"
 	"strings"
 
 	"github.com/c-robinson/iplib"
@@ -30,7 +29,6 @@ func (p *Proxy) ProxyToRemote() {
 	go func() {
 		<-p.Ctx.Done()
 		defer p.LocalConn.Close()
-		defer p.RemoteConn.Close()
 	}()
 	for {
 		select {
@@ -70,13 +68,9 @@ func (p *Proxy) ProxyToRemote() {
 				log.Printf("Peer: %s not found in config\n", p.Config.RemoteKey)
 			}
 			// test(n, buf)
-			log.Printf("PROXING TO REMOTE!!!---> %s >>>>> %s\n", server.NmProxyServer.Server.LocalAddr().String(), p.RemoteConn.RemoteAddr().String())
-			host, port, _ := net.SplitHostPort(p.RemoteConn.RemoteAddr().String())
-			portInt, _ := strconv.Atoi(port)
-			_, err = server.NmProxyServer.Server.WriteToUDP(buf[:n], &net.UDPAddr{
-				IP:   net.ParseIP(host),
-				Port: portInt,
-			})
+			log.Printf("PROXING TO REMOTE!!!---> %s >>>>> %s\n", server.NmProxyServer.Server.LocalAddr().String(), p.RemoteConn.String())
+
+			_, err = server.NmProxyServer.Server.WriteToUDP(buf[:n], p.RemoteConn)
 			if err != nil {
 				log.Println("Failed to send to remote: ", err)
 			}
@@ -100,7 +94,7 @@ func (p *Proxy) updateEndpoint() error {
 	return nil
 }
 
-func (p *Proxy) Start(remoteConn net.Conn) error {
+func (p *Proxy) Start(remoteConn *net.UDPAddr) error {
 	p.RemoteConn = remoteConn
 
 	var err error

+ 10 - 10
nm-proxy/server/server.go

@@ -50,20 +50,20 @@ func (p *ProxyServer) Listen() {
 			log.Println("failed to extract info: ", err)
 			continue
 		}
-		log.Printf("--------> RECV PKT [DSTPORT: %d], [SRCKEYHASH: %s] \n", localWgPort, srcPeerKeyHash)
+		log.Printf("--------> RECV PKT [DSTPORT: %d], [SRCKEYHASH: %s], SourceIP: [%s] \n", localWgPort, srcPeerKeyHash, source.IP.String())
 		if peerInfo, ok := common.PeerKeyHashMap[srcPeerKeyHash]; ok {
 			if peers, ok := common.WgIFaceMap[peerInfo.Interface]; ok {
 				if peerI, ok := peers[peerInfo.PeerKey]; 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
-						}
-
+					// 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
 					}
+
+					// }
 				}
 			}
 

+ 3 - 7
nm-proxy/stun/stun.go

@@ -7,6 +7,7 @@ import (
 	"strconv"
 	"strings"
 
+	"github.com/gravitl/netmaker/nm-proxy/common"
 	"gortc.io/stun"
 )
 
@@ -23,11 +24,11 @@ func GetHostInfo() (info HostInfo) {
 
 	s, err := net.ResolveUDPAddr("udp", "stun.nm.134.209.115.146.nip.io:3478")
 	if err != nil {
-		log.Fatal("Resolve: ", err)
+		log.Println("Resolve: ", err)
 	}
 	l := &net.UDPAddr{
 		IP:   net.ParseIP(""),
-		Port: 51722,
+		Port: common.NmProxyPort,
 	}
 	conn, err := net.DialUDP("udp", l, s)
 	if err != nil {
@@ -45,10 +46,8 @@ func GetHostInfo() (info HostInfo) {
 	info.PrivPort, _ = strconv.Atoi(re[1])
 	// Building binding request with random transaction id.
 	message := stun.MustBuild(stun.TransactionID, stun.BindingRequest)
-	//fmt.Printf("MESG: %+v\n", message)
 	// Sending request to STUN server, waiting for response message.
 	if err := c.Do(message, func(res stun.Event) {
-		//fmt.Printf("RESP: %+v\n", res)
 		if res.Error != nil {
 			panic(res.Error)
 		}
@@ -64,6 +63,3 @@ func GetHostInfo() (info HostInfo) {
 	}
 	return
 }
-
-// /tmp/netclient daemon > /tmp/netclient.out 2>&1
-// tcpdump -evvvttttni any 'udp port 51820'