|
@@ -51,12 +51,12 @@ func CreateDefaultAclNetworkPolicies(netID models.NetworkID) {
|
|
RuleType: models.DevicePolicy,
|
|
RuleType: models.DevicePolicy,
|
|
Src: []models.AclPolicyTag{
|
|
Src: []models.AclPolicyTag{
|
|
{
|
|
{
|
|
- ID: models.DeviceAclID,
|
|
|
|
|
|
+ ID: models.NodeTagID,
|
|
Value: "*",
|
|
Value: "*",
|
|
}},
|
|
}},
|
|
Dst: []models.AclPolicyTag{
|
|
Dst: []models.AclPolicyTag{
|
|
{
|
|
{
|
|
- ID: models.DeviceAclID,
|
|
|
|
|
|
+ ID: models.NodeTagID,
|
|
Value: "*",
|
|
Value: "*",
|
|
}},
|
|
}},
|
|
AllowedDirection: models.TrafficDirectionBi,
|
|
AllowedDirection: models.TrafficDirectionBi,
|
|
@@ -84,7 +84,7 @@ func CreateDefaultAclNetworkPolicies(netID models.NetworkID) {
|
|
},
|
|
},
|
|
},
|
|
},
|
|
Dst: []models.AclPolicyTag{{
|
|
Dst: []models.AclPolicyTag{{
|
|
- ID: models.DeviceAclID,
|
|
|
|
|
|
+ ID: models.NodeTagID,
|
|
Value: "*",
|
|
Value: "*",
|
|
}},
|
|
}},
|
|
AllowedDirection: models.TrafficDirectionUni,
|
|
AllowedDirection: models.TrafficDirectionUni,
|
|
@@ -95,11 +95,11 @@ func CreateDefaultAclNetworkPolicies(netID models.NetworkID) {
|
|
InsertAcl(defaultUserAcl)
|
|
InsertAcl(defaultUserAcl)
|
|
}
|
|
}
|
|
|
|
|
|
- if !IsAclExists(fmt.Sprintf("%s.%s", netID, "all-remote-access-gws")) {
|
|
|
|
|
|
+ if !IsAclExists(fmt.Sprintf("%s.%s", netID, "all-gateways")) {
|
|
defaultUserAcl := models.Acl{
|
|
defaultUserAcl := models.Acl{
|
|
- ID: fmt.Sprintf("%s.%s", netID, "all-remote-access-gws"),
|
|
|
|
|
|
+ ID: fmt.Sprintf("%s.%s", netID, "all-gateways"),
|
|
Default: true,
|
|
Default: true,
|
|
- Name: "All Remote Access Gateways",
|
|
|
|
|
|
+ Name: "All Gateways",
|
|
NetworkID: netID,
|
|
NetworkID: netID,
|
|
Proto: models.ALL,
|
|
Proto: models.ALL,
|
|
ServiceType: models.Any,
|
|
ServiceType: models.Any,
|
|
@@ -107,13 +107,13 @@ func CreateDefaultAclNetworkPolicies(netID models.NetworkID) {
|
|
RuleType: models.DevicePolicy,
|
|
RuleType: models.DevicePolicy,
|
|
Src: []models.AclPolicyTag{
|
|
Src: []models.AclPolicyTag{
|
|
{
|
|
{
|
|
- ID: models.DeviceAclID,
|
|
|
|
- Value: fmt.Sprintf("%s.%s", netID, models.RemoteAccessTagName),
|
|
|
|
|
|
+ ID: models.NodeTagID,
|
|
|
|
+ Value: fmt.Sprintf("%s.%s", netID, models.GwTagName),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
Dst: []models.AclPolicyTag{
|
|
Dst: []models.AclPolicyTag{
|
|
{
|
|
{
|
|
- ID: models.DeviceAclID,
|
|
|
|
|
|
+ ID: models.NodeTagID,
|
|
Value: "*",
|
|
Value: "*",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
@@ -269,16 +269,26 @@ func IsAclPolicyValid(acl models.Acl) bool {
|
|
if dstI.ID == "" || dstI.Value == "" {
|
|
if dstI.ID == "" || dstI.Value == "" {
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
- if dstI.ID != models.DeviceAclID {
|
|
|
|
|
|
+ if dstI.ID != models.NodeTagID && dstI.ID != models.NodeID {
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
if dstI.Value == "*" {
|
|
if dstI.Value == "*" {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- // check if tag is valid
|
|
|
|
- _, err := GetTag(models.TagID(dstI.Value))
|
|
|
|
- if err != nil {
|
|
|
|
- return false
|
|
|
|
|
|
+ if dstI.ID == models.NodeTagID {
|
|
|
|
+ // check if tag is valid
|
|
|
|
+ _, err := GetTag(models.TagID(dstI.Value))
|
|
|
|
+ if err != nil {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ _, nodeErr := GetNodeByID(dstI.Value)
|
|
|
|
+ if nodeErr != nil {
|
|
|
|
+ _, staticNodeErr := GetExtClient(dstI.Value, acl.NetworkID.String())
|
|
|
|
+ if staticNodeErr != nil {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case models.DevicePolicy:
|
|
case models.DevicePolicy:
|
|
@@ -286,33 +296,54 @@ func IsAclPolicyValid(acl models.Acl) bool {
|
|
if srcI.ID == "" || srcI.Value == "" {
|
|
if srcI.ID == "" || srcI.Value == "" {
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
- if srcI.ID != models.DeviceAclID {
|
|
|
|
|
|
+ if srcI.ID != models.NodeTagID && srcI.ID != models.NodeID {
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
if srcI.Value == "*" {
|
|
if srcI.Value == "*" {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- // check if tag is valid
|
|
|
|
- _, err := GetTag(models.TagID(srcI.Value))
|
|
|
|
- if err != nil {
|
|
|
|
- return false
|
|
|
|
|
|
+ if srcI.ID == models.NodeTagID {
|
|
|
|
+ // check if tag is valid
|
|
|
|
+ _, err := GetTag(models.TagID(srcI.Value))
|
|
|
|
+ if err != nil {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ _, nodeErr := GetNodeByID(srcI.Value)
|
|
|
|
+ if nodeErr != nil {
|
|
|
|
+ _, staticNodeErr := GetExtClient(srcI.Value, acl.NetworkID.String())
|
|
|
|
+ if staticNodeErr != nil {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
for _, dstI := range acl.Dst {
|
|
for _, dstI := range acl.Dst {
|
|
|
|
|
|
if dstI.ID == "" || dstI.Value == "" {
|
|
if dstI.ID == "" || dstI.Value == "" {
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
- if dstI.ID != models.DeviceAclID {
|
|
|
|
|
|
+ if dstI.ID != models.NodeTagID && dstI.ID != models.NodeID {
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
if dstI.Value == "*" {
|
|
if dstI.Value == "*" {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- // check if tag is valid
|
|
|
|
- _, err := GetTag(models.TagID(dstI.Value))
|
|
|
|
- if err != nil {
|
|
|
|
- return false
|
|
|
|
|
|
+ if dstI.ID == models.NodeTagID {
|
|
|
|
+ // check if tag is valid
|
|
|
|
+ _, err := GetTag(models.TagID(dstI.Value))
|
|
|
|
+ if err != nil {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ _, nodeErr := GetNodeByID(dstI.Value)
|
|
|
|
+ if nodeErr != nil {
|
|
|
|
+ _, staticNodeErr := GetExtClient(dstI.Value, acl.NetworkID.String())
|
|
|
|
+ if staticNodeErr != nil {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -532,9 +563,23 @@ func convAclTagToValueMap(acltags []models.AclPolicyTag) map[string]struct{} {
|
|
|
|
|
|
// IsUserAllowedToCommunicate - check if user is allowed to communicate with peer
|
|
// IsUserAllowedToCommunicate - check if user is allowed to communicate with peer
|
|
func IsUserAllowedToCommunicate(userName string, peer models.Node) (bool, []models.Acl) {
|
|
func IsUserAllowedToCommunicate(userName string, peer models.Node) (bool, []models.Acl) {
|
|
|
|
+ var peerId string
|
|
if peer.IsStatic {
|
|
if peer.IsStatic {
|
|
|
|
+ peerId = peer.StaticNode.ClientID
|
|
peer = peer.StaticNode.ConvertToStaticNode()
|
|
peer = peer.StaticNode.ConvertToStaticNode()
|
|
|
|
+ } else {
|
|
|
|
+ peerId = peer.ID.String()
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ var peerTags map[models.TagID]struct{}
|
|
|
|
+ if peer.Mutex != nil {
|
|
|
|
+ peer.Mutex.Lock()
|
|
|
|
+ peerTags = maps.Clone(peer.Tags)
|
|
|
|
+ peer.Mutex.Unlock()
|
|
|
|
+ } else {
|
|
|
|
+ peerTags = peer.Tags
|
|
|
|
+ }
|
|
|
|
+ peerTags[models.TagID(peerId)] = struct{}{}
|
|
acl, _ := GetDefaultPolicy(models.NetworkID(peer.Network), models.UserPolicy)
|
|
acl, _ := GetDefaultPolicy(models.NetworkID(peer.Network), models.UserPolicy)
|
|
if acl.Enabled {
|
|
if acl.Enabled {
|
|
return true, []models.Acl{acl}
|
|
return true, []models.Acl{acl}
|
|
@@ -554,7 +599,11 @@ func IsUserAllowedToCommunicate(userName string, peer models.Node) (bool, []mode
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- for tagID := range peer.Tags {
|
|
|
|
|
|
+ if _, ok := dstMap[peer.ID.String()]; ok {
|
|
|
|
+ allowedPolicies = append(allowedPolicies, policy)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ for tagID := range peerTags {
|
|
if _, ok := dstMap[tagID.String()]; ok {
|
|
if _, ok := dstMap[tagID.String()]; ok {
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
break
|
|
break
|
|
@@ -570,12 +619,20 @@ func IsUserAllowedToCommunicate(userName string, peer models.Node) (bool, []mode
|
|
|
|
|
|
// IsPeerAllowed - checks if peer needs to be added to the interface
|
|
// IsPeerAllowed - checks if peer needs to be added to the interface
|
|
func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool {
|
|
func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool {
|
|
|
|
+ var nodeId, peerId string
|
|
if node.IsStatic {
|
|
if node.IsStatic {
|
|
|
|
+ nodeId = node.StaticNode.ClientID
|
|
node = node.StaticNode.ConvertToStaticNode()
|
|
node = node.StaticNode.ConvertToStaticNode()
|
|
|
|
+ } else {
|
|
|
|
+ nodeId = node.ID.String()
|
|
}
|
|
}
|
|
if peer.IsStatic {
|
|
if peer.IsStatic {
|
|
|
|
+ peerId = peer.StaticNode.ClientID
|
|
peer = peer.StaticNode.ConvertToStaticNode()
|
|
peer = peer.StaticNode.ConvertToStaticNode()
|
|
|
|
+ } else {
|
|
|
|
+ peerId = peer.ID.String()
|
|
}
|
|
}
|
|
|
|
+
|
|
var nodeTags, peerTags map[models.TagID]struct{}
|
|
var nodeTags, peerTags map[models.TagID]struct{}
|
|
if node.Mutex != nil {
|
|
if node.Mutex != nil {
|
|
node.Mutex.Lock()
|
|
node.Mutex.Lock()
|
|
@@ -591,7 +648,8 @@ func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool {
|
|
} else {
|
|
} else {
|
|
peerTags = peer.Tags
|
|
peerTags = peer.Tags
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ nodeTags[models.TagID(nodeId)] = struct{}{}
|
|
|
|
+ peerTags[models.TagID(peerId)] = struct{}{}
|
|
if checkDefaultPolicy {
|
|
if checkDefaultPolicy {
|
|
// check default policy if all allowed return true
|
|
// check default policy if all allowed return true
|
|
defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
|
|
defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
|
|
@@ -616,64 +674,363 @@ func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool {
|
|
}
|
|
}
|
|
srcMap = convAclTagToValueMap(policy.Src)
|
|
srcMap = convAclTagToValueMap(policy.Src)
|
|
dstMap = convAclTagToValueMap(policy.Dst)
|
|
dstMap = convAclTagToValueMap(policy.Dst)
|
|
- for tagID := range nodeTags {
|
|
|
|
- if _, ok := dstMap[tagID.String()]; ok {
|
|
|
|
- if _, ok := srcMap["*"]; ok {
|
|
|
|
- return true
|
|
|
|
|
|
+ if checkTagGroupPolicy(srcMap, dstMap, node, peer, nodeTags, peerTags) {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ return false
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func RemoveUserFromAclPolicy(userName string) {
|
|
|
|
+ acls := ListAcls()
|
|
|
|
+ for _, acl := range acls {
|
|
|
|
+ delete := false
|
|
|
|
+ update := false
|
|
|
|
+ if acl.RuleType == models.UserPolicy {
|
|
|
|
+ for i, srcI := range acl.Src {
|
|
|
|
+ if srcI.ID == models.UserAclID && srcI.Value == userName {
|
|
|
|
+ if len(acl.Src) == 1 {
|
|
|
|
+ // delete policy
|
|
|
|
+ delete = true
|
|
|
|
+ break
|
|
|
|
+ } else {
|
|
|
|
+ acl.Src = append(acl.Src[:i], acl.Src[i+1:]...)
|
|
|
|
+ update = true
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- for tagID := range peerTags {
|
|
|
|
- if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
- return true
|
|
|
|
|
|
+ }
|
|
|
|
+ if delete {
|
|
|
|
+ DeleteAcl(acl)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ if update {
|
|
|
|
+ UpsertAcl(acl)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func RemoveNodeFromAclPolicy(node models.Node) {
|
|
|
|
+ var nodeID string
|
|
|
|
+ if node.IsStatic {
|
|
|
|
+ nodeID = node.StaticNode.ClientID
|
|
|
|
+ } else {
|
|
|
|
+ nodeID = node.ID.String()
|
|
|
|
+ }
|
|
|
|
+ acls, _ := ListAclsByNetwork(models.NetworkID(node.Network))
|
|
|
|
+ for _, acl := range acls {
|
|
|
|
+ delete := false
|
|
|
|
+ update := false
|
|
|
|
+ if acl.RuleType == models.DevicePolicy {
|
|
|
|
+ for i, srcI := range acl.Src {
|
|
|
|
+ if srcI.ID == models.NodeID && srcI.Value == nodeID {
|
|
|
|
+ if len(acl.Src) == 1 {
|
|
|
|
+ // delete policy
|
|
|
|
+ delete = true
|
|
|
|
+ break
|
|
|
|
+ } else {
|
|
|
|
+ acl.Src = append(acl.Src[:i], acl.Src[i+1:]...)
|
|
|
|
+ update = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
- if _, ok := dstMap["*"]; ok {
|
|
|
|
- return true
|
|
|
|
|
|
+ if delete {
|
|
|
|
+ DeleteAcl(acl)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ for i, dstI := range acl.Dst {
|
|
|
|
+ if dstI.ID == models.NodeID && dstI.Value == nodeID {
|
|
|
|
+ if len(acl.Dst) == 1 {
|
|
|
|
+ // delete policy
|
|
|
|
+ delete = true
|
|
|
|
+ break
|
|
|
|
+ } else {
|
|
|
|
+ acl.Dst = append(acl.Dst[:i], acl.Dst[i+1:]...)
|
|
|
|
+ update = true
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- for tagID := range peerTags {
|
|
|
|
- if _, ok := dstMap[tagID.String()]; ok {
|
|
|
|
- return true
|
|
|
|
|
|
+ }
|
|
|
|
+ if delete {
|
|
|
|
+ DeleteAcl(acl)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ if update {
|
|
|
|
+ UpsertAcl(acl)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ if acl.RuleType == models.UserPolicy {
|
|
|
|
+ for i, dstI := range acl.Dst {
|
|
|
|
+ if dstI.ID == models.NodeID && dstI.Value == nodeID {
|
|
|
|
+ if len(acl.Dst) == 1 {
|
|
|
|
+ // delete policy
|
|
|
|
+ delete = true
|
|
|
|
+ break
|
|
|
|
+ } else {
|
|
|
|
+ acl.Dst = append(acl.Dst[:i], acl.Dst[i+1:]...)
|
|
|
|
+ update = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ if delete {
|
|
|
|
+ DeleteAcl(acl)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ if update {
|
|
|
|
+ UpsertAcl(acl)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
|
|
- for tagID := range peerTags {
|
|
|
|
- if _, ok := dstMap[tagID.String()]; ok {
|
|
|
|
- if _, ok := srcMap["*"]; ok {
|
|
|
|
|
|
+func checkTagGroupPolicy(srcMap, dstMap map[string]struct{}, node, peer models.Node,
|
|
|
|
+ nodeTags, peerTags map[models.TagID]struct{}) bool {
|
|
|
|
+ // check for node ID
|
|
|
|
+ if _, ok := srcMap[node.ID.String()]; ok {
|
|
|
|
+ if _, ok = dstMap[peer.ID.String()]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ if _, ok := dstMap[node.ID.String()]; ok {
|
|
|
|
+ if _, ok = srcMap[peer.ID.String()]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for tagID := range nodeTags {
|
|
|
|
+ if _, ok := dstMap[tagID.String()]; ok {
|
|
|
|
+ if _, ok := srcMap["*"]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ for tagID := range peerTags {
|
|
|
|
+ if _, ok := srcMap[tagID.String()]; ok {
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
- for tagID := range nodeTags {
|
|
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
+ if _, ok := dstMap["*"]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ for tagID := range peerTags {
|
|
|
|
+ if _, ok := dstMap[tagID.String()]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for tagID := range peerTags {
|
|
|
|
+ if _, ok := dstMap[tagID.String()]; ok {
|
|
|
|
+ if _, ok := srcMap["*"]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ for tagID := range nodeTags {
|
|
|
|
|
|
- if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
- return true
|
|
|
|
- }
|
|
|
|
|
|
+ if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
+ return true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
- if _, ok := dstMap["*"]; ok {
|
|
|
|
|
|
+ }
|
|
|
|
+ if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
+ if _, ok := dstMap["*"]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ for tagID := range nodeTags {
|
|
|
|
+ if _, ok := dstMap[tagID.String()]; ok {
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return false
|
|
|
|
+}
|
|
|
|
+func uniquePolicies(items []models.Acl) []models.Acl {
|
|
|
|
+ if len(items) == 0 {
|
|
|
|
+ return items
|
|
|
|
+ }
|
|
|
|
+ seen := make(map[string]bool)
|
|
|
|
+ var result []models.Acl
|
|
|
|
+ for _, item := range items {
|
|
|
|
+ if !seen[item.ID] {
|
|
|
|
+ seen[item.ID] = true
|
|
|
|
+ result = append(result, item)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return result
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// IsNodeAllowedToCommunicate - check node is allowed to communicate with the peer // ADD ALLOWED DIRECTION - 0 => node -> peer, 1 => peer-> node,
|
|
|
|
+func IsNodeAllowedToCommunicateV1(node, peer models.Node, checkDefaultPolicy bool) (bool, []models.Acl) {
|
|
|
|
+ var nodeId, peerId string
|
|
|
|
+ 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
|
|
|
|
+ }
|
|
|
|
+ nodeTags[models.TagID(nodeId)] = struct{}{}
|
|
|
|
+ peerTags[models.TagID(peerId)] = struct{}{}
|
|
|
|
+ if checkDefaultPolicy {
|
|
|
|
+ // check default policy if all allowed return true
|
|
|
|
+ defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
|
|
|
|
+ if err == nil {
|
|
|
|
+ if defaultPolicy.Enabled {
|
|
|
|
+ return true, []models.Acl{defaultPolicy}
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ allowedPolicies := []models.Acl{}
|
|
|
|
+ defer func() {
|
|
|
|
+ allowedPolicies = uniquePolicies(allowedPolicies)
|
|
|
|
+ }()
|
|
|
|
+ // list device policies
|
|
|
|
+ policies := 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 = convAclTagToValueMap(policy.Src)
|
|
|
|
+ dstMap = convAclTagToValueMap(policy.Dst)
|
|
|
|
+ _, 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 {
|
|
for tagID := range nodeTags {
|
|
- if _, ok := dstMap[tagID.String()]; ok {
|
|
|
|
- return true
|
|
|
|
|
|
+ if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
+ allowed = true
|
|
|
|
+ break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ if allowed {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if allowed {
|
|
|
|
+ allowedPolicies = append(allowedPolicies, policy)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- return false
|
|
|
|
|
|
+
|
|
|
|
+ if len(allowedPolicies) > 0 {
|
|
|
|
+ return true, allowedPolicies
|
|
|
|
+ }
|
|
|
|
+ return false, allowedPolicies
|
|
}
|
|
}
|
|
|
|
|
|
// IsNodeAllowedToCommunicate - check node is allowed to communicate with the peer
|
|
// IsNodeAllowedToCommunicate - check node is allowed to communicate with the peer
|
|
func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool) (bool, []models.Acl) {
|
|
func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool) (bool, []models.Acl) {
|
|
|
|
+ var nodeId, peerId string
|
|
if node.IsStatic {
|
|
if node.IsStatic {
|
|
|
|
+ nodeId = node.StaticNode.ClientID
|
|
node = node.StaticNode.ConvertToStaticNode()
|
|
node = node.StaticNode.ConvertToStaticNode()
|
|
|
|
+ } else {
|
|
|
|
+ nodeId = node.ID.String()
|
|
}
|
|
}
|
|
if peer.IsStatic {
|
|
if peer.IsStatic {
|
|
|
|
+ peerId = peer.StaticNode.ClientID
|
|
peer = peer.StaticNode.ConvertToStaticNode()
|
|
peer = peer.StaticNode.ConvertToStaticNode()
|
|
|
|
+ } else {
|
|
|
|
+ peerId = peer.ID.String()
|
|
}
|
|
}
|
|
|
|
+
|
|
var nodeTags, peerTags map[models.TagID]struct{}
|
|
var nodeTags, peerTags map[models.TagID]struct{}
|
|
if node.Mutex != nil {
|
|
if node.Mutex != nil {
|
|
node.Mutex.Lock()
|
|
node.Mutex.Lock()
|
|
@@ -689,6 +1046,8 @@ func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool)
|
|
} else {
|
|
} else {
|
|
peerTags = peer.Tags
|
|
peerTags = peer.Tags
|
|
}
|
|
}
|
|
|
|
+ nodeTags[models.TagID(nodeId)] = struct{}{}
|
|
|
|
+ peerTags[models.TagID(peerId)] = struct{}{}
|
|
if checkDefaultPolicy {
|
|
if checkDefaultPolicy {
|
|
// check default policy if all allowed return true
|
|
// check default policy if all allowed return true
|
|
defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
|
|
defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
|
|
@@ -713,10 +1072,33 @@ func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool)
|
|
}
|
|
}
|
|
srcMap = convAclTagToValueMap(policy.Src)
|
|
srcMap = convAclTagToValueMap(policy.Src)
|
|
dstMap = convAclTagToValueMap(policy.Dst)
|
|
dstMap = convAclTagToValueMap(policy.Dst)
|
|
|
|
+ _, 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[nodeId]; ok || dstAll {
|
|
|
|
+ if _, ok := srcMap[peerId]; ok || srcAll {
|
|
|
|
+ allowedPolicies = append(allowedPolicies, policy)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ }
|
|
for tagID := range nodeTags {
|
|
for tagID := range nodeTags {
|
|
allowed := false
|
|
allowed := false
|
|
- if _, ok := dstMap[tagID.String()]; policy.AllowedDirection == models.TrafficDirectionBi && ok {
|
|
|
|
- if _, ok := srcMap["*"]; ok {
|
|
|
|
|
|
+ if _, ok := dstMap[tagID.String()]; policy.AllowedDirection == models.TrafficDirectionBi && ok || dstAll {
|
|
|
|
+ if srcAll {
|
|
allowed = true
|
|
allowed = true
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
break
|
|
break
|
|
@@ -732,8 +1114,8 @@ func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool)
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
break
|
|
break
|
|
}
|
|
}
|
|
- if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
- if _, ok := dstMap["*"]; ok {
|
|
|
|
|
|
+ if _, ok := srcMap[tagID.String()]; ok || srcAll {
|
|
|
|
+ if dstAll {
|
|
allowed = true
|
|
allowed = true
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
break
|
|
break
|
|
@@ -752,15 +1134,15 @@ func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool)
|
|
}
|
|
}
|
|
for tagID := range peerTags {
|
|
for tagID := range peerTags {
|
|
allowed := false
|
|
allowed := false
|
|
- if _, ok := dstMap[tagID.String()]; ok {
|
|
|
|
- if _, ok := srcMap["*"]; ok {
|
|
|
|
|
|
+ if _, ok := dstMap[tagID.String()]; ok || dstAll {
|
|
|
|
+ if srcAll {
|
|
allowed = true
|
|
allowed = true
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
break
|
|
break
|
|
}
|
|
}
|
|
for tagID := range nodeTags {
|
|
for tagID := range nodeTags {
|
|
|
|
|
|
- if _, ok := srcMap[tagID.String()]; ok {
|
|
|
|
|
|
+ if _, ok := srcMap[tagID.String()]; ok || srcAll {
|
|
allowed = true
|
|
allowed = true
|
|
break
|
|
break
|
|
}
|
|
}
|
|
@@ -771,8 +1153,8 @@ func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool)
|
|
break
|
|
break
|
|
}
|
|
}
|
|
|
|
|
|
- if _, ok := srcMap[tagID.String()]; policy.AllowedDirection == models.TrafficDirectionBi && ok {
|
|
|
|
- if _, ok := dstMap["*"]; ok {
|
|
|
|
|
|
+ if _, ok := srcMap[tagID.String()]; policy.AllowedDirection == models.TrafficDirectionBi && ok || srcAll {
|
|
|
|
+ if dstAll {
|
|
allowed = true
|
|
allowed = true
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
allowedPolicies = append(allowedPolicies, policy)
|
|
break
|
|
break
|
|
@@ -810,7 +1192,7 @@ func UpdateDeviceTag(OldID, newID models.TagID, netID models.NetworkID) {
|
|
update := false
|
|
update := false
|
|
for _, acl := range acls {
|
|
for _, acl := range acls {
|
|
for i, srcTagI := range acl.Src {
|
|
for i, srcTagI := range acl.Src {
|
|
- if srcTagI.ID == models.DeviceAclID {
|
|
|
|
|
|
+ if srcTagI.ID == models.NodeTagID {
|
|
if OldID.String() == srcTagI.Value {
|
|
if OldID.String() == srcTagI.Value {
|
|
acl.Src[i].Value = newID.String()
|
|
acl.Src[i].Value = newID.String()
|
|
update = true
|
|
update = true
|
|
@@ -818,7 +1200,7 @@ func UpdateDeviceTag(OldID, newID models.TagID, netID models.NetworkID) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for i, dstTagI := range acl.Dst {
|
|
for i, dstTagI := range acl.Dst {
|
|
- if dstTagI.ID == models.DeviceAclID {
|
|
|
|
|
|
+ if dstTagI.ID == models.NodeTagID {
|
|
if OldID.String() == dstTagI.Value {
|
|
if OldID.String() == dstTagI.Value {
|
|
acl.Dst[i].Value = newID.String()
|
|
acl.Dst[i].Value = newID.String()
|
|
update = true
|
|
update = true
|
|
@@ -835,14 +1217,14 @@ func CheckIfTagAsActivePolicy(tagID models.TagID, netID models.NetworkID) bool {
|
|
acls := listDevicePolicies(netID)
|
|
acls := listDevicePolicies(netID)
|
|
for _, acl := range acls {
|
|
for _, acl := range acls {
|
|
for _, srcTagI := range acl.Src {
|
|
for _, srcTagI := range acl.Src {
|
|
- if srcTagI.ID == models.DeviceAclID {
|
|
|
|
|
|
+ if srcTagI.ID == models.NodeTagID {
|
|
if tagID.String() == srcTagI.Value {
|
|
if tagID.String() == srcTagI.Value {
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for _, dstTagI := range acl.Dst {
|
|
for _, dstTagI := range acl.Dst {
|
|
- if dstTagI.ID == models.DeviceAclID {
|
|
|
|
|
|
+ if dstTagI.ID == models.NodeTagID {
|
|
if tagID.String() == dstTagI.Value {
|
|
if tagID.String() == dstTagI.Value {
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
@@ -858,7 +1240,7 @@ func RemoveDeviceTagFromAclPolicies(tagID models.TagID, netID models.NetworkID)
|
|
update := false
|
|
update := false
|
|
for _, acl := range acls {
|
|
for _, acl := range acls {
|
|
for i, srcTagI := range acl.Src {
|
|
for i, srcTagI := range acl.Src {
|
|
- if srcTagI.ID == models.DeviceAclID {
|
|
|
|
|
|
+ if srcTagI.ID == models.NodeTagID {
|
|
if tagID.String() == srcTagI.Value {
|
|
if tagID.String() == srcTagI.Value {
|
|
acl.Src = append(acl.Src[:i], acl.Src[i+1:]...)
|
|
acl.Src = append(acl.Src[:i], acl.Src[i+1:]...)
|
|
update = true
|
|
update = true
|
|
@@ -866,7 +1248,7 @@ func RemoveDeviceTagFromAclPolicies(tagID models.TagID, netID models.NetworkID)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for i, dstTagI := range acl.Dst {
|
|
for i, dstTagI := range acl.Dst {
|
|
- if dstTagI.ID == models.DeviceAclID {
|
|
|
|
|
|
+ if dstTagI.ID == models.NodeTagID {
|
|
if tagID.String() == dstTagI.Value {
|
|
if tagID.String() == dstTagI.Value {
|
|
acl.Dst = append(acl.Dst[:i], acl.Dst[i+1:]...)
|
|
acl.Dst = append(acl.Dst[:i], acl.Dst[i+1:]...)
|
|
update = true
|
|
update = true
|
|
@@ -894,29 +1276,41 @@ func getUserAclRulesForNode(targetnode *models.Node,
|
|
} else {
|
|
} else {
|
|
targetNodeTags = maps.Clone(targetnode.Tags)
|
|
targetNodeTags = maps.Clone(targetnode.Tags)
|
|
}
|
|
}
|
|
- for nodeTag := range targetNodeTags {
|
|
|
|
- for _, acl := range acls {
|
|
|
|
- if !acl.Enabled {
|
|
|
|
- continue
|
|
|
|
|
|
+ for _, acl := range acls {
|
|
|
|
+ if !acl.Enabled {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ dstTags := convAclTagToValueMap(acl.Dst)
|
|
|
|
+ _, all := dstTags["*"]
|
|
|
|
+ addUsers := false
|
|
|
|
+ if !all {
|
|
|
|
+ for nodeTag := range targetNodeTags {
|
|
|
|
+ if _, ok := dstTags[nodeTag.String()]; !ok {
|
|
|
|
+ if _, ok = dstTags[targetnode.ID.String()]; !ok {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- dstTags := convAclTagToValueMap(acl.Dst)
|
|
|
|
- if _, ok := dstTags[nodeTag.String()]; ok {
|
|
|
|
- // get all src tags
|
|
|
|
- for _, srcAcl := range acl.Src {
|
|
|
|
- if srcAcl.ID == models.UserAclID {
|
|
|
|
- allowedUsers[srcAcl.Value] = append(allowedUsers[srcAcl.Value], acl)
|
|
|
|
- } else if srcAcl.ID == models.UserGroupAclID {
|
|
|
|
- // fetch all users in the group
|
|
|
|
- if usersMap, ok := userGrpMap[models.UserGroupID(srcAcl.Value)]; ok {
|
|
|
|
- for userName := range usersMap {
|
|
|
|
- allowedUsers[userName] = append(allowedUsers[userName], acl)
|
|
|
|
- }
|
|
|
|
|
|
+ } else {
|
|
|
|
+ addUsers = true
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if addUsers {
|
|
|
|
+ // get all src tags
|
|
|
|
+ for _, srcAcl := range acl.Src {
|
|
|
|
+ if srcAcl.ID == models.UserAclID {
|
|
|
|
+ allowedUsers[srcAcl.Value] = append(allowedUsers[srcAcl.Value], acl)
|
|
|
|
+ } else if srcAcl.ID == models.UserGroupAclID {
|
|
|
|
+ // fetch all users in the group
|
|
|
|
+ if usersMap, ok := userGrpMap[models.UserGroupID(srcAcl.Value)]; ok {
|
|
|
|
+ for userName := range usersMap {
|
|
|
|
+ allowedUsers[userName] = append(allowedUsers[userName], acl)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
for _, userNode := range userNodes {
|
|
for _, userNode := range userNodes {
|
|
@@ -959,10 +1353,42 @@ func getUserAclRulesForNode(targetnode *models.Node,
|
|
return rules
|
|
return rules
|
|
}
|
|
}
|
|
|
|
|
|
-func GetAclRulesForNode(targetnode *models.Node) (rules map[string]models.AclRule) {
|
|
|
|
|
|
+func checkIfAnyPolicyisUniDirectional(targetNode models.Node) bool {
|
|
|
|
+ targetNode.Tags[models.TagID(targetNode.ID.String())] = struct{}{}
|
|
|
|
+ acls := listDevicePolicies(models.NetworkID(targetNode.Network))
|
|
|
|
+ for _, acl := range acls {
|
|
|
|
+ if !acl.Enabled {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ if acl.AllowedDirection == models.TrafficDirectionBi {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ srcTags := convAclTagToValueMap(acl.Src)
|
|
|
|
+ dstTags := convAclTagToValueMap(acl.Dst)
|
|
|
|
+ for nodeTag := range targetNode.Tags {
|
|
|
|
+ if _, ok := srcTags[nodeTag.String()]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ if _, ok := srcTags[targetNode.ID.String()]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ if _, ok := dstTags[nodeTag.String()]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ if _, ok := dstTags[targetNode.ID.String()]; ok {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return false
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func GetAclRulesForNode(targetnodeI *models.Node) (rules map[string]models.AclRule) {
|
|
|
|
+ targetnode := *targetnodeI
|
|
|
|
+ targetnode.Tags[models.TagID(targetnode.ID.String())] = struct{}{}
|
|
defer func() {
|
|
defer func() {
|
|
if !targetnode.IsIngressGateway {
|
|
if !targetnode.IsIngressGateway {
|
|
- rules = getUserAclRulesForNode(targetnode, rules)
|
|
|
|
|
|
+ rules = getUserAclRulesForNode(&targetnode, rules)
|
|
}
|
|
}
|
|
|
|
|
|
}()
|
|
}()
|
|
@@ -975,7 +1401,6 @@ func GetAclRulesForNode(targetnode *models.Node) (rules map[string]models.AclRul
|
|
}
|
|
}
|
|
|
|
|
|
acls := listDevicePolicies(models.NetworkID(targetnode.Network))
|
|
acls := listDevicePolicies(models.NetworkID(targetnode.Network))
|
|
-
|
|
|
|
var targetNodeTags = make(map[models.TagID]struct{})
|
|
var targetNodeTags = make(map[models.TagID]struct{})
|
|
if targetnode.Mutex != nil {
|
|
if targetnode.Mutex != nil {
|
|
targetnode.Mutex.Lock()
|
|
targetnode.Mutex.Lock()
|
|
@@ -985,28 +1410,37 @@ func GetAclRulesForNode(targetnode *models.Node) (rules map[string]models.AclRul
|
|
targetNodeTags = maps.Clone(targetnode.Tags)
|
|
targetNodeTags = maps.Clone(targetnode.Tags)
|
|
}
|
|
}
|
|
targetNodeTags["*"] = struct{}{}
|
|
targetNodeTags["*"] = struct{}{}
|
|
- for nodeTag := range targetNodeTags {
|
|
|
|
- for _, acl := range acls {
|
|
|
|
- if !acl.Enabled {
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- srcTags := convAclTagToValueMap(acl.Src)
|
|
|
|
- dstTags := convAclTagToValueMap(acl.Dst)
|
|
|
|
- aclRule := models.AclRule{
|
|
|
|
- ID: acl.ID,
|
|
|
|
- AllowedProtocol: acl.Proto,
|
|
|
|
- AllowedPorts: acl.Port,
|
|
|
|
- Direction: acl.AllowedDirection,
|
|
|
|
- Allowed: true,
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ for _, acl := range acls {
|
|
|
|
+ if !acl.Enabled {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ srcTags := convAclTagToValueMap(acl.Src)
|
|
|
|
+ dstTags := 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 acl.AllowedDirection == models.TrafficDirectionBi {
|
|
if acl.AllowedDirection == models.TrafficDirectionBi {
|
|
var existsInSrcTag bool
|
|
var existsInSrcTag bool
|
|
var existsInDstTag bool
|
|
var existsInDstTag bool
|
|
|
|
|
|
- if _, ok := srcTags[nodeTag.String()]; ok {
|
|
|
|
|
|
+ if _, ok := srcTags[nodeTag.String()]; ok || srcAll {
|
|
existsInSrcTag = true
|
|
existsInSrcTag = true
|
|
}
|
|
}
|
|
- if _, ok := dstTags[nodeTag.String()]; ok {
|
|
|
|
|
|
+ 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
|
|
existsInDstTag = true
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1018,10 +1452,20 @@ func GetAclRulesForNode(targetnode *models.Node) (rules map[string]models.AclRul
|
|
}
|
|
}
|
|
// Get peers in the tags and add allowed rules
|
|
// Get peers in the tags and add allowed rules
|
|
nodes := taggedNodes[models.TagID(dst)]
|
|
nodes := taggedNodes[models.TagID(dst)]
|
|
|
|
+ if dst != targetnode.ID.String() {
|
|
|
|
+ node, err := GetNodeByID(dst)
|
|
|
|
+ if err == nil {
|
|
|
|
+ nodes = append(nodes, node)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
for _, node := range nodes {
|
|
for _, node := range nodes {
|
|
if node.ID == targetnode.ID {
|
|
if node.ID == targetnode.ID {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
+ if node.IsStatic && node.StaticNode.IngressGatewayID == targetnode.ID.String() {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
if node.Address.IP != nil {
|
|
if node.Address.IP != nil {
|
|
aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
}
|
|
}
|
|
@@ -1045,10 +1489,19 @@ func GetAclRulesForNode(targetnode *models.Node) (rules map[string]models.AclRul
|
|
}
|
|
}
|
|
// Get peers in the tags and add allowed rules
|
|
// Get peers in the tags and add allowed rules
|
|
nodes := taggedNodes[models.TagID(src)]
|
|
nodes := taggedNodes[models.TagID(src)]
|
|
|
|
+ if src != targetnode.ID.String() {
|
|
|
|
+ node, err := GetNodeByID(src)
|
|
|
|
+ if err == nil {
|
|
|
|
+ nodes = append(nodes, node)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
for _, node := range nodes {
|
|
for _, node := range nodes {
|
|
if node.ID == targetnode.ID {
|
|
if node.ID == targetnode.ID {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
+ if node.IsStatic && node.StaticNode.IngressGatewayID == targetnode.ID.String() {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
if node.Address.IP != nil {
|
|
if node.Address.IP != nil {
|
|
aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
}
|
|
}
|
|
@@ -1066,10 +1519,31 @@ func GetAclRulesForNode(targetnode *models.Node) (rules map[string]models.AclRul
|
|
}
|
|
}
|
|
if existsInDstTag && existsInSrcTag {
|
|
if existsInDstTag && existsInSrcTag {
|
|
nodes := taggedNodes[nodeTag]
|
|
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 {
|
|
for _, node := range nodes {
|
|
if node.ID == targetnode.ID {
|
|
if node.ID == targetnode.ID {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
+ if node.IsStatic && node.StaticNode.IngressGatewayID == targetnode.ID.String() {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
if node.Address.IP != nil {
|
|
if node.Address.IP != nil {
|
|
aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
}
|
|
}
|
|
@@ -1098,6 +1572,9 @@ func GetAclRulesForNode(targetnode *models.Node) (rules map[string]models.AclRul
|
|
if node.ID == targetnode.ID {
|
|
if node.ID == targetnode.ID {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
+ if node.IsStatic && node.StaticNode.IngressGatewayID == targetnode.ID.String() {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
if node.Address.IP != nil {
|
|
if node.Address.IP != nil {
|
|
aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
aclRule.IPList = append(aclRule.IPList, node.AddressIPNet4())
|
|
}
|
|
}
|
|
@@ -1114,9 +1591,10 @@ func GetAclRulesForNode(targetnode *models.Node) (rules map[string]models.AclRul
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if len(aclRule.IPList) > 0 || len(aclRule.IP6List) > 0 {
|
|
|
|
- rules[acl.ID] = aclRule
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ if len(aclRule.IPList) > 0 || len(aclRule.IP6List) > 0 {
|
|
|
|
+ rules[acl.ID] = aclRule
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return rules
|
|
return rules
|