From 474bd14e36a63f8c9997c6e265076d5c5e9e6d13 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Mon, 31 Oct 2022 10:32:04 +0530 Subject: [PATCH] configure proxy on node updates --- go.mod | 6 +++--- logic/peers.go | 2 +- logic/wireguard.go | 1 + mq/handlers.go | 23 +++++++++++++++++++++++ nm-proxy/nm-proxy.go | 2 +- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 644b5a1a..4be19d1f 100644 --- a/go.mod +++ b/go.mod @@ -42,8 +42,11 @@ require ( require ( github.com/coreos/go-oidc/v3 v3.4.0 github.com/gorilla/websocket v1.5.0 + github.com/pkg/errors v0.9.1 + github.com/sirupsen/logrus v1.9.0 golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 + gortc.io/stun v1.23.0 ) require ( @@ -82,11 +85,9 @@ require ( github.com/mdlayher/socket v0.1.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/afero v1.9.2 // indirect github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 // indirect github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 // indirect @@ -100,6 +101,5 @@ require ( google.golang.org/appengine v1.6.7 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gortc.io/stun v1.23.0 // indirect honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect ) diff --git a/logic/peers.go b/logic/peers.go index 42652271..2f823687 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -36,7 +36,7 @@ func GetPeersForProxy(node *models.Node) ([]wgtypes.PeerConfig, error) { logger.Log(1, "failed to parse node pub key: ", peer.ID) continue } - endpoint, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", node.Endpoint, node.ListenPort)) + endpoint, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", peer.Endpoint, peer.LocalListenPort)) if err != nil { logger.Log(1, "failed to resolve udp addr for node: ", peer.ID, peer.Endpoint, err.Error()) continue diff --git a/logic/wireguard.go b/logic/wireguard.go index 3120734b..7f6f19c5 100644 --- a/logic/wireguard.go +++ b/logic/wireguard.go @@ -56,6 +56,7 @@ func IfaceDelta(currentNode *models.Node, newNode *models.Node) bool { newNode.UDPHolePunch != currentNode.UDPHolePunch || newNode.IsPending != currentNode.IsPending || newNode.ListenPort != currentNode.ListenPort || + newNode.LocalListenPort != currentNode.LocalListenPort || newNode.MTU != currentNode.MTU || newNode.PersistentKeepalive != currentNode.PersistentKeepalive || newNode.DNSOn != currentNode.DNSOn || diff --git a/mq/handlers.go b/mq/handlers.go index a4b77bf4..532fce95 100644 --- a/mq/handlers.go +++ b/mq/handlers.go @@ -3,6 +3,7 @@ package mq import ( "encoding/json" "fmt" + "net" "time" mqtt "github.com/eclipse/paho.mqtt.golang" @@ -11,7 +12,9 @@ import ( "github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/netclient/ncutils" + "github.com/gravitl/netmaker/nm-proxy/manager" "github.com/gravitl/netmaker/servercfg" + "golang.zx2c4.com/wireguard/wgctrl/wgtypes" ) // DefaultHandler default message queue handler -- NOT USED @@ -101,6 +104,26 @@ func UpdateNode(client mqtt.Client, msg mqtt.Message) { if err = PublishPeerUpdate(¤tNode, true); err != nil { logger.Log(0, "error updating peers when node", currentNode.Name, currentNode.ID, "informed the server of an interface change", err.Error()) } + pubKey, err := wgtypes.ParseKey(newNode.PublicKey) + if err == nil { + endpoint, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", newNode.Endpoint, newNode.LocalListenPort)) + if err == nil { + logic.ProxyMgmChan <- &manager.ManagerAction{ + Action: manager.UpdatePeer, + Payload: manager.ManagerPayload{ + InterfaceName: newNode.Interface, + Peers: []wgtypes.PeerConfig{ + { + PublicKey: pubKey, + Endpoint: endpoint, + }, + }, + }, + } + } + + } + } logger.Log(1, "updated node", id, newNode.Name) }() diff --git a/nm-proxy/nm-proxy.go b/nm-proxy/nm-proxy.go index 96eb7b02..618b13e5 100644 --- a/nm-proxy/nm-proxy.go +++ b/nm-proxy/nm-proxy.go @@ -15,7 +15,7 @@ import ( 2. Delete - remove close all conns for the interface,cleanup */ -func Start(mgmChan chan *manager.ManagerAction, isServer bool) { +func Start(mgmChan chan *manager.ManagerAction) { log.Println("Starting Proxy...") go manager.StartProxyManager(mgmChan) hInfo := stun.GetHostInfo()