mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-05 16:57:51 +08:00
add proxy to netmaker server
This commit is contained in:
@@ -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
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
9
main.go
9
main.go
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user