Browse Source

configure proxy on node updates

Abhishek Kondur 2 years ago
parent
commit
474bd14e36
5 changed files with 29 additions and 5 deletions
  1. 3 3
      go.mod
  2. 1 1
      logic/peers.go
  3. 1 0
      logic/wireguard.go
  4. 23 0
      mq/handlers.go
  5. 1 1
      nm-proxy/nm-proxy.go

+ 3 - 3
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
 )

+ 1 - 1
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

+ 1 - 0
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 ||

+ 23 - 0
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(&currentNode, 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)
 	}()

+ 1 - 1
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()