mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-20 15:45:45 +08:00
GetPeers comments
This commit is contained in:
@@ -18,74 +18,100 @@ import (
|
|||||||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetHubPeer - in HubAndSpoke networks, if not the hub, return the hub
|
|
||||||
/*
|
|
||||||
func GetHubPeer(networkName string) []models.Node {
|
|
||||||
var hubpeer = make([]models.Node, 0)
|
|
||||||
servernodes, err := GetNetworkNodes(networkName)
|
|
||||||
if err != nil {
|
|
||||||
return hubpeer
|
|
||||||
}
|
|
||||||
for i := range servernodes {
|
|
||||||
if servernodes[i].IsHub == "yes" {
|
|
||||||
return []models.Node{servernodes[i]}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return hubpeer
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// GetNodePeers - fetches peers for a given node
|
// GetNodePeers - fetches peers for a given node
|
||||||
func GetNodePeers(network *models.Network, nodeid string, excludeRelayed bool, isP2S bool) ([]models.Node, error) {
|
func GetNodePeers(network *models.Network, nodeid string, excludeRelayed bool, isP2S bool) ([]models.Node, error) {
|
||||||
var peers []models.Node
|
var peers []models.Node
|
||||||
|
|
||||||
|
// networkNodes = all nodes in network
|
||||||
|
// egressNetworkNodes = all egress gateways in network
|
||||||
var networkNodes, egressNetworkNodes, err = getNetworkEgressAndNodes(network.NetID)
|
var networkNodes, egressNetworkNodes, err = getNetworkEgressAndNodes(network.NetID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return peers, nil
|
return peers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// udppeers = the peers parsed from the local interface
|
||||||
|
// gives us correct port to reach
|
||||||
udppeers, errN := database.GetPeers(network.NetID)
|
udppeers, errN := database.GetPeers(network.NetID)
|
||||||
if errN != nil {
|
if errN != nil {
|
||||||
logger.Log(2, errN.Error())
|
logger.Log(2, errN.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// gets all the ACL rules
|
||||||
currentNetworkACLs, aclErr := nodeacls.FetchAllACLs(nodeacls.NetworkID(network.NetID))
|
currentNetworkACLs, aclErr := nodeacls.FetchAllACLs(nodeacls.NetworkID(network.NetID))
|
||||||
if aclErr != nil {
|
if aclErr != nil {
|
||||||
return peers, aclErr
|
return peers, aclErr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
at this point we have 4 lists of node information:
|
||||||
|
- networkNodes: all nodes in network (models.Node)
|
||||||
|
- egressNetworkNodes: all egress gateways in network (models.Node)
|
||||||
|
- udppeers: all peers in database (parsed by server off of active WireGuard interface)
|
||||||
|
- currentNetworkACLs: all ACL rules associated with the network
|
||||||
|
- peers: a currently empty list that will be filled and returned
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// we now parse through all networkNodes and format properly to set as "peers"
|
||||||
for _, node := range networkNodes {
|
for _, node := range networkNodes {
|
||||||
|
|
||||||
|
// skip over any node that is disallowed by ACL rules
|
||||||
if !currentNetworkACLs.IsAllowed(acls.AclID(nodeid), acls.AclID(node.ID)) {
|
if !currentNetworkACLs.IsAllowed(acls.AclID(nodeid), acls.AclID(node.ID)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create an empty model to fill with peer info
|
||||||
var peer = models.Node{}
|
var peer = models.Node{}
|
||||||
|
|
||||||
|
// set egress gateway information if it's an egress gateway
|
||||||
if node.IsEgressGateway == "yes" { // handle egress stuff
|
if node.IsEgressGateway == "yes" { // handle egress stuff
|
||||||
peer.EgressGatewayRanges = node.EgressGatewayRanges
|
peer.EgressGatewayRanges = node.EgressGatewayRanges
|
||||||
peer.IsEgressGateway = node.IsEgressGateway
|
peer.IsEgressGateway = node.IsEgressGateway
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set ingress gateway information
|
||||||
peer.IsIngressGateway = node.IsIngressGateway
|
peer.IsIngressGateway = node.IsIngressGateway
|
||||||
|
|
||||||
|
/*
|
||||||
|
- similar to ACLs, we must determine if peer is allowed based on Relay information
|
||||||
|
- if the nodes is "not relayed" (not behind a relay), it is ok
|
||||||
|
- if the node IS relayed, but excludeRelay has not been marked, it is ok
|
||||||
|
- excludeRelayed is marked for any node that is NOT a Relay Server
|
||||||
|
- therefore, the peer is allowed as long as it is not "relayed", or the node it is being sent to is its relay server
|
||||||
|
*/
|
||||||
allow := node.IsRelayed != "yes" || !excludeRelayed
|
allow := node.IsRelayed != "yes" || !excludeRelayed
|
||||||
|
|
||||||
|
// confirm conditions allow node to be added as peer
|
||||||
|
// node should be in same network, not pending, and "allowed" based on above logic
|
||||||
if node.Network == network.NetID && node.IsPending != "yes" && allow {
|
if node.Network == network.NetID && node.IsPending != "yes" && allow {
|
||||||
|
|
||||||
|
// node info is cleansed to remove sensitive info using setPeerInfo
|
||||||
peer = setPeerInfo(&node)
|
peer = setPeerInfo(&node)
|
||||||
|
|
||||||
|
// Sets ListenPort to UDP Hole Punching Port assuming:
|
||||||
|
// - UDP Hole Punching is enabled
|
||||||
|
// - udppeers retrieval did not return an error
|
||||||
|
// - the endpoint is valid
|
||||||
if node.UDPHolePunch == "yes" && errN == nil && CheckEndpoint(udppeers[node.PublicKey]) {
|
if node.UDPHolePunch == "yes" && errN == nil && CheckEndpoint(udppeers[node.PublicKey]) {
|
||||||
endpointstring := udppeers[node.PublicKey]
|
endpointstring := udppeers[node.PublicKey]
|
||||||
endpointarr := strings.Split(endpointstring, ":")
|
endpointarr := strings.Split(endpointstring, ":")
|
||||||
if len(endpointarr) == 2 {
|
if len(endpointarr) == 2 {
|
||||||
port, err := strconv.Atoi(endpointarr[1])
|
port, err := strconv.Atoi(endpointarr[1])
|
||||||
if err == nil {
|
if err == nil {
|
||||||
// peer.Endpoint = endpointarr[0]
|
|
||||||
peer.ListenPort = int32(port)
|
peer.ListenPort = int32(port)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if udp hole punching is on, but port is still set to default (e.g. 51821), use the LocalListenPort
|
|
||||||
// removing IsStatic check. IsStatic will now ONLY refer to endpoint.
|
// if udp hole punching is on, but the node's port is still set to default (e.g. 51821), use the LocalListenPort
|
||||||
//if node.UDPHolePunch == "yes" && node.IsStatic != "yes" && peer.ListenPort == node.ListenPort {
|
// or, if port is for some reason zero use the LocalListenPort
|
||||||
if node.UDPHolePunch == "yes" && peer.ListenPort == node.ListenPort {
|
// but only do this if LocalListenPort is not zero
|
||||||
|
if node.UDPHolePunch == "yes" &&
|
||||||
|
((peer.ListenPort == node.ListenPort || peer.ListenPort == 0) && node.LocalListenPort != 0) {
|
||||||
peer.ListenPort = node.LocalListenPort
|
peer.ListenPort = node.LocalListenPort
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if the node is a relay, append the network cidr and any relayed egress ranges
|
||||||
if node.IsRelay == "yes" { // TODO, check if addressrange6 needs to be appended
|
if node.IsRelay == "yes" { // TODO, check if addressrange6 needs to be appended
|
||||||
peer.AllowedIPs = append(peer.AllowedIPs, network.AddressRange)
|
peer.AllowedIPs = append(peer.AllowedIPs, network.AddressRange)
|
||||||
for _, egressNode := range egressNetworkNodes {
|
for _, egressNode := range egressNetworkNodes {
|
||||||
@@ -94,6 +120,8 @@ func GetNodePeers(network *models.Network, nodeid string, excludeRelayed bool, i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if the node is an ingress gateway, append all the extclient allowedips
|
||||||
if peer.IsIngressGateway == "yes" { // handle ingress stuff
|
if peer.IsIngressGateway == "yes" { // handle ingress stuff
|
||||||
if currentExtClients, err := GetExtPeersList(&node); err == nil {
|
if currentExtClients, err := GetExtPeersList(&node); err == nil {
|
||||||
for i := range currentExtClients {
|
for i := range currentExtClients {
|
||||||
@@ -107,6 +135,7 @@ func GetNodePeers(network *models.Network, nodeid string, excludeRelayed bool, i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// dont appent if this isn't a p2p network or if ACLs disallow
|
||||||
if (!isP2S || peer.IsHub == "yes") && currentNetworkACLs.IsAllowed(acls.AclID(nodeid), acls.AclID(node.ID)) {
|
if (!isP2S || peer.IsHub == "yes") && currentNetworkACLs.IsAllowed(acls.AclID(nodeid), acls.AclID(node.ID)) {
|
||||||
peers = append(peers, peer)
|
peers = append(peers, peer)
|
||||||
}
|
}
|
||||||
|
@@ -115,6 +115,7 @@ func RandomString(length int) string {
|
|||||||
|
|
||||||
// == Private Methods ==
|
// == Private Methods ==
|
||||||
|
|
||||||
|
// getNetworkEgressAndNodes - returns two slices, #1 is all nodes in the network, #2 is the egress nodes in the network
|
||||||
func getNetworkEgressAndNodes(networkName string) ([]models.Node, []models.Node, error) {
|
func getNetworkEgressAndNodes(networkName string) ([]models.Node, []models.Node, error) {
|
||||||
var networkNodes, egressNetworkNodes []models.Node
|
var networkNodes, egressNetworkNodes []models.Node
|
||||||
collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
|
collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
|
||||||
|
Reference in New Issue
Block a user