|
@@ -105,15 +105,11 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
// track which nodes are deleted
|
|
// track which nodes are deleted
|
|
// after peer calculation, if peer not in list, add delete config of peer
|
|
// after peer calculation, if peer not in list, add delete config of peer
|
|
hostPeerUpdate := models.HostPeerUpdate{
|
|
hostPeerUpdate := models.HostPeerUpdate{
|
|
- Host: *host,
|
|
|
|
- Server: servercfg.GetServer(),
|
|
|
|
- HostPeerIDs: make(models.HostPeerMap, 0),
|
|
|
|
- ServerVersion: servercfg.GetVersion(),
|
|
|
|
- ServerAddrs: []models.ServerAddr{},
|
|
|
|
- IngressInfo: models.IngressInfo{
|
|
|
|
- ExtPeers: make(map[string]models.ExtClientInfo),
|
|
|
|
- },
|
|
|
|
- EgressInfo: make(map[string]models.EgressInfo),
|
|
|
|
|
|
+ Host: *host,
|
|
|
|
+ Server: servercfg.GetServer(),
|
|
|
|
+ HostPeerIDs: make(models.HostPeerMap, 0),
|
|
|
|
+ ServerVersion: servercfg.GetVersion(),
|
|
|
|
+ ServerAddrs: []models.ServerAddr{},
|
|
PeerIDs: make(models.PeerMap, 0),
|
|
PeerIDs: make(models.PeerMap, 0),
|
|
Peers: []wgtypes.PeerConfig{},
|
|
Peers: []wgtypes.PeerConfig{},
|
|
NodePeers: []wgtypes.PeerConfig{},
|
|
NodePeers: []wgtypes.PeerConfig{},
|
|
@@ -132,10 +128,6 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
currentPeers := GetNetworkNodesMemory(allNodes, node.Network)
|
|
currentPeers := GetNetworkNodesMemory(allNodes, node.Network)
|
|
- var nodePeerMap map[string]models.PeerRouteInfo
|
|
|
|
- if node.IsIngressGateway || node.IsEgressGateway {
|
|
|
|
- nodePeerMap = make(map[string]models.PeerRouteInfo)
|
|
|
|
- }
|
|
|
|
for _, peer := range currentPeers {
|
|
for _, peer := range currentPeers {
|
|
select {
|
|
select {
|
|
case <-ctx.Done():
|
|
case <-ctx.Done():
|
|
@@ -210,39 +202,6 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
peerConfig.AllowedIPs = allowedips // only append allowed IPs if valid connection
|
|
peerConfig.AllowedIPs = allowedips // only append allowed IPs if valid connection
|
|
}
|
|
}
|
|
|
|
|
|
- if node.IsIngressGateway || node.IsEgressGateway {
|
|
|
|
- if peer.IsIngressGateway {
|
|
|
|
- _, extPeerIDAndAddrs, err := GetExtPeers(&peer)
|
|
|
|
- if err == nil {
|
|
|
|
- for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
|
|
|
|
- extPeerIdAndAddr := extPeerIdAndAddr
|
|
|
|
- nodePeerMap[extPeerIdAndAddr.ID] = models.PeerRouteInfo{
|
|
|
|
- PeerAddr: net.IPNet{
|
|
|
|
- IP: net.ParseIP(extPeerIdAndAddr.Address),
|
|
|
|
- Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
|
|
|
|
- },
|
|
|
|
- PeerKey: extPeerIdAndAddr.ID,
|
|
|
|
- Allow: true,
|
|
|
|
- ID: extPeerIdAndAddr.ID,
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if node.IsIngressGateway && peer.IsEgressGateway {
|
|
|
|
- hostPeerUpdate.IngressInfo.EgressRanges = append(hostPeerUpdate.IngressInfo.EgressRanges,
|
|
|
|
- peer.EgressGatewayRanges...)
|
|
|
|
- }
|
|
|
|
- nodePeerMap[peerHost.PublicKey.String()] = models.PeerRouteInfo{
|
|
|
|
- PeerAddr: net.IPNet{
|
|
|
|
- IP: net.ParseIP(peer.PrimaryAddress()),
|
|
|
|
- Mask: getCIDRMaskFromAddr(peer.PrimaryAddress()),
|
|
|
|
- },
|
|
|
|
- PeerKey: peerHost.PublicKey.String(),
|
|
|
|
- Allow: true,
|
|
|
|
- ID: peer.ID.String(),
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
peerProxyPort := GetProxyListenPort(peerHost)
|
|
peerProxyPort := GetProxyListenPort(peerHost)
|
|
var nodePeer wgtypes.PeerConfig
|
|
var nodePeer wgtypes.PeerConfig
|
|
if _, ok := hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()]; !ok {
|
|
if _, ok := hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()]; !ok {
|
|
@@ -296,18 +255,6 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
if node.IsIngressGateway {
|
|
if node.IsIngressGateway {
|
|
extPeers, extPeerIDAndAddrs, err = GetExtPeers(&node)
|
|
extPeers, extPeerIDAndAddrs, err = GetExtPeers(&node)
|
|
if err == nil {
|
|
if err == nil {
|
|
- for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
|
|
|
|
- extPeerIdAndAddr := extPeerIdAndAddr
|
|
|
|
- nodePeerMap[extPeerIdAndAddr.ID] = models.PeerRouteInfo{
|
|
|
|
- PeerAddr: net.IPNet{
|
|
|
|
- IP: net.ParseIP(extPeerIdAndAddr.Address),
|
|
|
|
- Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
|
|
|
|
- },
|
|
|
|
- PeerKey: extPeerIdAndAddr.ID,
|
|
|
|
- Allow: true,
|
|
|
|
- ID: extPeerIdAndAddr.ID,
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, extPeers...)
|
|
hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, extPeers...)
|
|
for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
|
|
for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
|
|
extPeerIdAndAddr := extPeerIdAndAddr
|
|
extPeerIdAndAddr := extPeerIdAndAddr
|
|
@@ -318,21 +265,6 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
Name: extPeerIdAndAddr.Name,
|
|
Name: extPeerIdAndAddr.Name,
|
|
Network: node.Network,
|
|
Network: node.Network,
|
|
}
|
|
}
|
|
-
|
|
|
|
- hostPeerUpdate.IngressInfo.ExtPeers[extPeerIdAndAddr.ID] = models.ExtClientInfo{
|
|
|
|
- Masquerade: true,
|
|
|
|
- IngGwAddr: net.IPNet{
|
|
|
|
- IP: net.ParseIP(node.PrimaryAddress()),
|
|
|
|
- Mask: getCIDRMaskFromAddr(node.PrimaryAddress()),
|
|
|
|
- },
|
|
|
|
- Network: node.PrimaryNetworkRange(),
|
|
|
|
- ExtPeerAddr: net.IPNet{
|
|
|
|
- IP: net.ParseIP(extPeerIdAndAddr.Address),
|
|
|
|
- Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
|
|
|
|
- },
|
|
|
|
- ExtPeerKey: extPeerIdAndAddr.ID,
|
|
|
|
- Peers: filterNodeMapForClientACLs(extPeerIdAndAddr.ID, node.Network, nodePeerMap),
|
|
|
|
- }
|
|
|
|
if node.Network == network {
|
|
if node.Network == network {
|
|
hostPeerUpdate.PeerIDs[extPeerIdAndAddr.ID] = extPeerIdAndAddr
|
|
hostPeerUpdate.PeerIDs[extPeerIdAndAddr.ID] = extPeerIdAndAddr
|
|
hostPeerUpdate.NodePeers = append(hostPeerUpdate.NodePeers, extPeers...)
|
|
hostPeerUpdate.NodePeers = append(hostPeerUpdate.NodePeers, extPeers...)
|
|
@@ -342,18 +274,6 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
logger.Log(1, "error retrieving external clients:", err.Error())
|
|
logger.Log(1, "error retrieving external clients:", err.Error())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if node.IsEgressGateway {
|
|
|
|
- hostPeerUpdate.EgressInfo[node.ID.String()] = models.EgressInfo{
|
|
|
|
- EgressID: node.ID.String(),
|
|
|
|
- Network: node.PrimaryNetworkRange(),
|
|
|
|
- EgressGwAddr: net.IPNet{
|
|
|
|
- IP: net.ParseIP(node.PrimaryAddress()),
|
|
|
|
- Mask: getCIDRMaskFromAddr(node.PrimaryAddress()),
|
|
|
|
- },
|
|
|
|
- GwPeers: nodePeerMap,
|
|
|
|
- EgressGWCfg: node.EgressGatewayRequest,
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
// == post peer calculations ==
|
|
// == post peer calculations ==
|
|
// indicate removal if no allowed IPs were calculated
|
|
// indicate removal if no allowed IPs were calculated
|
|
@@ -389,6 +309,133 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
return hostPeerUpdate, nil
|
|
return hostPeerUpdate, nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// GetFwUpdate - fetches the firewall update for the gateway nodes on the host
|
|
|
|
+func GetFwUpdate(host *models.Host) (models.FwUpdate, error) {
|
|
|
|
+ fwUpdate := models.FwUpdate{
|
|
|
|
+ IngressInfo: models.IngressInfo{
|
|
|
|
+ ExtPeers: make(map[string]models.ExtClientInfo),
|
|
|
|
+ },
|
|
|
|
+ EgressInfo: make(map[string]models.EgressInfo),
|
|
|
|
+ }
|
|
|
|
+ allNodes, err := GetAllNodes()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return fwUpdate, err
|
|
|
|
+ }
|
|
|
|
+ for _, nodeID := range host.Nodes {
|
|
|
|
+ nodeID := nodeID
|
|
|
|
+ node, err := GetNodeByID(nodeID)
|
|
|
|
+ if err != nil {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ if !node.Connected || node.PendingDelete || node.Action == models.NODE_DELETE {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ currentPeers := GetNetworkNodesMemory(allNodes, node.Network)
|
|
|
|
+ var nodePeerMap map[string]models.PeerRouteInfo
|
|
|
|
+ if node.IsIngressGateway || node.IsEgressGateway {
|
|
|
|
+ nodePeerMap = make(map[string]models.PeerRouteInfo)
|
|
|
|
+ }
|
|
|
|
+ for _, peer := range currentPeers {
|
|
|
|
+ peer := peer
|
|
|
|
+ if peer.ID.String() == node.ID.String() {
|
|
|
|
+ logger.Log(2, "fw update, skipping self")
|
|
|
|
+ //skip yourself
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ peerHost, err := GetHost(peer.HostID.String())
|
|
|
|
+ if err != nil {
|
|
|
|
+ logger.Log(1, "no peer host", peer.HostID.String(), err.Error())
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ if node.IsIngressGateway || node.IsEgressGateway {
|
|
|
|
+ if peer.IsIngressGateway {
|
|
|
|
+ _, extPeerIDAndAddrs, err := GetExtPeers(&peer)
|
|
|
|
+ if err == nil {
|
|
|
|
+ for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
|
|
|
|
+ extPeerIdAndAddr := extPeerIdAndAddr
|
|
|
|
+ nodePeerMap[extPeerIdAndAddr.ID] = models.PeerRouteInfo{
|
|
|
|
+ PeerAddr: net.IPNet{
|
|
|
|
+ IP: net.ParseIP(extPeerIdAndAddr.Address),
|
|
|
|
+ Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
|
|
|
|
+ },
|
|
|
|
+ PeerKey: extPeerIdAndAddr.ID,
|
|
|
|
+ Allow: true,
|
|
|
|
+ ID: extPeerIdAndAddr.ID,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if node.IsIngressGateway && peer.IsEgressGateway {
|
|
|
|
+ fwUpdate.IngressInfo.EgressRanges = append(fwUpdate.IngressInfo.EgressRanges,
|
|
|
|
+ peer.EgressGatewayRanges...)
|
|
|
|
+ }
|
|
|
|
+ nodePeerMap[peerHost.PublicKey.String()] = models.PeerRouteInfo{
|
|
|
|
+ PeerAddr: net.IPNet{
|
|
|
|
+ IP: net.ParseIP(peer.PrimaryAddress()),
|
|
|
|
+ Mask: getCIDRMaskFromAddr(peer.PrimaryAddress()),
|
|
|
|
+ },
|
|
|
|
+ PeerKey: peerHost.PublicKey.String(),
|
|
|
|
+ Allow: true,
|
|
|
|
+ ID: peer.ID.String(),
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ var extPeerIDAndAddrs []models.IDandAddr
|
|
|
|
+ if node.IsIngressGateway {
|
|
|
|
+ fwUpdate.IsIngressGw = true
|
|
|
|
+ _, extPeerIDAndAddrs, err = GetExtPeers(&node)
|
|
|
|
+ if err == nil {
|
|
|
|
+ for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
|
|
|
|
+ extPeerIdAndAddr := extPeerIdAndAddr
|
|
|
|
+ nodePeerMap[extPeerIdAndAddr.ID] = models.PeerRouteInfo{
|
|
|
|
+ PeerAddr: net.IPNet{
|
|
|
|
+ IP: net.ParseIP(extPeerIdAndAddr.Address),
|
|
|
|
+ Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
|
|
|
|
+ },
|
|
|
|
+ PeerKey: extPeerIdAndAddr.ID,
|
|
|
|
+ Allow: true,
|
|
|
|
+ ID: extPeerIdAndAddr.ID,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for _, extPeerIdAndAddr := range extPeerIDAndAddrs {
|
|
|
|
+ extPeerIdAndAddr := extPeerIdAndAddr
|
|
|
|
+
|
|
|
|
+ fwUpdate.IngressInfo.ExtPeers[extPeerIdAndAddr.ID] = models.ExtClientInfo{
|
|
|
|
+ Masquerade: true,
|
|
|
|
+ IngGwAddr: net.IPNet{
|
|
|
|
+ IP: net.ParseIP(node.PrimaryAddress()),
|
|
|
|
+ Mask: getCIDRMaskFromAddr(node.PrimaryAddress()),
|
|
|
|
+ },
|
|
|
|
+ Network: node.PrimaryNetworkRange(),
|
|
|
|
+ ExtPeerAddr: net.IPNet{
|
|
|
|
+ IP: net.ParseIP(extPeerIdAndAddr.Address),
|
|
|
|
+ Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
|
|
|
|
+ },
|
|
|
|
+ ExtPeerKey: extPeerIdAndAddr.ID,
|
|
|
|
+ Peers: filterNodeMapForClientACLs(extPeerIdAndAddr.ID, node.Network, nodePeerMap),
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else if !database.IsEmptyRecord(err) {
|
|
|
|
+ logger.Log(1, "error retrieving external clients:", err.Error())
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if node.IsEgressGateway {
|
|
|
|
+ fwUpdate.IsEgressGw = true
|
|
|
|
+ fwUpdate.EgressInfo[node.ID.String()] = models.EgressInfo{
|
|
|
|
+ EgressID: node.ID.String(),
|
|
|
|
+ Network: node.PrimaryNetworkRange(),
|
|
|
|
+ EgressGwAddr: net.IPNet{
|
|
|
|
+ IP: net.ParseIP(node.PrimaryAddress()),
|
|
|
|
+ Mask: getCIDRMaskFromAddr(node.PrimaryAddress()),
|
|
|
|
+ },
|
|
|
|
+ GwPeers: nodePeerMap,
|
|
|
|
+ EgressGWCfg: node.EgressGatewayRequest,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return fwUpdate, nil
|
|
|
|
+}
|
|
|
|
+
|
|
// GetPeerListenPort - given a host, retrieve it's appropriate listening port
|
|
// GetPeerListenPort - given a host, retrieve it's appropriate listening port
|
|
func GetPeerListenPort(host *models.Host) int {
|
|
func GetPeerListenPort(host *models.Host) int {
|
|
peerPort := host.ListenPort
|
|
peerPort := host.ListenPort
|