|
@@ -29,41 +29,6 @@ func GetProxyUpdateForHost(ctx context.Context, host *models.Host) (models.Proxy
|
|
Action: models.ProxyUpdate,
|
|
Action: models.ProxyUpdate,
|
|
}
|
|
}
|
|
peerConfMap := make(map[string]models.PeerConf)
|
|
peerConfMap := make(map[string]models.PeerConf)
|
|
- if host.IsRelayed {
|
|
|
|
- relayHost, err := GetHost(host.RelayedBy)
|
|
|
|
- if err == nil {
|
|
|
|
- relayEndpoint, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", relayHost.EndpointIP, GetPeerListenPort(relayHost)))
|
|
|
|
- if err != nil {
|
|
|
|
- logger.Log(1, "failed to resolve relay node endpoint: ", err.Error())
|
|
|
|
- }
|
|
|
|
- proxyPayload.IsRelayed = true
|
|
|
|
- proxyPayload.RelayedTo = relayEndpoint
|
|
|
|
- } else {
|
|
|
|
- logger.Log(0, "couldn't find relay host for: ", host.ID.String())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if host.IsRelay {
|
|
|
|
- relayedHosts := GetRelayedHosts(host)
|
|
|
|
- relayPeersMap := make(map[string]models.RelayedConf)
|
|
|
|
- for _, relayedHost := range relayedHosts {
|
|
|
|
- relayedHost := relayedHost
|
|
|
|
- payload, err := GetPeerUpdateForHost(ctx, "", &relayedHost, nil, nil)
|
|
|
|
- if err == nil {
|
|
|
|
- relayedEndpoint, udpErr := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", relayedHost.EndpointIP, GetPeerListenPort(&relayedHost)))
|
|
|
|
- if udpErr == nil {
|
|
|
|
- relayPeersMap[relayedHost.PublicKey.String()] = models.RelayedConf{
|
|
|
|
- RelayedPeerEndpoint: relayedEndpoint,
|
|
|
|
- RelayedPeerPubKey: relayedHost.PublicKey.String(),
|
|
|
|
- Peers: payload.Peers,
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- proxyPayload.IsRelay = true
|
|
|
|
- proxyPayload.RelayedPeerConf = relayPeersMap
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
var ingressStatus bool
|
|
var ingressStatus bool
|
|
for _, nodeID := range host.Nodes {
|
|
for _, nodeID := range host.Nodes {
|
|
|
|
|
|
@@ -101,18 +66,6 @@ func GetProxyUpdateForHost(ctx context.Context, host *models.Host) (models.Proxy
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if peerHost.IsRelayed && peerHost.RelayedBy != host.ID.String() {
|
|
|
|
- relayHost, err := GetHost(peerHost.RelayedBy)
|
|
|
|
- if err == nil {
|
|
|
|
- relayTo, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", relayHost.EndpointIP, GetPeerListenPort(relayHost)))
|
|
|
|
- if err == nil {
|
|
|
|
- currPeerConf.IsRelayed = true
|
|
|
|
- currPeerConf.RelayedTo = relayTo
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
peerConfMap[peerHost.PublicKey.String()] = currPeerConf
|
|
peerConfMap[peerHost.PublicKey.String()] = currPeerConf
|
|
}
|
|
}
|
|
if node.IsIngressGateway {
|
|
if node.IsIngressGateway {
|
|
@@ -152,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{},
|
|
@@ -168,7 +117,7 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
}
|
|
}
|
|
|
|
|
|
// endpoint detection always comes from the server
|
|
// endpoint detection always comes from the server
|
|
- hostPeerUpdate.Host.EndpointDetection = servercfg.EndpointDetectionEnabled()
|
|
|
|
|
|
+ //hostPeerUpdate.Host.EndpointDetection = servercfg.EndpointDetectionEnabled()
|
|
|
|
|
|
logger.Log(1, "peer update for host", host.ID.String())
|
|
logger.Log(1, "peer update for host", host.ID.String())
|
|
peerIndexMap := make(map[string]int)
|
|
peerIndexMap := make(map[string]int)
|
|
@@ -182,10 +131,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():
|
|
@@ -198,6 +143,10 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
//skip yourself
|
|
//skip yourself
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
+ if peer.IsRelayed {
|
|
|
|
+ // skip relayed peers; will be included in relay peer
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
var peerConfig wgtypes.PeerConfig
|
|
var peerConfig wgtypes.PeerConfig
|
|
peerHost, err := GetHost(peer.HostID.String())
|
|
peerHost, err := GetHost(peer.HostID.String())
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -240,7 +189,14 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if peer.IsEgressGateway {
|
|
if peer.IsEgressGateway {
|
|
- allowedips = append(allowedips, getEgressIPs(&node, &peer)...)
|
|
|
|
|
|
+ host, err := GetHost(peer.HostID.String())
|
|
|
|
+ if err == nil {
|
|
|
|
+ allowedips = append(allowedips, getEgressIPs(
|
|
|
|
+ &models.Client{
|
|
|
|
+ Host: *host,
|
|
|
|
+ Node: peer,
|
|
|
|
+ })...)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
if peer.Action != models.NODE_DELETE &&
|
|
if peer.Action != models.NODE_DELETE &&
|
|
!peer.PendingDelete &&
|
|
!peer.PendingDelete &&
|
|
@@ -250,39 +206,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 {
|
|
@@ -334,20 +257,8 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
var extPeers []wgtypes.PeerConfig
|
|
var extPeers []wgtypes.PeerConfig
|
|
var extPeerIDAndAddrs []models.IDandAddr
|
|
var extPeerIDAndAddrs []models.IDandAddr
|
|
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
|
|
@@ -358,21 +269,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...)
|
|
@@ -382,18 +278,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
|
|
@@ -438,6 +322,133 @@ func getPeerWgListenPort(host *models.Host) int {
|
|
return peerPort
|
|
return peerPort
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// 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
|
|
@@ -463,7 +474,7 @@ func GetProxyListenPort(host *models.Host) int {
|
|
return proxyPort
|
|
return proxyPort
|
|
}
|
|
}
|
|
|
|
|
|
-func getExtPeers(node *models.Node) ([]wgtypes.PeerConfig, []models.IDandAddr, error) {
|
|
|
|
|
|
+func GetExtPeers(node *models.Node) ([]wgtypes.PeerConfig, []models.IDandAddr, error) {
|
|
var peers []wgtypes.PeerConfig
|
|
var peers []wgtypes.PeerConfig
|
|
var idsAndAddr []models.IDandAddr
|
|
var idsAndAddr []models.IDandAddr
|
|
extPeers, err := GetNetworkExtClients(node.Network)
|
|
extPeers, err := GetNetworkExtClients(node.Network)
|
|
@@ -598,7 +609,7 @@ func GetAllowedIPs(node, peer *models.Node, metrics *models.Metrics) []net.IPNet
|
|
|
|
|
|
// handle ingress gateway peers
|
|
// handle ingress gateway peers
|
|
if peer.IsIngressGateway {
|
|
if peer.IsIngressGateway {
|
|
- extPeers, _, err := getExtPeers(peer)
|
|
|
|
|
|
+ extPeers, _, err := GetExtPeers(peer)
|
|
if err != nil {
|
|
if err != nil {
|
|
logger.Log(2, "could not retrieve ext peers for ", peer.ID.String(), err.Error())
|
|
logger.Log(2, "could not retrieve ext peers for ", peer.ID.String(), err.Error())
|
|
}
|
|
}
|
|
@@ -630,42 +641,36 @@ func GetAllowedIPs(node, peer *models.Node, metrics *models.Metrics) []net.IPNet
|
|
return allowedips
|
|
return allowedips
|
|
}
|
|
}
|
|
|
|
|
|
-func getEgressIPs(node, peer *models.Node) []net.IPNet {
|
|
|
|
- host, err := GetHost(node.HostID.String())
|
|
|
|
- if err != nil {
|
|
|
|
- logger.Log(0, "error retrieving host for node", node.ID.String(), err.Error())
|
|
|
|
- }
|
|
|
|
- peerHost, err := GetHost(peer.HostID.String())
|
|
|
|
- if err != nil {
|
|
|
|
- logger.Log(0, "error retrieving host for peer", peer.ID.String(), err.Error())
|
|
|
|
- }
|
|
|
|
|
|
+// getEgressIPs - gets the egress IPs for a client
|
|
|
|
+func getEgressIPs(client *models.Client) []net.IPNet {
|
|
|
|
|
|
//check for internet gateway
|
|
//check for internet gateway
|
|
internetGateway := false
|
|
internetGateway := false
|
|
- if slices.Contains(peer.EgressGatewayRanges, "0.0.0.0/0") || slices.Contains(peer.EgressGatewayRanges, "::/0") {
|
|
|
|
|
|
+ if slices.Contains(client.Node.EgressGatewayRanges, "0.0.0.0/0") || slices.Contains(client.Node.EgressGatewayRanges, "::/0") {
|
|
internetGateway = true
|
|
internetGateway = true
|
|
}
|
|
}
|
|
allowedips := []net.IPNet{}
|
|
allowedips := []net.IPNet{}
|
|
- for _, iprange := range peer.EgressGatewayRanges { // go through each cidr for egress gateway
|
|
|
|
- _, ipnet, err := net.ParseCIDR(iprange) // confirming it's valid cidr
|
|
|
|
|
|
+ for _, iprange := range client.Node.EgressGatewayRanges { // go through each cidr for egress gateway
|
|
|
|
+ ip, cidr, err := net.ParseCIDR(iprange) // confirming it's valid cidr
|
|
if err != nil {
|
|
if err != nil {
|
|
logger.Log(1, "could not parse gateway IP range. Not adding ", iprange)
|
|
logger.Log(1, "could not parse gateway IP range. Not adding ", iprange)
|
|
continue // if can't parse CIDR
|
|
continue // if can't parse CIDR
|
|
}
|
|
}
|
|
|
|
+ cidr.IP = ip
|
|
// getting the public ip of node
|
|
// getting the public ip of node
|
|
- if ipnet.Contains(peerHost.EndpointIP) && !internetGateway { // ensuring egress gateway range does not contain endpoint of node
|
|
|
|
- logger.Log(2, "egress IP range of ", iprange, " overlaps with ", host.EndpointIP.String(), ", omitting")
|
|
|
|
|
|
+ if cidr.Contains(client.Host.EndpointIP) && !internetGateway { // ensuring egress gateway range does not contain endpoint of node
|
|
|
|
+ logger.Log(2, "egress IP range of ", iprange, " overlaps with ", client.Host.EndpointIP.String(), ", omitting")
|
|
continue // skip adding egress range if overlaps with node's ip
|
|
continue // skip adding egress range if overlaps with node's ip
|
|
}
|
|
}
|
|
// TODO: Could put in a lot of great logic to avoid conflicts / bad routes
|
|
// TODO: Could put in a lot of great logic to avoid conflicts / bad routes
|
|
- if ipnet.Contains(node.LocalAddress.IP) && !internetGateway { // ensuring egress gateway range does not contain public ip of node
|
|
|
|
- logger.Log(2, "egress IP range of ", iprange, " overlaps with ", node.LocalAddress.String(), ", omitting")
|
|
|
|
|
|
+ if cidr.Contains(client.Node.LocalAddress.IP) && !internetGateway { // ensuring egress gateway range does not contain public ip of node
|
|
|
|
+ logger.Log(2, "egress IP range of ", iprange, " overlaps with ", client.Node.LocalAddress.String(), ", omitting")
|
|
continue // skip adding egress range if overlaps with node's local ip
|
|
continue // skip adding egress range if overlaps with node's local ip
|
|
}
|
|
}
|
|
if err != nil {
|
|
if err != nil {
|
|
logger.Log(1, "error encountered when setting egress range", err.Error())
|
|
logger.Log(1, "error encountered when setting egress range", err.Error())
|
|
} else {
|
|
} else {
|
|
- allowedips = append(allowedips, *ipnet)
|
|
|
|
|
|
+ allowedips = append(allowedips, *cidr)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return allowedips
|
|
return allowedips
|
|
@@ -690,8 +695,21 @@ func getNodeAllowedIPs(peer, node *models.Node) []net.IPNet {
|
|
// handle egress gateway peers
|
|
// handle egress gateway peers
|
|
if peer.IsEgressGateway {
|
|
if peer.IsEgressGateway {
|
|
//hasGateway = true
|
|
//hasGateway = true
|
|
- egressIPs := getEgressIPs(node, peer)
|
|
|
|
- allowedips = append(allowedips, egressIPs...)
|
|
|
|
|
|
+ host, err := GetHost(peer.HostID.String())
|
|
|
|
+ if err == nil {
|
|
|
|
+ egressIPs := getEgressIPs(
|
|
|
|
+ &models.Client{
|
|
|
|
+ Host: *host,
|
|
|
|
+ Node: *peer,
|
|
|
|
+ })
|
|
|
|
+ allowedips = append(allowedips, egressIPs...)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if peer.IsRelay {
|
|
|
|
+ for _, relayed := range peer.RelayedNodes {
|
|
|
|
+ allowed := getRelayedAddresses(relayed)
|
|
|
|
+ allowedips = append(allowedips, allowed...)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return allowedips
|
|
return allowedips
|
|
}
|
|
}
|
|
@@ -733,3 +751,190 @@ func filterNodeMapForClientACLs(publicKey, network string, nodePeerMap map[strin
|
|
}
|
|
}
|
|
return nodePeerMap
|
|
return nodePeerMap
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func GetPeerUpdate(host *models.Host) []wgtypes.PeerConfig {
|
|
|
|
+ peerUpdate := []wgtypes.PeerConfig{}
|
|
|
|
+ for _, nodeStr := range host.Nodes {
|
|
|
|
+ node, err := GetNodeByID(nodeStr)
|
|
|
|
+ if err != nil {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ client := models.Client{Host: *host, Node: node}
|
|
|
|
+ peers, err := GetNetworkClients(node.Network)
|
|
|
|
+ if err != nil {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ if node.IsRelayed {
|
|
|
|
+ peerUpdate = append(peerUpdate, peerUpdateForRelayed(&client, peers)...)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ if node.IsRelay {
|
|
|
|
+ peerUpdate = append(peerUpdate, peerUpdateForRelay(&client, peers)...)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ for _, peer := range peers {
|
|
|
|
+ if peer.Host.ID == client.Host.ID {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ // if peer is relayed by some other node, remove it from the peer list, it
|
|
|
|
+ // will be added to allowedips of relay peer
|
|
|
|
+ if peer.Node.IsRelayed {
|
|
|
|
+ update := wgtypes.PeerConfig{
|
|
|
|
+ PublicKey: peer.Host.PublicKey,
|
|
|
|
+ Remove: true,
|
|
|
|
+ }
|
|
|
|
+ peerUpdate = append(peerUpdate, update)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ update := wgtypes.PeerConfig{
|
|
|
|
+ PublicKey: peer.Host.PublicKey,
|
|
|
|
+ ReplaceAllowedIPs: true,
|
|
|
|
+ Endpoint: &net.UDPAddr{
|
|
|
|
+ IP: peer.Host.EndpointIP,
|
|
|
|
+ Port: peer.Host.ListenPort,
|
|
|
|
+ },
|
|
|
|
+ PersistentKeepaliveInterval: &peer.Node.PersistentKeepalive,
|
|
|
|
+ }
|
|
|
|
+ // if peer is a relay that relays us, don't do anything
|
|
|
|
+ if peer.Node.IsRelay && client.Node.RelayedBy == peer.Node.ID.String() {
|
|
|
|
+ continue
|
|
|
|
+ } else {
|
|
|
|
+ update.AllowedIPs = append(update.AllowedIPs, getRelayAllowedIPs(&peer)...)
|
|
|
|
+ }
|
|
|
|
+ //normal peer
|
|
|
|
+ update.AllowedIPs = append(update.AllowedIPs, AddAllowedIPs(&peer)...)
|
|
|
|
+ peerUpdate = append(peerUpdate, update)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return peerUpdate
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func AddAllowedIPs(peer *models.Client) []net.IPNet {
|
|
|
|
+ allowedIPs := []net.IPNet{}
|
|
|
|
+ if peer.Node.Address.IP != nil {
|
|
|
|
+ peer.Node.Address.Mask = net.CIDRMask(32, 32)
|
|
|
|
+ allowedIPs = append(allowedIPs, peer.Node.Address)
|
|
|
|
+ }
|
|
|
|
+ if peer.Node.Address6.IP != nil {
|
|
|
|
+ peer.Node.Address6.Mask = net.CIDRMask(128, 128)
|
|
|
|
+ allowedIPs = append(allowedIPs, peer.Node.Address6)
|
|
|
|
+ }
|
|
|
|
+ if peer.Node.IsEgressGateway {
|
|
|
|
+ allowedIPs = append(allowedIPs, getEgressIPs(peer)...)
|
|
|
|
+ }
|
|
|
|
+ if peer.Node.IsIngressGateway {
|
|
|
|
+ allowedIPs = append(allowedIPs, getIngressIPs(peer)...)
|
|
|
|
+ }
|
|
|
|
+ return allowedIPs
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// getRelayAllowedIPs returns the list of allowedips for a peer that is a relay
|
|
|
|
+func getRelayAllowedIPs(peer *models.Client) []net.IPNet {
|
|
|
|
+ var relayIPs []net.IPNet
|
|
|
|
+ if !peer.Node.IsRelay {
|
|
|
|
+ logger.Log(0, "getRelayAllowedIPs called for a non-relay node", peer.Host.Name)
|
|
|
|
+ return relayIPs
|
|
|
|
+ }
|
|
|
|
+ //if !client.Node.IsRelayed || client.Node.RelayedBy != peer.Node.ID.String() {
|
|
|
|
+ //logger.Log(0, "getRelayAllowedIPs called for non-relayed node", client.Host.Name, peer.Host.Name)
|
|
|
|
+ //return relayIPs
|
|
|
|
+ //}
|
|
|
|
+ for _, relayed := range peer.Node.RelayedNodes {
|
|
|
|
+ relayedNode, err := GetNodeByID(relayed)
|
|
|
|
+ if err != nil {
|
|
|
|
+ logger.Log(0, "retrieve relayed node", err.Error())
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ if relayedNode.Address.IP != nil {
|
|
|
|
+ relayedNode.Address.Mask = net.CIDRMask(32, 32)
|
|
|
|
+ relayIPs = append(relayIPs, relayedNode.Address)
|
|
|
|
+ }
|
|
|
|
+ if relayedNode.Address6.IP != nil {
|
|
|
|
+ relayedNode.Address.Mask = net.CIDRMask(128, 128)
|
|
|
|
+ relayIPs = append(relayIPs, relayedNode.Address6)
|
|
|
|
+ }
|
|
|
|
+ host, err := GetHost(relayedNode.HostID.String())
|
|
|
|
+ if err == nil {
|
|
|
|
+ if relayedNode.IsRelay {
|
|
|
|
+ relayIPs = append(relayIPs, getRelayAllowedIPs(
|
|
|
|
+ &models.Client{
|
|
|
|
+ Host: *host,
|
|
|
|
+ Node: relayedNode,
|
|
|
|
+ })...)
|
|
|
|
+ }
|
|
|
|
+ if relayedNode.IsEgressGateway {
|
|
|
|
+ relayIPs = append(relayIPs, getEgressIPs(
|
|
|
|
+ &models.Client{
|
|
|
|
+ Host: *host,
|
|
|
|
+ Node: relayedNode,
|
|
|
|
+ })...)
|
|
|
|
+ }
|
|
|
|
+ if relayedNode.IsIngressGateway {
|
|
|
|
+ relayIPs = append(relayIPs, getIngressIPs(
|
|
|
|
+ &models.Client{
|
|
|
|
+ Host: *host,
|
|
|
|
+ Node: relayedNode,
|
|
|
|
+ })...)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return relayIPs
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// getIngressIPs returns the additional allowedips (ext client addresses) that need
|
|
|
|
+// to be included for an ingress gateway peer
|
|
|
|
+// TODO: add ExtraAllowedIPs
|
|
|
|
+func getIngressIPs(peer *models.Client) []net.IPNet {
|
|
|
|
+ var ingressIPs []net.IPNet
|
|
|
|
+ extclients, err := GetNetworkExtClients(peer.Node.Network)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return ingressIPs
|
|
|
|
+ }
|
|
|
|
+ for _, ec := range extclients {
|
|
|
|
+ if ec.IngressGatewayID == peer.Node.ID.String() {
|
|
|
|
+ if ec.Address != "" {
|
|
|
|
+ ip, cidr, err := net.ParseCIDR(ec.Address)
|
|
|
|
+ if err != nil {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ cidr.IP = ip
|
|
|
|
+ ingressIPs = append(ingressIPs, *cidr)
|
|
|
|
+ }
|
|
|
|
+ if ec.Address6 != "" {
|
|
|
|
+ ip, cidr, err := net.ParseCIDR(ec.Address6)
|
|
|
|
+ if err != nil {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ cidr.IP = ip
|
|
|
|
+ ingressIPs = append(ingressIPs, *cidr)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return ingressIPs
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// GetPeerUpdateForRelay - returns the peer update for a relay node
|
|
|
|
+func GetPeerUpdateForRelay(client *models.Client, peers []models.Client) []wgtypes.PeerConfig {
|
|
|
|
+ peerConfig := []wgtypes.PeerConfig{}
|
|
|
|
+ if !client.Node.IsRelay {
|
|
|
|
+ return []wgtypes.PeerConfig{}
|
|
|
|
+ }
|
|
|
|
+ for _, peer := range peers {
|
|
|
|
+ if peer.Host.ID == client.Host.ID {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ update := wgtypes.PeerConfig{
|
|
|
|
+ PublicKey: peer.Host.PublicKey,
|
|
|
|
+ ReplaceAllowedIPs: true,
|
|
|
|
+ Remove: false,
|
|
|
|
+ Endpoint: &net.UDPAddr{
|
|
|
|
+ IP: peer.Host.EndpointIP,
|
|
|
|
+ Port: peer.Host.ListenPort,
|
|
|
|
+ },
|
|
|
|
+ PersistentKeepaliveInterval: &peer.Node.PersistentKeepalive,
|
|
|
|
+ }
|
|
|
|
+ update.AllowedIPs = append(update.AllowedIPs, AddAllowedIPs(&peer)...)
|
|
|
|
+ peerConfig = append(peerConfig, update)
|
|
|
|
+ }
|
|
|
|
+ return peerConfig
|
|
|
|
+}
|