From ed5edda28a17ddd113fd011640d579de648418b9 Mon Sep 17 00:00:00 2001 From: wyx2685 Date: Mon, 4 Mar 2024 22:25:06 +0900 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSing=E5=86=85=E6=A0=B8trojan?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=88=97=E8=A1=A8BUG=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=94=A8=E6=88=B7=E8=AE=BE=E5=A4=87=E9=99=90=E5=88=B6?= =?UTF-8?q?=E4=B8=8D=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/panel/user.go | 7 ++++--- core/hy2/node.go | 4 ---- go.mod | 12 ++++++------ go.sum | 28 ++++++++++++++-------------- limiter/limiter.go | 36 ++++++++++++++++++++++++------------ 5 files changed, 48 insertions(+), 39 deletions(-) diff --git a/api/panel/user.go b/api/panel/user.go index e57b4f9..88286ab 100644 --- a/api/panel/user.go +++ b/api/panel/user.go @@ -57,7 +57,7 @@ func (c *Client) GetUserList() (UserList []UserInfo, err error) { c.userEtag = r.Header().Get("ETag") var userinfos []UserInfo - var localDeviceLimit int = 0 + var deviceLimit, localDeviceLimit int = 0, 0 for _, user := range userList.Users { // If there is still device available, add the user if user.DeviceLimit > 0 && user.AliveIp > 0 { @@ -68,13 +68,14 @@ func (c *Client) GetUserList() (UserList []UserInfo, err error) { // If there are any available device. localDeviceLimit = user.DeviceLimit - user.AliveIp + lastOnline if localDeviceLimit > 0 { - + deviceLimit = localDeviceLimit } else if lastOnline > 0 { - + deviceLimit = lastOnline } else { continue } } + user.DeviceLimit = deviceLimit userinfos = append(userinfos, user) } diff --git a/core/hy2/node.go b/core/hy2/node.go index 07eb507..a916602 100644 --- a/core/hy2/node.go +++ b/core/hy2/node.go @@ -1,8 +1,6 @@ package hy2 import ( - "fmt" - "github.com/InazumaV/V2bX/api/panel" "github.com/InazumaV/V2bX/conf" "github.com/apernet/hysteria/core/server" @@ -31,8 +29,6 @@ func (h *Hysteria2) AddNode(tag string, info *panel.NodeInfo, config *conf.Optio if err := v.Unmarshal(&c); err != nil { h.Logger.Fatal("failed to parse server config", zap.Error(err)) } - h.Logger.Debug("loaded server config:") - fmt.Printf("%+v", c) } n := Hysteria2node{ Tag: tag, diff --git a/go.mod b/go.mod index a174890..58836a1 100644 --- a/go.mod +++ b/go.mod @@ -14,13 +14,13 @@ require ( github.com/goccy/go-json v0.10.2 github.com/hashicorp/go-multierror v1.1.1 github.com/juju/ratelimit v1.0.2 - github.com/sagernet/sing v0.3.2 + github.com/sagernet/sing v0.3.4-beta.1 github.com/sagernet/sing-box v1.9.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.15.0 github.com/xtls/xray-core v1.8.8 - go.uber.org/zap v1.26.0 + go.uber.org/zap v1.27.0 golang.org/x/crypto v0.19.0 golang.org/x/sys v0.17.0 google.golang.org/protobuf v1.32.0 @@ -75,7 +75,7 @@ require ( github.com/francoispqt/gojay v1.2.13 // indirect github.com/gaukas/godicttls v0.0.4 // indirect github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344 // indirect - github.com/go-chi/chi/v5 v5.0.11 // indirect + github.com/go-chi/chi/v5 v5.0.12 // indirect github.com/go-errors/errors v1.0.1 // indirect github.com/go-jose/go-jose/v3 v3.0.0 // indirect github.com/go-logr/logr v1.4.1 // indirect @@ -171,13 +171,13 @@ require ( github.com/sagernet/gvisor v0.0.0-20240214044702-a3d61928a32f // indirect github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97 // indirect github.com/sagernet/quic-go v0.41.0-beta.2 // indirect - github.com/sagernet/sing-dns v0.2.0-beta.6 // indirect + github.com/sagernet/sing-dns v0.2.0-beta.14 // indirect github.com/sagernet/sing-mux v0.2.0 // indirect github.com/sagernet/sing-quic v0.1.9-beta.1 // indirect github.com/sagernet/sing-shadowsocks v0.2.6 // indirect github.com/sagernet/sing-shadowsocks2 v0.2.0 // indirect github.com/sagernet/sing-shadowtls v0.1.4 // indirect - github.com/sagernet/sing-tun v0.2.2-beta.3 // indirect + github.com/sagernet/sing-tun v0.2.4-beta.1 // indirect github.com/sagernet/sing-vmess v0.1.8 // indirect github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect github.com/sagernet/tfo-go v0.0.0-20231209031829-7b5343ac1dc6 // indirect @@ -246,4 +246,4 @@ require ( ) //github.com/apernet/hysteria/core v1.3.5-0.20240201034858-bb99579bb92c => /root/hysteria/core -replace github.com/sagernet/sing-box v1.9.0 => github.com/wyx2685/sing-box_mod v0.0.4 +replace github.com/sagernet/sing-box v1.9.0 => github.com/wyx2685/sing-box_mod v0.0.5 diff --git a/go.sum b/go.sum index 78981fb..8adf09d 100644 --- a/go.sum +++ b/go.sum @@ -228,8 +228,8 @@ github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aev github.com/go-acme/lego/v4 v4.13.2 h1:liIHWM9Wr3bmQ5s8UukfPhC4HOOaue9jRkUyrd8Dk7Y= github.com/go-acme/lego/v4 v4.13.2/go.mod h1:c/iodVGMeBXG/+KiQczoNkySo3YLWTVa0kiyeVd/FHc= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-chi/chi/v5 v5.0.11 h1:BnpYbFZ3T3S1WMpD79r7R5ThWX40TaFB7L31Y8xqSwA= -github.com/go-chi/chi/v5 v5.0.11/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= +github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= @@ -722,10 +722,10 @@ github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97/go.mod h1:xLnfdiJ github.com/sagernet/quic-go v0.41.0-beta.2 h1:NtFC1Ief+SYJkfRq68D1OEqZQTNh2jYSpyRLhjT+m6U= github.com/sagernet/quic-go v0.41.0-beta.2/go.mod h1:X10Mf9DVHuSEReOLov/XuflD13MVLH3WtppVVFnSItU= github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo= -github.com/sagernet/sing v0.3.2 h1:CwWcxUBPkMvwgfe2/zUgY5oHG9qOL8Aob/evIFYK9jo= -github.com/sagernet/sing v0.3.2/go.mod h1:qHySJ7u8po9DABtMYEkNBcOumx7ZZJf/fbv2sfTkNHE= -github.com/sagernet/sing-dns v0.2.0-beta.6 h1:e167d8lW4VEagPGh/fPCgdtGGAPFBgY8g/c4WqKRkQk= -github.com/sagernet/sing-dns v0.2.0-beta.6/go.mod h1:IxOqfSb6Zt6UVCy8fJpDxb2XxqzHUytNqeOuJfaiLu8= +github.com/sagernet/sing v0.3.4-beta.1 h1:y1jKu9u11drNO00ycJ6KOZd1axQdozU92MdhWuAmWnU= +github.com/sagernet/sing v0.3.4-beta.1/go.mod h1:qHySJ7u8po9DABtMYEkNBcOumx7ZZJf/fbv2sfTkNHE= +github.com/sagernet/sing-dns v0.2.0-beta.14 h1:/lelsvJa5S/BWokuYyeCkYdi3hf7DlKGdgsKuamJ9V8= +github.com/sagernet/sing-dns v0.2.0-beta.14/go.mod h1:gfs585rEu+ZgsXJJiecEIK5avrF5SYlCAbFfZ1B66hs= github.com/sagernet/sing-mux v0.2.0 h1:4C+vd8HztJCWNYfufvgL49xaOoOHXty2+EAjnzN3IYo= github.com/sagernet/sing-mux v0.2.0/go.mod h1:khzr9AOPocLa+g53dBplwNDz4gdsyx/YM3swtAhlkHQ= github.com/sagernet/sing-quic v0.1.9-beta.1 h1:rCmgLUq2d4EA643EAvjbfUYYVMPCss0GpmS4pJCT2Lw= @@ -736,8 +736,8 @@ github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wK github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ= github.com/sagernet/sing-shadowtls v0.1.4 h1:aTgBSJEgnumzFenPvc+kbD9/W0PywzWevnVpEx6Tw3k= github.com/sagernet/sing-shadowtls v0.1.4/go.mod h1:F8NBgsY5YN2beQavdgdm1DPlhaKQlaL6lpDdcBglGK4= -github.com/sagernet/sing-tun v0.2.2-beta.3 h1:LEzxRkn10iicWdZAlIKtc0/G9hgzrt/WMZSkRtsbzCw= -github.com/sagernet/sing-tun v0.2.2-beta.3/go.mod h1:TaUYOzyBWK43Si6TadJ4gc7fj2iYZ7kxcp6CzzKey3E= +github.com/sagernet/sing-tun v0.2.4-beta.1 h1:npx/TwmVqsGZxw5aX08oRHpFBaIw3VSgR/CVfz1BA1A= +github.com/sagernet/sing-tun v0.2.4-beta.1/go.mod h1:lkefC8gty7FTuzz9ZoNASueutIhClEz7LHjFK3BLGco= github.com/sagernet/sing-vmess v0.1.8 h1:XVWad1RpTy9b5tPxdm5MCU8cGfrTGdR8qCq6HV2aCNc= github.com/sagernet/sing-vmess v0.1.8/go.mod h1:vhx32UNzTDUkNwOyIjcZQohre1CaytquC5mPplId8uA= github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ= @@ -876,8 +876,8 @@ github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1Y github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= -github.com/wyx2685/sing-box_mod v0.0.4 h1:fEZnkrtUwqJS/6M3drSdv9RXyRvhnuD2UV6rK5U6rLA= -github.com/wyx2685/sing-box_mod v0.0.4/go.mod h1:Q5C14BKQoRzkJ+JPGuMdffHZEoOrlU1zsiBkTtfPoA0= +github.com/wyx2685/sing-box_mod v0.0.5 h1:FtBSiG2ROn/+fp7mrqWMJQJ8a8TUjjaXdmHjbpE6K3E= +github.com/wyx2685/sing-box_mod v0.0.5/go.mod h1:ho6/hitZwnI4VHsIU9V4p3lGaTV0xCw9n1ArXGjQSXg= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= @@ -925,8 +925,8 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -935,8 +935,8 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA= go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= diff --git a/limiter/limiter.go b/limiter/limiter.go index d6bc2ff..c111136 100644 --- a/limiter/limiter.go +++ b/limiter/limiter.go @@ -45,6 +45,7 @@ type Limiter struct { type UserLimitInfo struct { UID int SpeedLimit int + DeviceLimit int DynamicSpeedLimit int ExpireTime int64 } @@ -60,13 +61,15 @@ func AddLimiter(tag string, l *conf.LimitConfig, users []panel.UserInfo) *Limite uuidmap := make(map[string]int) for i := range users { uuidmap[users[i].Uuid] = users[i].Id + userLimit := &UserLimitInfo{} + userLimit.UID = users[i].Id if users[i].SpeedLimit != 0 { - userLimit := &UserLimitInfo{ - UID: users[i].Id, - SpeedLimit: users[i].SpeedLimit, - } - info.UserLimitInfo.Store(format.UserTag(tag, users[i].Uuid), userLimit) + userLimit.SpeedLimit = users[i].SpeedLimit } + if users[i].DeviceLimit != 0 { + userLimit.DeviceLimit = users[i].DeviceLimit + } + info.UserLimitInfo.Store(format.UserTag(tag, users[i].Uuid), userLimit) } info.UUIDtoUID = uuidmap limitLock.Lock() @@ -97,14 +100,17 @@ func (l *Limiter) UpdateUser(tag string, added []panel.UserInfo, deleted []panel delete(l.UUIDtoUID, deleted[i].Uuid) } for i := range added { - if added[i].SpeedLimit != 0 { - userLimit := &UserLimitInfo{ - UID: added[i].Id, - SpeedLimit: added[i].SpeedLimit, - ExpireTime: 0, - } - l.UserLimitInfo.Store(format.UserTag(tag, added[i].Uuid), userLimit) + userLimit := &UserLimitInfo{ + UID: added[i].Id, } + if added[i].SpeedLimit != 0 { + userLimit.SpeedLimit = added[i].SpeedLimit + userLimit.ExpireTime = 0 + } + if added[i].DeviceLimit != 0 { + userLimit.DeviceLimit = added[i].DeviceLimit + } + l.UserLimitInfo.Store(format.UserTag(tag, added[i].Uuid), userLimit) l.UUIDtoUID[added[i].Uuid] = added[i].Id } } @@ -128,8 +134,10 @@ func (l *Limiter) CheckLimit(uuid string, ip string, isTcp bool) (Bucket *rateli // check and gen speed limit Bucket nodeLimit := l.SpeedLimit userLimit := 0 + deviceLimit := 0 if v, ok := l.UserLimitInfo.Load(uuid); ok { u := v.(*UserLimitInfo) + deviceLimit = u.DeviceLimit if u.ExpireTime < time.Now().Unix() && u.ExpireTime != 0 { if u.SpeedLimit != 0 { userLimit = u.SpeedLimit @@ -157,6 +165,10 @@ func (l *Limiter) CheckLimit(uuid string, ip string, isTcp bool) (Bucket *rateli counter++ return true }) + if counter > deviceLimit && deviceLimit > 0 { + ipMap.Delete(ip) + return nil, true + } } }