@@ -12,9 +12,25 @@ import (
12
12
"github.com/gravitl/netmaker/schema"
13
13
)
14
14
15
+ func getStaticUserNodesByNetwork (network models.NetworkID ) (staticNode []models.Node ) {
16
+ extClients , err := logic .GetAllExtClients ()
17
+ if err != nil {
18
+ return
19
+ }
20
+ for _ , extI := range extClients {
21
+ if extI .Network == network .String () {
22
+ if extI .RemoteAccessClientID != "" {
23
+ n := extI .ConvertToStaticNode ()
24
+ staticNode = append (staticNode , n )
25
+ }
26
+ }
27
+ }
28
+ return
29
+ }
30
+
15
31
func GetFwRulesForUserNodesOnGw (node models.Node , nodes []models.Node ) (rules []models.FwRule ) {
16
32
defaultUserPolicy , _ := logic .GetDefaultPolicy (models .NetworkID (node .Network ), models .UserPolicy )
17
- userNodes := logic . GetStaticUserNodesByNetwork (models .NetworkID (node .Network ))
33
+ userNodes := getStaticUserNodesByNetwork (models .NetworkID (node .Network ))
18
34
for _ , userNodeI := range userNodes {
19
35
if defaultUserPolicy .Enabled {
20
36
if userNodeI .StaticNode .Address != "" {
@@ -767,7 +783,7 @@ func RemoveDeviceTagFromAclPolicies(tagID models.TagID, netID models.NetworkID)
767
783
768
784
func GetEgressUserRulesForNode (targetnode * models.Node ,
769
785
rules map [string ]models.AclRule ) map [string ]models.AclRule {
770
- userNodes := logic . GetStaticUserNodesByNetwork (models .NetworkID (targetnode .Network ))
786
+ userNodes := getStaticUserNodesByNetwork (models .NetworkID (targetnode .Network ))
771
787
userGrpMap := GetUserGrpMap ()
772
788
allowedUsers := make (map [string ][]models.Acl )
773
789
acls := listUserPolicies (models .NetworkID (targetnode .Network ))
@@ -896,7 +912,6 @@ func GetEgressUserRulesForNode(targetnode *models.Node,
896
912
if err != nil {
897
913
continue
898
914
}
899
-
900
915
ip , cidr , err := net .ParseCIDR (e .Range )
901
916
if err == nil {
902
917
if ip .To4 () != nil {
@@ -927,7 +942,7 @@ func GetEgressUserRulesForNode(targetnode *models.Node,
927
942
928
943
func GetUserAclRulesForNode (targetnode * models.Node ,
929
944
rules map [string ]models.AclRule ) map [string ]models.AclRule {
930
- userNodes := logic . GetStaticUserNodesByNetwork (models .NetworkID (targetnode .Network ))
945
+ userNodes := getStaticUserNodesByNetwork (models .NetworkID (targetnode .Network ))
931
946
userGrpMap := GetUserGrpMap ()
932
947
allowedUsers := make (map [string ][]models.Acl )
933
948
acls := listUserPolicies (models .NetworkID (targetnode .Network ))
@@ -953,6 +968,17 @@ func GetUserAclRulesForNode(targetnode *models.Node,
953
968
_ , all := dstTags ["*" ]
954
969
addUsers := false
955
970
if ! all {
971
+ for _ , dst := range acl .Dst {
972
+ if dst .ID == models .EgressID {
973
+ e := schema.Egress {ID : dst .Value }
974
+ err := e .Get (db .WithContext (context .TODO ()))
975
+ if err == nil && e .Status && len (e .Nodes ) > 0 {
976
+ if _ , ok := e .Nodes [targetnode .ID .String ()]; ok {
977
+ dstTags [targetnode .ID .String ()] = struct {}{}
978
+ }
979
+ }
980
+ }
981
+ }
956
982
for nodeTag := range targetNodeTags {
957
983
if _ , ok := dstTags [nodeTag .String ()]; ok {
958
984
addUsers = true
@@ -1017,13 +1043,68 @@ func GetUserAclRulesForNode(targetnode *models.Node,
1017
1043
if ! acl .Enabled {
1018
1044
continue
1019
1045
}
1046
+ egressRanges4 := []net.IPNet {}
1047
+ egressRanges6 := []net.IPNet {}
1048
+
1049
+ for _ , dst := range acl .Dst {
1050
+ if dst .Value == "*" {
1051
+ e := schema.Egress {Network : targetnode .Network }
1052
+ eli , _ := e .ListByNetwork (db .WithContext (context .Background ()))
1053
+ for _ , eI := range eli {
1054
+ if ! eI .Status || len (eI .Nodes ) == 0 {
1055
+ continue
1056
+ }
1057
+ if _ , ok := eI .Nodes [targetnode .ID .String ()]; ok {
1058
+ if eI .Range != "" {
1059
+ _ , cidr , err := net .ParseCIDR (eI .Range )
1060
+ if err == nil {
1061
+ if cidr .IP .To4 () != nil {
1062
+ egressRanges4 = append (egressRanges4 , * cidr )
1063
+ } else {
1064
+ egressRanges6 = append (egressRanges6 , * cidr )
1065
+ }
1066
+ }
1067
+ }
1068
+ }
1069
+ }
1070
+ break
1071
+ }
1072
+ if dst .ID == models .EgressID {
1073
+ e := schema.Egress {ID : dst .Value }
1074
+ err := e .Get (db .WithContext (context .TODO ()))
1075
+ if err == nil && e .Status && len (e .Nodes ) > 0 {
1076
+ if _ , ok := e .Nodes [targetnode .ID .String ()]; ok {
1077
+ if e .Range != "" {
1078
+ _ , cidr , err := net .ParseCIDR (e .Range )
1079
+ if err == nil {
1080
+ if cidr .IP .To4 () != nil {
1081
+ egressRanges4 = append (egressRanges4 , * cidr )
1082
+ } else {
1083
+ egressRanges6 = append (egressRanges6 , * cidr )
1084
+ }
1085
+ }
1086
+ }
1087
+ }
1088
+
1089
+ }
1090
+ }
1091
+
1092
+ }
1020
1093
r := models.AclRule {
1021
1094
ID : acl .ID ,
1022
1095
AllowedProtocol : acl .Proto ,
1023
1096
AllowedPorts : acl .Port ,
1024
1097
Direction : acl .AllowedDirection ,
1098
+ Dst : []net.IPNet {targetnode .AddressIPNet4 ()},
1099
+ Dst6 : []net.IPNet {targetnode .AddressIPNet6 ()},
1025
1100
Allowed : true ,
1026
1101
}
1102
+ if len (egressRanges4 ) > 0 {
1103
+ r .Dst = append (r .Dst , egressRanges4 ... )
1104
+ }
1105
+ if len (egressRanges6 ) > 0 {
1106
+ r .Dst6 = append (r .Dst6 , egressRanges6 ... )
1107
+ }
1027
1108
// Get peers in the tags and add allowed rules
1028
1109
if userNode .StaticNode .Address != "" {
1029
1110
r .IPList = append (r .IPList , userNode .StaticNode .AddressIPNet4 ())
@@ -1032,14 +1113,26 @@ func GetUserAclRulesForNode(targetnode *models.Node,
1032
1113
r .IP6List = append (r .IP6List , userNode .StaticNode .AddressIPNet6 ())
1033
1114
}
1034
1115
if aclRule , ok := rules [acl .ID ]; ok {
1116
+
1035
1117
aclRule .IPList = append (aclRule .IPList , r .IPList ... )
1036
1118
aclRule .IP6List = append (aclRule .IP6List , r .IP6List ... )
1119
+
1120
+ aclRule .Dst = append (aclRule .Dst , r .Dst ... )
1121
+ aclRule .Dst6 = append (aclRule .Dst6 , r .Dst6 ... )
1122
+
1037
1123
aclRule .IPList = logic .UniqueIPNetList (aclRule .IPList )
1038
1124
aclRule .IP6List = logic .UniqueIPNetList (aclRule .IP6List )
1125
+
1126
+ aclRule .Dst = logic .UniqueIPNetList (aclRule .Dst )
1127
+ aclRule .Dst6 = logic .UniqueIPNetList (aclRule .Dst6 )
1128
+
1039
1129
rules [acl .ID ] = aclRule
1040
1130
} else {
1041
1131
r .IPList = logic .UniqueIPNetList (r .IPList )
1042
1132
r .IP6List = logic .UniqueIPNetList (r .IP6List )
1133
+
1134
+ r .Dst = logic .UniqueIPNetList (r .Dst )
1135
+ r .Dst6 = logic .UniqueIPNetList (r .Dst6 )
1043
1136
rules [acl .ID ] = r
1044
1137
}
1045
1138
}
0 commit comments