|
@@ -3,6 +3,7 @@ package logic
|
|
|
import (
|
|
|
"context"
|
|
|
"errors"
|
|
|
+ "fmt"
|
|
|
"maps"
|
|
|
"net"
|
|
|
|
|
@@ -12,17 +13,6 @@ import (
|
|
|
"github.com/gravitl/netmaker/schema"
|
|
|
)
|
|
|
|
|
|
-/*
|
|
|
-TODO: EGRESS
|
|
|
-1. allow only selection of egress ranges in a policy
|
|
|
-ranges should be replaced by egress identifier
|
|
|
-
|
|
|
-2. check logic required for MAC exit node
|
|
|
-
|
|
|
-3.
|
|
|
-
|
|
|
-*/
|
|
|
-
|
|
|
func GetFwRulesForUserNodesOnGw(node models.Node, nodes []models.Node) (rules []models.FwRule) {
|
|
|
defaultUserPolicy, _ := logic.GetDefaultPolicy(models.NetworkID(node.Network), models.UserPolicy)
|
|
|
userNodes := logic.GetStaticUserNodesByNetwork(models.NetworkID(node.Network))
|
|
@@ -928,8 +918,18 @@ func getEgressUserRulesForNode(targetnode *models.Node,
|
|
|
acls := listUserPolicies(models.NetworkID(targetnode.Network))
|
|
|
var targetNodeTags = make(map[models.TagID]struct{})
|
|
|
targetNodeTags["*"] = struct{}{}
|
|
|
- for _, rangeI := range targetnode.EgressDetails.EgressGatewayRanges {
|
|
|
- targetNodeTags[models.TagID(rangeI)] = struct{}{}
|
|
|
+ egs, _ := (&schema.Egress{Network: targetnode.Network}).ListByNetwork(db.WithContext(context.TODO()))
|
|
|
+ if len(egs) == 0 {
|
|
|
+ return rules
|
|
|
+ }
|
|
|
+ for _, egI := range egs {
|
|
|
+ if !egI.Status {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if _, ok := egI.Nodes[targetnode.ID.String()]; ok {
|
|
|
+ targetNodeTags[models.TagID(egI.Range)] = struct{}{}
|
|
|
+ targetNodeTags[models.TagID(egI.ID)] = struct{}{}
|
|
|
+ }
|
|
|
}
|
|
|
for _, acl := range acls {
|
|
|
if !acl.Enabled {
|
|
@@ -1154,7 +1154,7 @@ func CheckIfAnyActiveEgressPolicy(targetNode models.Node, acls []models.Acl) boo
|
|
|
targetNodeTags[models.TagID(targetNode.ID.String())] = struct{}{}
|
|
|
targetNodeTags["*"] = struct{}{}
|
|
|
for _, acl := range acls {
|
|
|
- if !acl.Enabled || acl.RuleType != models.DevicePolicy {
|
|
|
+ if !acl.Enabled {
|
|
|
continue
|
|
|
}
|
|
|
srcTags := logic.ConvAclTagToValueMap(acl.Src)
|
|
@@ -1456,6 +1456,31 @@ func GetAclRulesForNode(targetnodeI *models.Node) (rules map[string]models.AclRu
|
|
|
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(IPv4Network)
|
|
|
+ aclRule.Dst = append(aclRule.Dst, *allIpv4)
|
|
|
+ }
|
|
|
+ if targetnode.NetworkRange6.IP != nil {
|
|
|
+ aclRule.IP6List = append(aclRule.IP6List, targetnode.NetworkRange6)
|
|
|
+ _, allIpv6, _ := net.ParseCIDR(IPv6Network)
|
|
|
+ aclRule.Dst6 = append(aclRule.Dst6, *allIpv6)
|
|
|
+ }
|
|
|
+ rules[aclRule.ID] = aclRule
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
func GetEgressRulesForNode(targetnode models.Node) (rules map[string]models.AclRule) {
|
|
|
rules = make(map[string]models.AclRule)
|
|
|
defer func() {
|
|
@@ -1472,6 +1497,7 @@ func GetEgressRulesForNode(targetnode models.Node) (rules map[string]models.AclR
|
|
|
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
|
|
@@ -1481,9 +1507,7 @@ func GetEgressRulesForNode(targetnode models.Node) (rules map[string]models.AclR
|
|
|
continue
|
|
|
}
|
|
|
if _, ok := egI.Nodes[targetnode.ID.String()]; ok {
|
|
|
-
|
|
|
targetNodeTags[models.TagID(egI.Range)] = struct{}{}
|
|
|
-
|
|
|
targetNodeTags[models.TagID(egI.ID)] = struct{}{}
|
|
|
}
|
|
|
}
|
|
@@ -1523,15 +1547,15 @@ func GetEgressRulesForNode(targetnode models.Node) (rules map[string]models.AclR
|
|
|
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 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 {
|
|
@@ -1545,6 +1569,10 @@ func GetEgressRulesForNode(targetnode models.Node) (rules map[string]models.AclR
|
|
|
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 {
|
|
@@ -1579,6 +1607,10 @@ func GetEgressRulesForNode(targetnode models.Node) (rules map[string]models.AclR
|
|
|
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 {
|
|
@@ -1609,6 +1641,10 @@ func GetEgressRulesForNode(targetnode models.Node) (rules map[string]models.AclR
|
|
|
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() {
|
|
@@ -1618,6 +1654,10 @@ func GetEgressRulesForNode(targetnode models.Node) (rules map[string]models.AclR
|
|
|
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 {
|
|
@@ -1684,6 +1724,7 @@ func GetEgressRulesForNode(targetnode models.Node) (rules map[string]models.AclR
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
return
|
|
|
}
|
|
|
|