Browse Source

add proxy to netmaker server

Abhishek Kondur 2 years ago
parent
commit
31a7e73473
5 changed files with 113 additions and 1 deletions
  1. 39 0
      logic/peers.go
  2. 11 0
      logic/server.go
  3. 10 0
      logic/wireguard.go
  4. 8 1
      main.go
  5. 45 0
      serverctl/serverctl.go

+ 39 - 0
logic/peers.go

@@ -19,6 +19,45 @@ import (
 	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
 )
 
+func GetPeersForProxy(node *models.Node) ([]wgtypes.PeerConfig, error) {
+	var peers []wgtypes.PeerConfig
+	var err error
+	currentPeers, err := GetNetworkNodes(node.Network)
+	if err != nil {
+		return peers, err
+	}
+	for _, peer := range currentPeers {
+		if peer.ID == node.ID {
+			//skip yourself
+			continue
+		}
+		pubkey, err := wgtypes.ParseKey(peer.PublicKey)
+		if err != nil {
+			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))
+		if err != nil {
+			logger.Log(1, "failed to resolve udp addr for node: ", peer.ID, peer.Endpoint, err.Error())
+			continue
+		}
+		allowedips := getNodeAllowedIPs(node, &peer)
+		var keepalive time.Duration
+		if node.PersistentKeepalive != 0 {
+			// set_keepalive
+			keepalive, _ = time.ParseDuration(strconv.FormatInt(int64(node.PersistentKeepalive), 10) + "s")
+		}
+		peers = append(peers, wgtypes.PeerConfig{
+			PublicKey:                   pubkey,
+			Endpoint:                    endpoint,
+			AllowedIPs:                  allowedips,
+			PersistentKeepaliveInterval: &keepalive,
+			ReplaceAllowedIPs:           true,
+		})
+	}
+	return peers, nil
+}
+
 // GetPeerUpdate - gets a wireguard peer config for each peer of a node
 func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) {
 	var peerUpdate models.PeerUpdate

+ 11 - 0
logic/server.go

@@ -14,10 +14,14 @@ import (
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/netclient/wireguard"
+	"github.com/gravitl/netmaker/nm-proxy/manager"
 	"github.com/gravitl/netmaker/servercfg"
 	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
 )
 
+var ProxyStatus = "OFF"
+var ProxyMgmChan = make(chan *manager.ManagerAction, 100)
+
 // EnterpriseCheckFuncs - can be set to run functions for EE
 var EnterpriseCheckFuncs []func()
 
@@ -173,6 +177,13 @@ func ServerJoin(networkSettings *models.Network) (models.Node, error) {
 		return returnNode, err
 	}
 
+	ProxyMgmChan <- &manager.ManagerAction{
+		Action: manager.AddInterface,
+		Payload: manager.ManagerPayload{
+			InterfaceName: node.Interface,
+			Peers:         peers.Peers,
+		},
+	}
 	return *node, nil
 }
 

+ 10 - 0
logic/wireguard.go

@@ -9,6 +9,7 @@ import (
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/netclient/wireguard"
+	"github.com/gravitl/netmaker/nm-proxy/manager"
 	"golang.zx2c4.com/wireguard/wgctrl"
 	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
 )
@@ -143,6 +144,15 @@ func setWGConfig(node *models.Node, peerupdate bool) error {
 		err = wireguard.InitWireguard(node, privkey, peers.Peers)
 		logger.Log(3, "finished setting wg config on server", node.Name)
 	}
+	if ProxyStatus == "ON" {
+		ProxyMgmChan <- &manager.ManagerAction{
+			Action: manager.AddInterface,
+			Payload: manager.ManagerPayload{
+				InterfaceName: node.Interface,
+				Peers:         peers.Peers,
+			},
+		}
+	}
 	return err
 }
 

+ 8 - 1
main.go

@@ -23,6 +23,7 @@ import (
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/mq"
 	"github.com/gravitl/netmaker/netclient/ncutils"
+	nmproxy "github.com/gravitl/netmaker/nm-proxy"
 	"github.com/gravitl/netmaker/servercfg"
 	"github.com/gravitl/netmaker/serverctl"
 	stunserver "github.com/gravitl/netmaker/stun-server"
@@ -173,7 +174,13 @@ func startControllers() {
 	}
 	// starts the stun server
 	go stunserver.Start()
-
+	go nmproxy.Start(logic.ProxyMgmChan)
+	go func() {
+		err := serverctl.SyncServerNetworkWithProxy()
+		if err != nil {
+			logger.Log(0, "failed to sync proxy with server interfaces: ", err.Error())
+		}
+	}()
 	waitnetwork.Wait()
 }
 

+ 45 - 0
serverctl/serverctl.go

@@ -12,6 +12,7 @@ import (
 	"github.com/gravitl/netmaker/logic/acls/nodeacls"
 	"github.com/gravitl/netmaker/logic/pro"
 	"github.com/gravitl/netmaker/netclient/ncutils"
+	"github.com/gravitl/netmaker/nm-proxy/manager"
 	"github.com/gravitl/netmaker/servercfg"
 )
 
@@ -55,6 +56,50 @@ func InitServerNetclient() error {
 	return nil
 }
 
+func SyncServerNetworkWithProxy() error {
+	networks, err := logic.GetNetworks()
+	if err != nil {
+		logger.Log(1, "error retrieving networks for keepalive", err.Error())
+	}
+	for _, network := range networks {
+		serverNetworkSettings, err := logic.GetNetwork(network.NetID)
+		if err != nil {
+			continue
+		}
+		localnets, err := net.Interfaces()
+		if err != nil {
+			return err
+		}
+		ifaceExists := false
+		for _, localnet := range localnets {
+			if serverNetworkSettings.DefaultInterface == localnet.Name {
+				ifaceExists = true
+			}
+		}
+		if ifaceExists {
+			serverNode, err := logic.GetNetworkServerLocal(network.NetID)
+			if err != nil {
+				logger.Log(1, "failed to retrieve local server node: ", serverNode.ID)
+				continue
+			}
+			peers, err := logic.GetPeersForProxy(&serverNode)
+			if err != nil && !ncutils.IsEmptyRecord(err) {
+				logger.Log(1, "failed to retrieve peers for server node: ", serverNode.ID)
+				continue
+			}
+			logic.ProxyMgmChan <- &manager.ManagerAction{
+				Action: manager.AddInterface,
+				Payload: manager.ManagerPayload{
+					InterfaceName: serverNetworkSettings.DefaultInterface,
+					Peers:         peers,
+				},
+			}
+		}
+
+	}
+	return nil
+}
+
 // SyncServerNetwork - ensures a wg interface and node exists for server
 func SyncServerNetwork(network string) error {
 	serverNetworkSettings, err := logic.GetNetwork(network)