add proxy to netmaker server

This commit is contained in:
Abhishek Kondur
2022-10-28 17:02:22 +05:30
parent 12294c51e2
commit 31a7e73473
5 changed files with 113 additions and 1 deletions

View File

@@ -19,6 +19,45 @@ import (
"golang.zx2c4.com/wireguard/wgctrl/wgtypes" "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 // GetPeerUpdate - gets a wireguard peer config for each peer of a node
func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) { func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) {
var peerUpdate models.PeerUpdate var peerUpdate models.PeerUpdate

View File

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

View File

@@ -9,6 +9,7 @@ import (
"github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/models"
"github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/netclient/ncutils"
"github.com/gravitl/netmaker/netclient/wireguard" "github.com/gravitl/netmaker/netclient/wireguard"
"github.com/gravitl/netmaker/nm-proxy/manager"
"golang.zx2c4.com/wireguard/wgctrl" "golang.zx2c4.com/wireguard/wgctrl"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes" "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) err = wireguard.InitWireguard(node, privkey, peers.Peers)
logger.Log(3, "finished setting wg config on server", node.Name) 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 return err
} }

View File

@@ -23,6 +23,7 @@ import (
"github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/models"
"github.com/gravitl/netmaker/mq" "github.com/gravitl/netmaker/mq"
"github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/netclient/ncutils"
nmproxy "github.com/gravitl/netmaker/nm-proxy"
"github.com/gravitl/netmaker/servercfg" "github.com/gravitl/netmaker/servercfg"
"github.com/gravitl/netmaker/serverctl" "github.com/gravitl/netmaker/serverctl"
stunserver "github.com/gravitl/netmaker/stun-server" stunserver "github.com/gravitl/netmaker/stun-server"
@@ -173,7 +174,13 @@ func startControllers() {
} }
// starts the stun server // starts the stun server
go stunserver.Start() 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() waitnetwork.Wait()
} }

View File

@@ -12,6 +12,7 @@ import (
"github.com/gravitl/netmaker/logic/acls/nodeacls" "github.com/gravitl/netmaker/logic/acls/nodeacls"
"github.com/gravitl/netmaker/logic/pro" "github.com/gravitl/netmaker/logic/pro"
"github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/netclient/ncutils"
"github.com/gravitl/netmaker/nm-proxy/manager"
"github.com/gravitl/netmaker/servercfg" "github.com/gravitl/netmaker/servercfg"
) )
@@ -55,6 +56,50 @@ func InitServerNetclient() error {
return nil 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 // SyncServerNetwork - ensures a wg interface and node exists for server
func SyncServerNetwork(network string) error { func SyncServerNetwork(network string) error {
serverNetworkSettings, err := logic.GetNetwork(network) serverNetworkSettings, err := logic.GetNetwork(network)