|
@@ -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 {
|
|
@@ -198,58 +151,17 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
//skip yourself
|
|
//skip yourself
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- var peerConfig wgtypes.PeerConfig
|
|
|
|
|
|
+
|
|
peerHost, err := GetHost(peer.HostID.String())
|
|
peerHost, err := GetHost(peer.HostID.String())
|
|
if err != nil {
|
|
if err != nil {
|
|
logger.Log(1, "no peer host", peer.HostID.String(), err.Error())
|
|
logger.Log(1, "no peer host", peer.HostID.String(), err.Error())
|
|
return models.HostPeerUpdate{}, err
|
|
return models.HostPeerUpdate{}, err
|
|
}
|
|
}
|
|
-
|
|
|
|
- peerConfig.PublicKey = peerHost.PublicKey
|
|
|
|
- peerConfig.PersistentKeepaliveInterval = &peer.PersistentKeepalive
|
|
|
|
- peerConfig.ReplaceAllowedIPs = true
|
|
|
|
- uselocal := false
|
|
|
|
- if host.EndpointIP.String() == peerHost.EndpointIP.String() {
|
|
|
|
- // peer is on same network
|
|
|
|
- // set to localaddress
|
|
|
|
- uselocal = true
|
|
|
|
- if node.LocalAddress.IP == nil {
|
|
|
|
- // use public endpint
|
|
|
|
- uselocal = false
|
|
|
|
- }
|
|
|
|
- if node.LocalAddress.String() == peer.LocalAddress.String() {
|
|
|
|
- uselocal = false
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- peerConfig.Endpoint = &net.UDPAddr{
|
|
|
|
- IP: peerHost.EndpointIP,
|
|
|
|
- Port: getPeerWgListenPort(peerHost),
|
|
|
|
|
|
+ peerConfig := wgtypes.PeerConfig{
|
|
|
|
+ PublicKey: peerHost.PublicKey,
|
|
|
|
+ PersistentKeepaliveInterval: &peer.PersistentKeepalive,
|
|
|
|
+ ReplaceAllowedIPs: true,
|
|
}
|
|
}
|
|
-
|
|
|
|
- if uselocal {
|
|
|
|
- peerConfig.Endpoint.IP = peer.LocalAddress.IP
|
|
|
|
- peerConfig.Endpoint.Port = peerHost.ListenPort
|
|
|
|
- }
|
|
|
|
- allowedips := GetAllowedIPs(&node, &peer, nil)
|
|
|
|
- if peer.IsIngressGateway {
|
|
|
|
- for _, entry := range peer.IngressGatewayRange {
|
|
|
|
- _, cidr, err := net.ParseCIDR(string(entry))
|
|
|
|
- if err == nil {
|
|
|
|
- allowedips = append(allowedips, *cidr)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if peer.IsEgressGateway {
|
|
|
|
- allowedips = append(allowedips, getEgressIPs(&node, &peer)...)
|
|
|
|
- }
|
|
|
|
- if peer.Action != models.NODE_DELETE &&
|
|
|
|
- !peer.PendingDelete &&
|
|
|
|
- peer.Connected &&
|
|
|
|
- nodeacls.AreNodesAllowed(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), nodeacls.NodeID(peer.ID.String())) &&
|
|
|
|
- (deletedNode == nil || (deletedNode != nil && peer.ID.String() != deletedNode.ID.String())) {
|
|
|
|
- peerConfig.AllowedIPs = allowedips // only append allowed IPs if valid connection
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if node.IsIngressGateway || node.IsEgressGateway {
|
|
if node.IsIngressGateway || node.IsEgressGateway {
|
|
if peer.IsIngressGateway {
|
|
if peer.IsIngressGateway {
|
|
_, extPeerIDAndAddrs, err := getExtPeers(&peer)
|
|
_, extPeerIDAndAddrs, err := getExtPeers(&peer)
|
|
@@ -282,6 +194,47 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
ID: peer.ID.String(),
|
|
ID: peer.ID.String(),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ if (node.IsRelayed && node.RelayedBy != peer.ID.String()) || (peer.IsRelayed && peer.RelayedBy != node.ID.String()) {
|
|
|
|
+ // if node is relayed and peer is not the relay, set remove to true
|
|
|
|
+ if _, ok := hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()]; ok {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ peerConfig.Remove = true
|
|
|
|
+ hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, peerConfig)
|
|
|
|
+ peerIndexMap[peerHost.PublicKey.String()] = len(hostPeerUpdate.Peers) - 1
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ uselocal := false
|
|
|
|
+ if host.EndpointIP.String() == peerHost.EndpointIP.String() {
|
|
|
|
+ // peer is on same network
|
|
|
|
+ // set to localaddress
|
|
|
|
+ uselocal = true
|
|
|
|
+ if node.LocalAddress.IP == nil {
|
|
|
|
+ // use public endpint
|
|
|
|
+ uselocal = false
|
|
|
|
+ }
|
|
|
|
+ if node.LocalAddress.String() == peer.LocalAddress.String() {
|
|
|
|
+ uselocal = false
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ peerConfig.Endpoint = &net.UDPAddr{
|
|
|
|
+ IP: peerHost.EndpointIP,
|
|
|
|
+ Port: getPeerWgListenPort(peerHost),
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if uselocal {
|
|
|
|
+ peerConfig.Endpoint.IP = peer.LocalAddress.IP
|
|
|
|
+ peerConfig.Endpoint.Port = peerHost.ListenPort
|
|
|
|
+ }
|
|
|
|
+ allowedips := GetAllowedIPs(&node, &peer, nil)
|
|
|
|
+ if peer.Action != models.NODE_DELETE &&
|
|
|
|
+ !peer.PendingDelete &&
|
|
|
|
+ peer.Connected &&
|
|
|
|
+ nodeacls.AreNodesAllowed(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), nodeacls.NodeID(peer.ID.String())) &&
|
|
|
|
+ (deletedNode == nil || (deletedNode != nil && peer.ID.String() != deletedNode.ID.String())) {
|
|
|
|
+ peerConfig.AllowedIPs = allowedips // only append allowed IPs if valid connection
|
|
|
|
+ }
|
|
|
|
|
|
peerProxyPort := GetProxyListenPort(peerHost)
|
|
peerProxyPort := GetProxyListenPort(peerHost)
|
|
var nodePeer wgtypes.PeerConfig
|
|
var nodePeer wgtypes.PeerConfig
|
|
@@ -303,8 +256,9 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
nodePeer = peerConfig
|
|
nodePeer = peerConfig
|
|
} else {
|
|
} else {
|
|
peerAllowedIPs := hostPeerUpdate.Peers[peerIndexMap[peerHost.PublicKey.String()]].AllowedIPs
|
|
peerAllowedIPs := hostPeerUpdate.Peers[peerIndexMap[peerHost.PublicKey.String()]].AllowedIPs
|
|
- peerAllowedIPs = append(peerAllowedIPs, allowedips...)
|
|
|
|
|
|
+ peerAllowedIPs = append(peerAllowedIPs, peerConfig.AllowedIPs...)
|
|
hostPeerUpdate.Peers[peerIndexMap[peerHost.PublicKey.String()]].AllowedIPs = peerAllowedIPs
|
|
hostPeerUpdate.Peers[peerIndexMap[peerHost.PublicKey.String()]].AllowedIPs = peerAllowedIPs
|
|
|
|
+ hostPeerUpdate.Peers[peerIndexMap[peerHost.PublicKey.String()]].Remove = false
|
|
hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()][peer.ID.String()] = models.IDandAddr{
|
|
hostPeerUpdate.HostPeerIDs[peerHost.PublicKey.String()][peer.ID.String()] = models.IDandAddr{
|
|
ID: peer.ID.String(),
|
|
ID: peer.ID.String(),
|
|
Address: peer.PrimaryAddress(),
|
|
Address: peer.PrimaryAddress(),
|
|
@@ -627,14 +581,15 @@ func GetAllowedIPs(node, peer *models.Node, metrics *models.Metrics) []net.IPNet
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ if node.IsRelayed && node.RelayedBy == peer.ID.String() {
|
|
|
|
+ allowedips = append(allowedips, getAllowedIpsForRelayed(node, peer)...)
|
|
|
|
+
|
|
|
|
+ }
|
|
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())
|
|
|
|
- }
|
|
|
|
|
|
+func getEgressIPs(peer *models.Node) []net.IPNet {
|
|
|
|
+
|
|
peerHost, err := GetHost(peer.HostID.String())
|
|
peerHost, err := GetHost(peer.HostID.String())
|
|
if err != nil {
|
|
if err != nil {
|
|
logger.Log(0, "error retrieving host for peer", peer.ID.String(), err.Error())
|
|
logger.Log(0, "error retrieving host for peer", peer.ID.String(), err.Error())
|
|
@@ -654,12 +609,12 @@ func getEgressIPs(node, peer *models.Node) []net.IPNet {
|
|
}
|
|
}
|
|
// 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
|
|
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")
|
|
|
|
|
|
+ logger.Log(2, "egress IP range of ", iprange, " overlaps with ", peerHost.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 ipnet.Contains(peer.LocalAddress.IP) && !internetGateway { // ensuring egress gateway range does not contain public ip of node
|
|
|
|
+ logger.Log(2, "egress IP range of ", iprange, " overlaps with ", peer.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 {
|
|
@@ -690,12 +645,50 @@ 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)
|
|
|
|
|
|
+ egressIPs := getEgressIPs(peer)
|
|
allowedips = append(allowedips, egressIPs...)
|
|
allowedips = append(allowedips, egressIPs...)
|
|
}
|
|
}
|
|
|
|
+ if peer.IsRelay {
|
|
|
|
+ for _, relayedNodeID := range peer.RelayedNodes {
|
|
|
|
+ if node.ID.String() == relayedNodeID {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ relayedNode, err := GetNodeByID(relayedNodeID)
|
|
|
|
+ if err != nil {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ allowed := getRelayedAddresses(relayedNodeID)
|
|
|
|
+ if relayedNode.IsEgressGateway {
|
|
|
|
+ allowed = append(allowed, getEgressIPs(&relayedNode)...)
|
|
|
|
+ }
|
|
|
|
+ allowedips = append(allowedips, allowed...)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
return allowedips
|
|
return allowedips
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// getAllowedIpsForRelayed - returns the peerConfig for a node relayed by relay
|
|
|
|
+func getAllowedIpsForRelayed(relayed, relay *models.Node) (allowedIPs []net.IPNet) {
|
|
|
|
+ if relayed.RelayedBy != relay.ID.String() {
|
|
|
|
+ logger.Log(0, "RelayedByRelay called with invalid parameters")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ peers, err := GetNetworkNodes(relay.Network)
|
|
|
|
+ if err != nil {
|
|
|
|
+ logger.Log(0, "error getting network clients", err.Error())
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ for _, peer := range peers {
|
|
|
|
+ if peer.ID == relayed.ID || peer.ID == relay.ID {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ if nodeacls.AreNodesAllowed(nodeacls.NetworkID(relayed.Network), nodeacls.NodeID(relayed.ID.String()), nodeacls.NodeID(peer.ID.String())) {
|
|
|
|
+ allowedIPs = append(allowedIPs, GetAllowedIPs(relayed, &peer, nil)...)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+
|
|
func getCIDRMaskFromAddr(addr string) net.IPMask {
|
|
func getCIDRMaskFromAddr(addr string) net.IPMask {
|
|
cidr := net.CIDRMask(32, 32)
|
|
cidr := net.CIDRMask(32, 32)
|
|
ipAddr, err := netip.ParseAddr(addr)
|
|
ipAddr, err := netip.ParseAddr(addr)
|