|
@@ -3,7 +3,6 @@ package logic
|
|
import (
|
|
import (
|
|
"context"
|
|
"context"
|
|
"errors"
|
|
"errors"
|
|
- "fmt"
|
|
|
|
"maps"
|
|
"maps"
|
|
"net"
|
|
"net"
|
|
|
|
|
|
@@ -690,188 +689,6 @@ func RemoveUserFromAclPolicy(userName string) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-// IsNodeAllowedToCommunicate - check node is allowed to communicate with the peer // ADD ALLOWED DIRECTION - 0 => node -> peer, 1 => peer-> node,
|
|
|
|
-func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool) (bool, []models.Acl) {
|
|
|
|
- var nodeId, peerId string
|
|
|
|
- // if peer.IsFailOver && node.FailedOverBy != uuid.Nil && node.FailedOverBy == peer.ID {
|
|
|
|
- // return true, []models.Acl{}
|
|
|
|
- // }
|
|
|
|
- // if node.IsFailOver && peer.FailedOverBy != uuid.Nil && peer.FailedOverBy == node.ID {
|
|
|
|
- // return true, []models.Acl{}
|
|
|
|
- // }
|
|
|
|
- // if node.IsGw && peer.IsRelayed && peer.RelayedBy == node.ID.String() {
|
|
|
|
- // return true, []models.Acl{}
|
|
|
|
- // }
|
|
|
|
- // if peer.IsGw && node.IsRelayed && node.RelayedBy == peer.ID.String() {
|
|
|
|
- // return true, []models.Acl{}
|
|
|
|
- // }
|
|
|
|
- if node.IsStatic {
|
|
|
|
- nodeId = node.StaticNode.ClientID
|
|
|
|
- node = node.StaticNode.ConvertToStaticNode()
|
|
|
|
- } else {
|
|
|
|
- nodeId = node.ID.String()
|
|
|
|
- }
|
|
|
|
- if peer.IsStatic {
|
|
|
|
- peerId = peer.StaticNode.ClientID
|
|
|
|
- peer = peer.StaticNode.ConvertToStaticNode()
|
|
|
|
- } else {
|
|
|
|
- peerId = peer.ID.String()
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- var nodeTags, peerTags map[models.TagID]struct{}
|
|
|
|
- if node.Mutex != nil {
|
|
|
|
- node.Mutex.Lock()
|
|
|
|
- nodeTags = maps.Clone(node.Tags)
|
|
|
|
- node.Mutex.Unlock()
|
|
|
|
- } else {
|
|
|
|
- nodeTags = node.Tags
|
|
|
|
- }
|
|
|
|
- if peer.Mutex != nil {
|
|
|
|
- peer.Mutex.Lock()
|
|
|
|
- peerTags = maps.Clone(peer.Tags)
|
|
|
|
- peer.Mutex.Unlock()
|
|
|
|
- } else {
|
|
|
|
- peerTags = peer.Tags
|
|
|
|
- }
|
|
|
|
- if nodeTags == nil {
|
|
|
|
- nodeTags = make(map[models.TagID]struct{})
|
|
|
|
- }
|
|
|
|
- if peerTags == nil {
|
|
|
|
- peerTags = make(map[models.TagID]struct{})
|
|
|
|
- }
|
|
|
|
- nodeTags[models.TagID(nodeId)] = struct{}{}
|
|
|
|
- peerTags[models.TagID(peerId)] = struct{}{}
|
|
|
|
- if checkDefaultPolicy {
|
|
|
|
- // check default policy if all allowed return true
|
|
|
|
- defaultPolicy, err := logic.GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
|
|
|
|
- if err == nil {
|
|
|
|
- if defaultPolicy.Enabled {
|
|
|
|
- return true, []models.Acl{defaultPolicy}
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- allowedPolicies := []models.Acl{}
|
|
|
|
- defer func() {
|
|
|
|
- allowedPolicies = logic.UniquePolicies(allowedPolicies)
|
|
|
|
- }()
|
|
|
|
- // list device policies
|
|
|
|
- policies := logic.ListDevicePolicies(models.NetworkID(peer.Network))
|
|
|
|
- srcMap := make(map[string]struct{})
|
|
|
|
- dstMap := make(map[string]struct{})
|
|
|
|
- defer func() {
|
|
|
|
- srcMap = nil
|
|
|
|
- dstMap = nil
|
|
|
|
- }()
|
|
|
|
- for _, policy := range policies {
|
|
|
|
- if !policy.Enabled {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- allowed := false
|
|
|
|
- srcMap = logic.ConvAclTagToValueMap(policy.Src)
|
|
|
|
- dstMap = logic.ConvAclTagToValueMap(policy.Dst)
|
|
|
|
- for _, dst := range policy.Dst {
|
|
|
|
- if dst.ID == models.EgressID {
|
|
|
|
- e := schema.Egress{ID: dst.Value}
|
|
|
|
- err := e.Get(db.WithContext(context.TODO()))
|
|
|
|
- if err == nil && e.Status {
|
|
|
|
- for nodeID := range e.Nodes {
|
|
|
|
- dstMap[nodeID] = struct{}{}
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- _, srcAll := srcMap["*"]
|
|
|
|
- _, dstAll := dstMap["*"]
|
|
|
|
- if policy.AllowedDirection == models.TrafficDirectionBi {
|
|
|
|
- if _, ok := srcMap[nodeId]; ok || srcAll {
|
|
|
|
- if _, ok := dstMap[peerId]; ok || dstAll {
|
|
|
|
- allowedPolicies = append(allowedPolicies, policy)
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- if _, ok := dstMap[nodeId]; ok || dstAll {
|
|
|
|
- if _, ok := srcMap[peerId]; ok || srcAll {
|
|
|
|
- allowedPolicies = append(allowedPolicies, policy)
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if _, ok := dstMap[peerId]; ok || dstAll {
|
|
|
|
- if _, ok := srcMap[nodeId]; ok || srcAll {
|
|
|
|
- allowedPolicies = append(allowedPolicies, policy)
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if policy.AllowedDirection == models.TrafficDirectionBi {
|
|
|
|
-
|
|
|
|
- for tagID := range nodeTags {
|
|
|
|
-
|
|
|
|
- if _, ok := dstMap[tagID.String()]; ok || dstAll {
|
|
|
|
- if srcAll {
|
|
|
|
- allowed = true
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- for tagID := range peerTags {
|
|
|
|
- if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
- allowed = true
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if allowed {
|
|
|
|
- allowedPolicies = append(allowedPolicies, policy)
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- if _, ok := srcMap[tagID.String()]; ok || srcAll {
|
|
|
|
- if dstAll {
|
|
|
|
- allowed = true
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- for tagID := range peerTags {
|
|
|
|
- if _, ok := dstMap[tagID.String()]; ok {
|
|
|
|
- allowed = true
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if allowed {
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if allowed {
|
|
|
|
- allowedPolicies = append(allowedPolicies, policy)
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- for tagID := range peerTags {
|
|
|
|
- if _, ok := dstMap[tagID.String()]; ok || dstAll {
|
|
|
|
- if srcAll {
|
|
|
|
- allowed = true
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- for tagID := range nodeTags {
|
|
|
|
- if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
- allowed = true
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if allowed {
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if allowed {
|
|
|
|
- allowedPolicies = append(allowedPolicies, policy)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if len(allowedPolicies) > 0 {
|
|
|
|
- return true, allowedPolicies
|
|
|
|
- }
|
|
|
|
- return false, allowedPolicies
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
// UpdateDeviceTag - updates device tag on acl policies
|
|
// UpdateDeviceTag - updates device tag on acl policies
|
|
func UpdateDeviceTag(OldID, newID models.TagID, netID models.NetworkID) {
|
|
func UpdateDeviceTag(OldID, newID models.TagID, netID models.NetworkID) {
|
|
acls := logic.ListDevicePolicies(netID)
|
|
acls := logic.ListDevicePolicies(netID)
|
|
@@ -948,7 +765,7 @@ func RemoveDeviceTagFromAclPolicies(tagID models.TagID, netID models.NetworkID)
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
-func getEgressUserRulesForNode(targetnode *models.Node,
|
|
|
|
|
|
+func GetEgressUserRulesForNode(targetnode *models.Node,
|
|
rules map[string]models.AclRule) map[string]models.AclRule {
|
|
rules map[string]models.AclRule) map[string]models.AclRule {
|
|
userNodes := logic.GetStaticUserNodesByNetwork(models.NetworkID(targetnode.Network))
|
|
userNodes := logic.GetStaticUserNodesByNetwork(models.NetworkID(targetnode.Network))
|
|
userGrpMap := GetUserGrpMap()
|
|
userGrpMap := GetUserGrpMap()
|
|
@@ -1108,7 +925,7 @@ func getEgressUserRulesForNode(targetnode *models.Node,
|
|
return rules
|
|
return rules
|
|
}
|
|
}
|
|
|
|
|
|
-func getUserAclRulesForNode(targetnode *models.Node,
|
|
|
|
|
|
+func GetUserAclRulesForNode(targetnode *models.Node,
|
|
rules map[string]models.AclRule) map[string]models.AclRule {
|
|
rules map[string]models.AclRule) map[string]models.AclRule {
|
|
userNodes := logic.GetStaticUserNodesByNetwork(models.NetworkID(targetnode.Network))
|
|
userNodes := logic.GetStaticUserNodesByNetwork(models.NetworkID(targetnode.Network))
|
|
userGrpMap := GetUserGrpMap()
|
|
userGrpMap := GetUserGrpMap()
|
|
@@ -1231,48 +1048,6 @@ func getUserAclRulesForNode(targetnode *models.Node,
|
|
return rules
|
|
return rules
|
|
}
|
|
}
|
|
|
|
|
|
-func CheckIfAnyActiveEgressPolicy(targetNode models.Node, acls []models.Acl) bool {
|
|
|
|
- if !targetNode.EgressDetails.IsEgressGateway {
|
|
|
|
- return false
|
|
|
|
- }
|
|
|
|
- var targetNodeTags = make(map[models.TagID]struct{})
|
|
|
|
- if targetNode.Mutex != nil {
|
|
|
|
- targetNode.Mutex.Lock()
|
|
|
|
- targetNodeTags = maps.Clone(targetNode.Tags)
|
|
|
|
- targetNode.Mutex.Unlock()
|
|
|
|
- } else {
|
|
|
|
- targetNodeTags = maps.Clone(targetNode.Tags)
|
|
|
|
- }
|
|
|
|
- if targetNodeTags == nil {
|
|
|
|
- targetNodeTags = make(map[models.TagID]struct{})
|
|
|
|
- }
|
|
|
|
- targetNodeTags[models.TagID(targetNode.ID.String())] = struct{}{}
|
|
|
|
- targetNodeTags["*"] = struct{}{}
|
|
|
|
- for _, acl := range acls {
|
|
|
|
- if !acl.Enabled {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- srcTags := logic.ConvAclTagToValueMap(acl.Src)
|
|
|
|
- for _, dst := range acl.Dst {
|
|
|
|
- if dst.ID == models.EgressID {
|
|
|
|
- e := schema.Egress{ID: dst.Value}
|
|
|
|
- err := e.Get(db.WithContext(context.TODO()))
|
|
|
|
- if err == nil && e.Status {
|
|
|
|
- for nodeTag := range targetNodeTags {
|
|
|
|
- if _, ok := srcTags[nodeTag.String()]; ok {
|
|
|
|
- return true
|
|
|
|
- }
|
|
|
|
- if _, ok := srcTags[targetNode.ID.String()]; ok {
|
|
|
|
- return true
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return false
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
func CheckIfAnyPolicyisUniDirectional(targetNode models.Node, acls []models.Acl) bool {
|
|
func CheckIfAnyPolicyisUniDirectional(targetNode models.Node, acls []models.Acl) bool {
|
|
var targetNodeTags = make(map[models.TagID]struct{})
|
|
var targetNodeTags = make(map[models.TagID]struct{})
|
|
if targetNode.Mutex != nil {
|
|
if targetNode.Mutex != nil {
|
|
@@ -1320,535 +1095,69 @@ func CheckIfAnyPolicyisUniDirectional(targetNode models.Node, acls []models.Acl)
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
|
|
|
|
-func GetAclRulesForNode(targetnodeI *models.Node) (rules map[string]models.AclRule) {
|
|
|
|
- targetnode := *targetnodeI
|
|
|
|
- defer func() {
|
|
|
|
- //if !targetnode.IsIngressGateway {
|
|
|
|
- rules = getUserAclRulesForNode(&targetnode, rules)
|
|
|
|
- //}
|
|
|
|
- }()
|
|
|
|
- rules = make(map[string]models.AclRule)
|
|
|
|
- var taggedNodes map[models.TagID][]models.Node
|
|
|
|
- if targetnode.IsIngressGateway {
|
|
|
|
- taggedNodes = GetTagMapWithNodesByNetwork(models.NetworkID(targetnode.Network), false)
|
|
|
|
- } else {
|
|
|
|
- taggedNodes = GetTagMapWithNodesByNetwork(models.NetworkID(targetnode.Network), true)
|
|
|
|
- }
|
|
|
|
- acls := logic.ListDevicePolicies(models.NetworkID(targetnode.Network))
|
|
|
|
- var targetNodeTags = make(map[models.TagID]struct{})
|
|
|
|
- if targetnode.Mutex != nil {
|
|
|
|
- targetnode.Mutex.Lock()
|
|
|
|
- targetNodeTags = maps.Clone(targetnode.Tags)
|
|
|
|
- targetnode.Mutex.Unlock()
|
|
|
|
- } else {
|
|
|
|
- targetNodeTags = maps.Clone(targetnode.Tags)
|
|
|
|
- }
|
|
|
|
- if targetNodeTags == nil {
|
|
|
|
- targetNodeTags = make(map[models.TagID]struct{})
|
|
|
|
- }
|
|
|
|
- targetNodeTags[models.TagID(targetnode.ID.String())] = struct{}{}
|
|
|
|
- targetNodeTags["*"] = struct{}{}
|
|
|
|
- for _, acl := range acls {
|
|
|
|
- if !acl.Enabled {
|
|
|
|
- continue
|
|
|
|
|
|
+func GetTagMapWithNodesByNetwork(netID models.NetworkID, withStaticNodes bool) (tagNodesMap map[models.TagID][]models.Node) {
|
|
|
|
+ tagNodesMap = make(map[models.TagID][]models.Node)
|
|
|
|
+ nodes, _ := logic.GetNetworkNodes(netID.String())
|
|
|
|
+ for _, nodeI := range nodes {
|
|
|
|
+ tagNodesMap[models.TagID(nodeI.ID.String())] = []models.Node{
|
|
|
|
+ nodeI,
|
|
}
|
|
}
|
|
- srcTags := logic.ConvAclTagToValueMap(acl.Src)
|
|
|
|
- dstTags := logic.ConvAclTagToValueMap(acl.Dst)
|
|
|
|
- for _, dst := range acl.Dst {
|
|
|
|
- if dst.ID == models.EgressID {
|
|
|
|
- e := schema.Egress{ID: dst.Value}
|
|
|
|
- err := e.Get(db.WithContext(context.TODO()))
|
|
|
|
- if err == nil && e.Status {
|
|
|
|
- for nodeID := range e.Nodes {
|
|
|
|
- dstTags[nodeID] = struct{}{}
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ if nodeI.Tags == nil {
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
- _, srcAll := srcTags["*"]
|
|
|
|
- _, dstAll := dstTags["*"]
|
|
|
|
- aclRule := models.AclRule{
|
|
|
|
- ID: acl.ID,
|
|
|
|
- AllowedProtocol: acl.Proto,
|
|
|
|
- AllowedPorts: acl.Port,
|
|
|
|
- Direction: acl.AllowedDirection,
|
|
|
|
- Allowed: true,
|
|
|
|
|
|
+ if nodeI.Mutex != nil {
|
|
|
|
+ nodeI.Mutex.Lock()
|
|
}
|
|
}
|
|
- for nodeTag := range targetNodeTags {
|
|
|
|
- if acl.AllowedDirection == models.TrafficDirectionBi {
|
|
|
|
- var existsInSrcTag bool
|
|
|
|
- var existsInDstTag bool
|
|
|
|
-
|
|
|
|
- if _, ok := srcTags[nodeTag.String()]; ok || srcAll {
|
|
|
|
- existsInSrcTag = true
|
|
|
|
- }
|
|
|
|
- if _, ok := srcTags[targetnode.ID.String()]; ok || srcAll {
|
|
|
|
- existsInSrcTag = true
|
|
|
|
- }
|
|
|
|
- if _, ok := dstTags[nodeTag.String()]; ok || dstAll {
|
|
|
|
- existsInDstTag = true
|
|
|
|
- }
|
|
|
|
- if _, ok := dstTags[targetnode.ID.String()]; ok || dstAll {
|
|
|
|
- existsInDstTag = true
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if existsInSrcTag /* && !existsInDstTag*/ {
|
|
|
|
- // get all dst tags
|
|
|
|
- for dst := range dstTags {
|
|
|
|
- if dst == nodeTag.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- // Get peers in the tags and add allowed rules
|
|
|
|
- nodes := taggedNodes[models.TagID(dst)]
|
|
|
|
- if dst != targetnode.ID.String() {
|
|
|
|
- node, err := logic.GetNodeByID(dst)
|
|
|
|
- if err == nil {
|
|
|
|
- nodes = append(nodes, node)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for _, node := range nodes {
|
|
|
|
- if node.ID == targetnode.ID {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.IngressGatewayID == targetnode.ID.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if node.Address.IP != nil {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.Address6.IP != nil {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address != "" {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.StaticNode.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address6 != "" {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.StaticNode.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if existsInDstTag /*&& !existsInSrcTag*/ {
|
|
|
|
- // get all src tags
|
|
|
|
- for src := range srcTags {
|
|
|
|
- if src == nodeTag.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- // Get peers in the tags and add allowed rules
|
|
|
|
- nodes := taggedNodes[models.TagID(src)]
|
|
|
|
- if src != targetnode.ID.String() {
|
|
|
|
- node, err := logic.GetNodeByID(src)
|
|
|
|
- if err == nil {
|
|
|
|
- nodes = append(nodes, node)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- for _, node := range nodes {
|
|
|
|
- if node.ID == targetnode.ID {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.IngressGatewayID == targetnode.ID.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if node.Address.IP != nil {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.Address6.IP != nil {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address != "" {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.StaticNode.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address6 != "" {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.StaticNode.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- // if existsInDstTag && existsInSrcTag {
|
|
|
|
- // nodes := taggedNodes[nodeTag]
|
|
|
|
- // for srcID := range srcTags {
|
|
|
|
- // if srcID == targetnode.ID.String() {
|
|
|
|
- // continue
|
|
|
|
- // }
|
|
|
|
- // node, err := GetNodeByID(srcID)
|
|
|
|
- // if err == nil {
|
|
|
|
- // nodes = append(nodes, node)
|
|
|
|
- // }
|
|
|
|
- // }
|
|
|
|
- // for dstID := range dstTags {
|
|
|
|
- // if dstID == targetnode.ID.String() {
|
|
|
|
- // continue
|
|
|
|
- // }
|
|
|
|
- // node, err := GetNodeByID(dstID)
|
|
|
|
- // if err == nil {
|
|
|
|
- // nodes = append(nodes, node)
|
|
|
|
- // }
|
|
|
|
- // }
|
|
|
|
- // for _, node := range nodes {
|
|
|
|
- // if node.ID == targetnode.ID {
|
|
|
|
- // continue
|
|
|
|
- // }
|
|
|
|
- // if node.IsStatic && node.StaticNode.IngressGatewayID == targetnode.ID.String() {
|
|
|
|
- // continue
|
|
|
|
- // }
|
|
|
|
- // if node.Address.IP != nil {
|
|
|
|
- // aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
|
|
- // }
|
|
|
|
- // if node.Address6.IP != nil {
|
|
|
|
- // aclRule.IP6List = append(aclRule.IP6List, node.AddressIPNet6())
|
|
|
|
- // }
|
|
|
|
- // if node.IsStatic && node.StaticNode.Address != "" {
|
|
|
|
- // aclRule.IPList = append(aclRule.IPList, node.StaticNode.AddressIPNet4())
|
|
|
|
- // }
|
|
|
|
- // if node.IsStatic && node.StaticNode.Address6 != "" {
|
|
|
|
- // aclRule.IP6List = append(aclRule.IP6List, node.StaticNode.AddressIPNet6())
|
|
|
|
- // }
|
|
|
|
- // }
|
|
|
|
- // }
|
|
|
|
- } else {
|
|
|
|
- _, all := dstTags["*"]
|
|
|
|
- if _, ok := dstTags[nodeTag.String()]; ok || all {
|
|
|
|
- // get all src tags
|
|
|
|
- for src := range srcTags {
|
|
|
|
- if src == nodeTag.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- // Get peers in the tags and add allowed rules
|
|
|
|
- nodes := taggedNodes[models.TagID(src)]
|
|
|
|
- for _, node := range nodes {
|
|
|
|
- if node.ID == targetnode.ID {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.IngressGatewayID == targetnode.ID.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if node.Address.IP != nil {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.Address6.IP != nil {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address != "" {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.StaticNode.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address6 != "" {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.StaticNode.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ for nodeTagID := range nodeI.Tags {
|
|
|
|
+ if nodeTagID == models.TagID(nodeI.ID.String()) {
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
|
|
}
|
|
}
|
|
-
|
|
|
|
- if len(aclRule.IPList) > 0 || len(aclRule.IP6List) > 0 {
|
|
|
|
- aclRule.IPList = logic.UniqueIPNetList(aclRule.IPList)
|
|
|
|
- aclRule.IP6List = logic.UniqueIPNetList(aclRule.IP6List)
|
|
|
|
- rules[acl.ID] = aclRule
|
|
|
|
|
|
+ if nodeI.Mutex != nil {
|
|
|
|
+ nodeI.Mutex.Unlock()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- return rules
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func GetAclRuleForInetGw(targetnode models.Node) (rules map[string]models.AclRule) {
|
|
|
|
- rules = make(map[string]models.AclRule)
|
|
|
|
- if targetnode.IsInternetGateway {
|
|
|
|
- aclRule := models.AclRule{
|
|
|
|
- ID: fmt.Sprintf("%s-inet-gw-internal-rule", targetnode.ID.String()),
|
|
|
|
- AllowedProtocol: models.ALL,
|
|
|
|
- AllowedPorts: []string{},
|
|
|
|
- Direction: models.TrafficDirectionBi,
|
|
|
|
- Allowed: true,
|
|
|
|
- }
|
|
|
|
- if targetnode.NetworkRange.IP != nil {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, targetnode.NetworkRange)
|
|
|
|
- _, allIpv4, _ := net.ParseCIDR(logic.IPv4Network)
|
|
|
|
- aclRule.Dst = append(aclRule.Dst, *allIpv4)
|
|
|
|
- }
|
|
|
|
- if targetnode.NetworkRange6.IP != nil {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, targetnode.NetworkRange6)
|
|
|
|
- _, allIpv6, _ := net.ParseCIDR(logic.IPv6Network)
|
|
|
|
- aclRule.Dst6 = append(aclRule.Dst6, *allIpv6)
|
|
|
|
- }
|
|
|
|
- rules[aclRule.ID] = aclRule
|
|
|
|
|
|
+ tagNodesMap["*"] = nodes
|
|
|
|
+ if !withStaticNodes {
|
|
|
|
+ return
|
|
}
|
|
}
|
|
- return
|
|
|
|
|
|
+ return AddTagMapWithStaticNodes(netID, tagNodesMap)
|
|
}
|
|
}
|
|
|
|
|
|
-func GetEgressRulesForNode(targetnode models.Node) (rules map[string]models.AclRule) {
|
|
|
|
- rules = make(map[string]models.AclRule)
|
|
|
|
- defer func() {
|
|
|
|
- rules = getEgressUserRulesForNode(&targetnode, rules)
|
|
|
|
- }()
|
|
|
|
- taggedNodes := GetTagMapWithNodesByNetwork(models.NetworkID(targetnode.Network), true)
|
|
|
|
-
|
|
|
|
- acls := logic.ListDevicePolicies(models.NetworkID(targetnode.Network))
|
|
|
|
- var targetNodeTags = make(map[models.TagID]struct{})
|
|
|
|
- targetNodeTags["*"] = struct{}{}
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- if target node is egress gateway
|
|
|
|
- if acl policy has egress route and it is present in target node egress ranges
|
|
|
|
- fetch all the nodes in that policy and add rules
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
- egs, _ := (&schema.Egress{Network: targetnode.Network}).ListByNetwork(db.WithContext(context.TODO()))
|
|
|
|
- if len(egs) == 0 {
|
|
|
|
- return
|
|
|
|
|
|
+func AddTagMapWithStaticNodes(netID models.NetworkID,
|
|
|
|
+ tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
|
|
|
|
+ extclients, err := logic.GetNetworkExtClients(netID.String())
|
|
|
|
+ if err != nil {
|
|
|
|
+ return tagNodesMap
|
|
}
|
|
}
|
|
- for _, egI := range egs {
|
|
|
|
- if !egI.Status {
|
|
|
|
|
|
+ for _, extclient := range extclients {
|
|
|
|
+ if extclient.RemoteAccessClientID != "" {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- if _, ok := egI.Nodes[targetnode.ID.String()]; ok {
|
|
|
|
- targetNodeTags[models.TagID(egI.Range)] = struct{}{}
|
|
|
|
- targetNodeTags[models.TagID(egI.ID)] = struct{}{}
|
|
|
|
|
|
+ tagNodesMap[models.TagID(extclient.ClientID)] = []models.Node{
|
|
|
|
+ {
|
|
|
|
+ IsStatic: true,
|
|
|
|
+ StaticNode: extclient,
|
|
|
|
+ },
|
|
}
|
|
}
|
|
- }
|
|
|
|
- for _, acl := range acls {
|
|
|
|
- if !acl.Enabled {
|
|
|
|
|
|
+ if extclient.Tags == nil {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- srcTags := logic.ConvAclTagToValueMap(acl.Src)
|
|
|
|
- dstTags := logic.ConvAclTagToValueMap(acl.Dst)
|
|
|
|
- _, srcAll := srcTags["*"]
|
|
|
|
- _, dstAll := dstTags["*"]
|
|
|
|
- aclRule := models.AclRule{
|
|
|
|
- ID: acl.ID,
|
|
|
|
- AllowedProtocol: acl.Proto,
|
|
|
|
- AllowedPorts: acl.Port,
|
|
|
|
- Direction: acl.AllowedDirection,
|
|
|
|
- Allowed: true,
|
|
|
|
- }
|
|
|
|
- for nodeTag := range targetNodeTags {
|
|
|
|
-
|
|
|
|
- if nodeTag != "*" {
|
|
|
|
- ip, cidr, err := net.ParseCIDR(nodeTag.String())
|
|
|
|
- if err == nil {
|
|
|
|
- if ip.To4() != nil {
|
|
|
|
- aclRule.Dst = append(aclRule.Dst, *cidr)
|
|
|
|
- } else {
|
|
|
|
- aclRule.Dst6 = append(aclRule.Dst6, *cidr)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if acl.AllowedDirection == models.TrafficDirectionBi {
|
|
|
|
- var existsInSrcTag bool
|
|
|
|
- var existsInDstTag bool
|
|
|
|
- if _, ok := srcTags[nodeTag.String()]; ok || srcAll {
|
|
|
|
- existsInSrcTag = true
|
|
|
|
- }
|
|
|
|
- if _, ok := dstTags[nodeTag.String()]; ok || dstAll {
|
|
|
|
- existsInDstTag = true
|
|
|
|
- }
|
|
|
|
- // if srcAll || dstAll {
|
|
|
|
- // if targetnode.NetworkRange.IP != nil {
|
|
|
|
- // aclRule.IPList = append(aclRule.IPList, targetnode.NetworkRange)
|
|
|
|
- // }
|
|
|
|
- // if targetnode.NetworkRange6.IP != nil {
|
|
|
|
- // aclRule.IP6List = append(aclRule.IP6List, targetnode.NetworkRange6)
|
|
|
|
- // }
|
|
|
|
- // break
|
|
|
|
- // }
|
|
|
|
- if existsInSrcTag && !existsInDstTag {
|
|
|
|
- // get all dst tags
|
|
|
|
- for dst := range dstTags {
|
|
|
|
- if dst == nodeTag.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- // Get peers in the tags and add allowed rules
|
|
|
|
- nodes := taggedNodes[models.TagID(dst)]
|
|
|
|
- if dst != targetnode.ID.String() {
|
|
|
|
- node, err := logic.GetNodeByID(dst)
|
|
|
|
- if err == nil {
|
|
|
|
- nodes = append(nodes, node)
|
|
|
|
- }
|
|
|
|
- extclient, err := logic.GetExtClient(dst, targetnode.Network)
|
|
|
|
- if err == nil {
|
|
|
|
- nodes = append(nodes, extclient.ConvertToStaticNode())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for _, node := range nodes {
|
|
|
|
- if node.ID == targetnode.ID {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if node.Address.IP != nil {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.Address6.IP != nil {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address != "" {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.StaticNode.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address6 != "" {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.StaticNode.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if existsInDstTag && !existsInSrcTag {
|
|
|
|
- // get all src tags
|
|
|
|
- for src := range srcTags {
|
|
|
|
- if src == nodeTag.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- // Get peers in the tags and add allowed rules
|
|
|
|
- nodes := taggedNodes[models.TagID(src)]
|
|
|
|
- if src != targetnode.ID.String() {
|
|
|
|
- node, err := logic.GetNodeByID(src)
|
|
|
|
- if err == nil {
|
|
|
|
- nodes = append(nodes, node)
|
|
|
|
- }
|
|
|
|
- extclient, err := logic.GetExtClient(src, targetnode.Network)
|
|
|
|
- if err == nil {
|
|
|
|
- nodes = append(nodes, extclient.ConvertToStaticNode())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- for _, node := range nodes {
|
|
|
|
- if node.ID == targetnode.ID {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if node.Address.IP != nil {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.Address6.IP != nil {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address != "" {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.StaticNode.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address6 != "" {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.StaticNode.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if existsInDstTag && existsInSrcTag {
|
|
|
|
- nodes := taggedNodes[nodeTag]
|
|
|
|
- for srcID := range srcTags {
|
|
|
|
- if srcID == targetnode.ID.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- node, err := logic.GetNodeByID(srcID)
|
|
|
|
- if err == nil {
|
|
|
|
- nodes = append(nodes, node)
|
|
|
|
- }
|
|
|
|
- extclient, err := logic.GetExtClient(srcID, targetnode.Network)
|
|
|
|
- if err == nil {
|
|
|
|
- nodes = append(nodes, extclient.ConvertToStaticNode())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- for dstID := range dstTags {
|
|
|
|
- if dstID == targetnode.ID.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- node, err := logic.GetNodeByID(dstID)
|
|
|
|
- if err == nil {
|
|
|
|
- nodes = append(nodes, node)
|
|
|
|
- }
|
|
|
|
- extclient, err := logic.GetExtClient(dstID, targetnode.Network)
|
|
|
|
- if err == nil {
|
|
|
|
- nodes = append(nodes, extclient.ConvertToStaticNode())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- for _, node := range nodes {
|
|
|
|
- if node.ID == targetnode.ID {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if node.Address.IP != nil {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.Address6.IP != nil {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address != "" {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.StaticNode.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address6 != "" {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.StaticNode.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- if dstAll {
|
|
|
|
- if targetnode.NetworkRange.IP != nil {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, targetnode.NetworkRange)
|
|
|
|
- }
|
|
|
|
- if targetnode.NetworkRange6.IP != nil {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, targetnode.NetworkRange6)
|
|
|
|
- }
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- if _, ok := dstTags[nodeTag.String()]; ok || dstAll {
|
|
|
|
- // get all src tags
|
|
|
|
- for src := range srcTags {
|
|
|
|
- if src == nodeTag.String() {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- // Get peers in the tags and add allowed rules
|
|
|
|
- nodes := taggedNodes[models.TagID(src)]
|
|
|
|
- for _, node := range nodes {
|
|
|
|
- if node.ID == targetnode.ID {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if node.Address.IP != nil {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.Address6.IP != nil {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address != "" {
|
|
|
|
- aclRule.IPList = append(aclRule.IPList, node.StaticNode.AddressIPNet4())
|
|
|
|
- }
|
|
|
|
- if node.IsStatic && node.StaticNode.Address6 != "" {
|
|
|
|
- aclRule.IP6List = append(aclRule.IP6List, node.StaticNode.AddressIPNet6())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
+ if extclient.Mutex != nil {
|
|
|
|
+ extclient.Mutex.Lock()
|
|
}
|
|
}
|
|
- if len(aclRule.IPList) > 0 || len(aclRule.IP6List) > 0 {
|
|
|
|
- aclRule.IPList = logic.UniqueIPNetList(aclRule.IPList)
|
|
|
|
- aclRule.IP6List = logic.UniqueIPNetList(aclRule.IP6List)
|
|
|
|
- rules[acl.ID] = aclRule
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func GetInetClientsFromAclPolicies(eID string) (inetClientIDs []string) {
|
|
|
|
- e := schema.Egress{ID: eID}
|
|
|
|
- err := e.Get(db.WithContext(context.TODO()))
|
|
|
|
- if err != nil || !e.Status {
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- acls, _ := logic.ListAclsByNetwork(models.NetworkID(e.Network))
|
|
|
|
- for _, acl := range acls {
|
|
|
|
- for _, dstI := range acl.Dst {
|
|
|
|
- if dstI.ID == models.EgressID {
|
|
|
|
- if dstI.Value != eID {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- for _, srcI := range acl.Src {
|
|
|
|
- if srcI.Value == "*" {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- if srcI.ID == models.NodeID {
|
|
|
|
- inetClientIDs = append(inetClientIDs, srcI.Value)
|
|
|
|
- }
|
|
|
|
- if srcI.ID == models.NodeTagID {
|
|
|
|
- inetClientIDs = append(inetClientIDs, GetNodeIDsWithTag(models.TagID(srcI.Value))...)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ for tagID := range extclient.Tags {
|
|
|
|
+ if tagID == models.TagID(extclient.ClientID) {
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
|
|
+ tagNodesMap[tagID] = append(tagNodesMap[tagID], extclient.ConvertToStaticNode())
|
|
|
|
+ tagNodesMap["*"] = append(tagNodesMap["*"], extclient.ConvertToStaticNode())
|
|
|
|
+ }
|
|
|
|
+ if extclient.Mutex != nil {
|
|
|
|
+ extclient.Mutex.Unlock()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- return
|
|
|
|
|
|
+ return tagNodesMap
|
|
}
|
|
}
|