|
@@ -5,6 +5,7 @@ import (
|
|
"fmt"
|
|
"fmt"
|
|
"log"
|
|
"log"
|
|
"net"
|
|
"net"
|
|
|
|
+ "net/netip"
|
|
"sort"
|
|
"sort"
|
|
"strconv"
|
|
"strconv"
|
|
"strings"
|
|
"strings"
|
|
@@ -299,10 +300,14 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) {
|
|
}
|
|
}
|
|
hostPeerUpdate := models.HostPeerUpdate{
|
|
hostPeerUpdate := models.HostPeerUpdate{
|
|
Host: *host,
|
|
Host: *host,
|
|
|
|
+ Server: servercfg.GetServer(),
|
|
Network: make(map[string]models.NetworkInfo),
|
|
Network: make(map[string]models.NetworkInfo),
|
|
PeerIDs: make(models.HostPeerMap),
|
|
PeerIDs: make(models.HostPeerMap),
|
|
ServerVersion: servercfg.GetVersion(),
|
|
ServerVersion: servercfg.GetVersion(),
|
|
ServerAddrs: []models.ServerAddr{},
|
|
ServerAddrs: []models.ServerAddr{},
|
|
|
|
+ IngressInfo: models.IngressInfo{
|
|
|
|
+ ExtPeers: make(map[string]models.ExtClientInfo),
|
|
|
|
+ },
|
|
}
|
|
}
|
|
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)
|
|
@@ -314,6 +319,7 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) {
|
|
if !node.Connected || node.Action == models.NODE_DELETE || node.PendingDelete {
|
|
if !node.Connected || node.Action == models.NODE_DELETE || node.PendingDelete {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
+
|
|
hostPeerUpdate.Network[node.Network] = models.NetworkInfo{
|
|
hostPeerUpdate.Network[node.Network] = models.NetworkInfo{
|
|
DNS: getPeerDNS(node.Network),
|
|
DNS: getPeerDNS(node.Network),
|
|
}
|
|
}
|
|
@@ -322,6 +328,10 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) {
|
|
log.Println("no network nodes")
|
|
log.Println("no network nodes")
|
|
return models.HostPeerUpdate{}, err
|
|
return models.HostPeerUpdate{}, err
|
|
}
|
|
}
|
|
|
|
+ var extClientPeerMap map[string]models.PeerExtInfo
|
|
|
|
+ if node.IsIngressGateway {
|
|
|
|
+ extClientPeerMap = make(map[string]models.PeerExtInfo)
|
|
|
|
+ }
|
|
for _, peer := range currentPeers {
|
|
for _, peer := range currentPeers {
|
|
if peer.ID == node.ID {
|
|
if peer.ID == node.ID {
|
|
logger.Log(2, "peer update, skipping self")
|
|
logger.Log(2, "peer update, skipping self")
|
|
@@ -383,6 +393,17 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) {
|
|
allowedips = append(allowedips, getEgressIPs(&node, &peer)...)
|
|
allowedips = append(allowedips, getEgressIPs(&node, &peer)...)
|
|
}
|
|
}
|
|
peerConfig.AllowedIPs = allowedips
|
|
peerConfig.AllowedIPs = allowedips
|
|
|
|
+ if node.IsIngressGateway {
|
|
|
|
+
|
|
|
|
+ extClientPeerMap[peerHost.PublicKey.String()] = models.PeerExtInfo{
|
|
|
|
+ PeerAddr: net.IPNet{
|
|
|
|
+ IP: net.ParseIP(peer.PrimaryAddress()),
|
|
|
|
+ Mask: getCIDRMaskFromAddr(peer.PrimaryAddress()),
|
|
|
|
+ },
|
|
|
|
+ PeerKey: peerHost.PublicKey.String(),
|
|
|
|
+ Allow: true,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
if _, ok := hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()]; !ok {
|
|
if _, ok := hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()]; !ok {
|
|
hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()] = make(map[string]models.IDandAddr)
|
|
hostPeerUpdate.PeerIDs[peerHost.PublicKey.String()] = make(map[string]models.IDandAddr)
|
|
@@ -419,6 +440,19 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) {
|
|
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()),
|
|
|
|
+ },
|
|
|
|
+ ExtPeerAddr: net.IPNet{
|
|
|
|
+ IP: net.ParseIP(extPeerIdAndAddr.Address),
|
|
|
|
+ Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
|
|
|
|
+ },
|
|
|
|
+ ExtPeerKey: extPeerIdAndAddr.ID,
|
|
|
|
+ Peers: extClientPeerMap,
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
} else if !database.IsEmptyRecord(err) {
|
|
} else if !database.IsEmptyRecord(err) {
|
|
@@ -1117,3 +1151,15 @@ func getNodeAllowedIPs(peer, node *models.Node) []net.IPNet {
|
|
}
|
|
}
|
|
return allowedips
|
|
return allowedips
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func getCIDRMaskFromAddr(addr string) net.IPMask {
|
|
|
|
+ cidr := net.CIDRMask(32, 32)
|
|
|
|
+ ipAddr, err := netip.ParseAddr(addr)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return cidr
|
|
|
|
+ }
|
|
|
|
+ if ipAddr.Is6() {
|
|
|
|
+ cidr = net.CIDRMask(128, 128)
|
|
|
|
+ }
|
|
|
|
+ return cidr
|
|
|
|
+}
|