diff --git a/server/dbdata/group.go b/server/dbdata/group.go index 8e561b6..ce28ddb 100644 --- a/server/dbdata/group.go +++ b/server/dbdata/group.go @@ -5,6 +5,7 @@ import ( "fmt" "net" "regexp" + "strconv" "strings" "time" @@ -24,11 +25,12 @@ const DsMaxLen = 20000 type GroupLinkAcl struct { // 自上而下匹配 默认 allow * * - Action string `json:"action"` // allow、deny - Val string `json:"val"` - Port uint16 `json:"port"` - IpNet *net.IPNet `json:"ip_net"` - Note string `json:"note"` + Action string `json:"action"` // allow、deny + Val string `json:"val"` + Port interface{} `json:"port"` //兼容单端口历史数据类型uint16 + Ports map[uint16]int8 `json:"ports"` + IpNet *net.IPNet `json:"ip_net"` + Note string `json:"note"` } type ValData struct { @@ -161,9 +163,52 @@ func SetGroup(g *Group) error { return errors.New("GroupLinkAcl 错误" + err.Error()) } v.IpNet = ipNet - linkAcl = append(linkAcl, v) + + portsStr := "" + switch vp := v.Port.(type) { + case float64: + portsStr = strconv.Itoa(int(vp)) + case string: + portsStr = vp + } + + if regexp.MustCompile(`^\d{1,5}(-\d{1,5})?(,\d{1,5}(-\d{1,5})?)*$`).MatchString(portsStr) { + ports := map[uint16]int8{} + for _, p := range strings.Split(portsStr, ",") { + if p == "" { + continue + } + if regexp.MustCompile(`^\d{1,5}-\d{1,5}$`).MatchString(p) { + rp := strings.Split(p, "-") + portfrom, err := strconv.Atoi(rp[0]) + if err != nil { + return errors.New("端口:" + rp[0] + " 格式错误, " + err.Error()) + } + portto, err := strconv.Atoi(rp[1]) + if err != nil { + return errors.New("端口:" + rp[1] + " 格式错误, " + err.Error()) + } + for i := portfrom; i <= portto; i++ { + ports[uint16(i)] = 1 + } + + } else { + port, err := strconv.Atoi(p) + if err != nil { + return errors.New("端口:" + p + " 格式错误, " + err.Error()) + } + ports[uint16(port)] = 1 + } + } + v.Ports = ports + linkAcl = append(linkAcl, v) + } else { + return errors.New("端口: " + portsStr + " 格式错误,请用逗号分隔的端口,比如: 22,80,443 连续端口用-,比如:1234-5678") + } + } } + g.LinkAcl = linkAcl // DNS 判断 @@ -238,6 +283,15 @@ func SetGroup(g *Group) error { return err } +func ContainsInPorts(ports map[uint16]int8, port uint16) bool { + _, ok := ports[port] + if ok { + return true + } else { + return false + } +} + func GroupAuthLogin(name, pwd string, authData map[string]interface{}) error { g := &Group{Auth: authData} authType := g.Auth["type"].(string) diff --git a/server/handler/payload.go b/server/handler/payload.go index e5ed545..9bc9d31 100644 --- a/server/handler/payload.go +++ b/server/handler/payload.go @@ -88,12 +88,25 @@ func checkLinkAcl(group *dbdata.Group, pl *sessdata.Payload) bool { for _, v := range group.LinkAcl { // 循环判断ip和端口 if v.IpNet.Contains(ipDst) { + // 放行允许ip的ping - if v.Port == ipPort || v.Port == 0 || ipProto == waterutil.ICMP { - if v.Action == dbdata.Allow { - return true - } else { - return false + if v.Ports == nil || len(v.Ports) == 0 { + //单端口历史数据兼容 + port := uint16(v.Port.(float64)) + if port == ipPort || port == 0 || ipProto == waterutil.ICMP { + if v.Action == dbdata.Allow { + return true + } else { + return false + } + } + } else { + if dbdata.ContainsInPorts(v.Ports, ipPort) || dbdata.ContainsInPorts(v.Ports, 0) || ipProto == waterutil.ICMP { + if v.Action == dbdata.Allow { + return true + } else { + return false + } } } } diff --git a/web/src/pages/group/List.vue b/web/src/pages/group/List.vue index cb28dce..df4f2ce 100644 --- a/web/src/pages/group/List.vue +++ b/web/src/pages/group/List.vue @@ -52,7 +52,7 @@ + {{ item.val }}
- {{ item.val }} + {{ item.val }}
- {{ readMore[`ri_${ scope.row.id }`] ? "▲ 收起" : "▼ 更多" }} -
+ {{ readMore[`ri_${ scope.row.id }`] ? "▲ 收起" : "▼ 更多" }} +
@@ -87,9 +87,9 @@ {{ item.val }}
- {{ item.val }} + {{ item.val }}
- {{ readMore[`re_${ scope.row.id }`] ? "▲ 收起" : "▼ 更多" }} + {{ readMore[`re_${ scope.row.id }`] ? "▲ 收起" : "▼ 更多" }}
@@ -108,7 +108,7 @@ {{ item.action }} => {{ item.val }} : {{ item.port }} - {{ readMore[`la_${ scope.row.id }`] ? "▲ 收起" : "▼ 更多" }} + {{ readMore[`la_${ scope.row.id }`] ? "▲ 收起" : "▼ 更多" }} @@ -178,7 +178,7 @@ - + @@ -234,7 +234,7 @@ 启用 停用 - + @@ -244,43 +244,43 @@ Radius LDAP - + - + + + @@ -293,7 +293,7 @@ - + - + - 输入CIDR格式如: 192.168.3.0/24 端口0表示所有端口 - + 输入CIDR格式如: 192.168.3.0/24 端口0表示所有端口,多个端口用,号分隔,连续端口:1234-5678 + - + - + :key="index" style="margin-bottom: 5px" :gutter="1"> + @@ -361,10 +361,10 @@ - - + + - + @@ -378,7 +378,7 @@ - +
注:域名拆分隧道,仅支持AnyConnect的windows和MacOS桌面客户端,不支持移动端.
@@ -392,7 +392,7 @@ 取消
-
+ 取 消 - + { resp.data.data.bandwidth_format = this.convertBandwidth(resp.data.data.bandwidth, 'BYTE', 'Mbps').toString(); - this.ruleForm = resp.data.data; + this.ruleForm = resp.data.data; this.setAuthData(resp.data.data); }).catch(error => { this.$message.error('哦,请求出错'); @@ -654,7 +654,7 @@ export default { if (!valid) { console.log('error submit!!'); return false; - } + } this.authLoginLoading = true; axios.post('/group/auth_login', {name:this.authLoginForm.name, pwd:this.authLoginForm.pwd, @@ -663,7 +663,7 @@ export default { if (rdata.code === 0) { this.$message.success("登录成功"); } else { - this.$message.error(rdata.msg); + this.$message.error(rdata.msg); } this.authLoginLoading = false; console.log(rdata); @@ -679,7 +679,7 @@ export default { if (!valid) { console.log('error submit!!'); return false; - } + } this.authLoginDialog = true; // set authLoginFormName focus this.$nextTick(() => { @@ -690,14 +690,14 @@ export default { openIpListDialog(type) { this.ipListDialog = true; this.ipEditForm.type = type; - this.ipEditForm.ip_list = this.ruleForm[type].map(item => item.val + (item.note ? "," + item.note : "")).join("\n"); + this.ipEditForm.ip_list = this.ruleForm[type].map(item => item.val + (item.note ? "," + item.note : "")).join("\n"); }, ipEdit() { this.ipEditLoading = true; let ipList = []; if (this.ipEditForm.ip_list.trim() !== "") { ipList = this.ipEditForm.ip_list.trim().split("\n"); - } + } let arr = []; for (let i = 0; i < ipList.length; i++) { let item = ipList[i]; @@ -714,7 +714,7 @@ export default { }; if (this.ipEditForm.type == "route_include" && ip[0] == "all") { pushToArr(); - continue; + continue; } let valid = this.isValidCIDR(ip[0]); if (!valid.valid) { @@ -768,14 +768,14 @@ export default { var isSwitch = true if (! this.user_edit_dialog) { return isSwitch; - } + } this.$refs['ruleForm'].validate((valid) => { if (!valid) { this.$message.error("错误:您有必填项没有填写。") isSwitch = false; return false; } - }); + }); return isSwitch; }, closeDialog() {