Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

REALITY: Add rate limiting to fallback handling via token bucket #4553

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

Meo597
Copy link
Contributor

@Meo597 Meo597 commented Mar 26, 2025

这下小学生论坛的mjj们再也不用担心reality偷cf导致小鸡流量被人偷了

建议配置
给一个较大的after以应付探测,rate和brust弄小点防止mjj偷流量
过大的after和brust将起不到限速效果,过小的rate和brust则十分容易被探测
应结合被偷网站的资源大小合理设置参数
如果不允许突发,可以把brust设为和rate一样

技术细节:
当传输after减去brust字节后开启限速算法
限速采用令牌桶算法
桶的容量是brust,每传输一个字节用掉一个token,初始brust是满的
每秒以rate个token填充桶,直到容量满

示例配置:
如果下载一个文件,效果是:
前10mb不限速,然后被卡256kb/s
如果此时暂停了一会儿,随着时间推移慢慢攒令牌直到上限
再恢复下载又能跑到突发的2mb/s,然后继续被限为256kb/s

至于上行按感觉来配比,一般给很小就足够了

{
    "inbounds": [ // 服务端入站配置
        {
            // 省略...
            "streamSettings": {
                  // 省略...
                "realitySettings": {
                    // 省略...
                    // 下列六个 limit 为选填,可对回落的 REALITY 连接限速,单位是字节/秒。默认为 0 即不启用
                    "limitUploadRate": 65536, // 上行基准速率 64kb/s
                    "limitUploadBrust": 65536, // 上行不允许突发
                    "limitUploadAfter": 0, // 立即对上传开启限速
                    "limitDownloadRate": 262144, // 下行基准速率 256kb/s
                    "limitDownloadBrust": 2097152, // 下行突发速率 2048kb/s
                    "limitDownloadAfter": 10485760 // 下载10mb后开启限速
                }
            }
        }
    ]
}

@Meo597
Copy link
Contributor Author

Meo597 commented Mar 26, 2025

TODO:

  1. 现在的mod require是我这里的,为了临时测试
    等reality的repo合了之后才有哈希再改此PR

  2. 我这里的protobuf版本有点高,不行的话 @RPRX 只能你生成了

@Fangliding
Copy link
Member

然后面板脚本们随便往里填个或高或低默认参数 很多reality就有了一个限速特征 如果是中间人的人话还可以顺便观察到别人可以长时间得到高于主动探测的速度

@Meo597
Copy link
Contributor Author

Meo597 commented Mar 26, 2025

探测想要触发到限速,是需要时间和带宽成本的
合理的参数想被探测出来,墙需要无差别cc攻击所有目标

然后还可以加rate随机抖动


刚才随机找了几个可以偷的站,体积小的2mb,图片很多的也不过30mb
如果担心brust给太大起不到限速效果
也可以加limitUp/DownloadAfter且随机化再限速
刚刚加好了,没测,目测没问题


至于中间人那就跟限速无关了
假设真的无差别中间人所有
不用探测限速都知道你在爬梯

@RPRX
Copy link
Member

RPRX commented Mar 29, 2025

这个功能我打算在 REALITY 抗量子更新之后合并,因为现在支持抗量子的服务端 CF 占最多?Nginx 用的 OpenSSL 才刚合并它

至于会引入限速特征,虽然会标明,但即使不标明,这太明显了,任何人都应该能自己想到吧,所以说这是个风险自负的问题

@Meo597
Copy link
Contributor Author

Meo597 commented Mar 29, 2025

我感觉特征这块还好,因为:

  • 毕竟他都偷CDN了,ASN都不在一个段,不用探测都知道是reality
  • 同ASN的话,站长也没必要反过来把reality当边缘,流量都一样跑何苦呢

实在不行下个PR加个参数随机浮动

@RPRX
Copy link
Member

RPRX commented Mar 29, 2025

反正要偷 CDN 就是个风险自负的问题,不偷 CDN 的话也用不上这个限速,确实得说明一下以防面版脚本们无差别设默认值

@Meo597
Copy link
Contributor Author

Meo597 commented Mar 29, 2025

好了,markdown和官方文档都加了警告和用法。

为了跑通测试,mod用的是我的repo,merge的时候记得删了这两行:
go.mod

// temp test
replace github.com/xtls/reality => github.com/meo597/reality v0.0.0-20250329150927-d77e7560feae

@Fangliding
Copy link
Member

看了一眼好长的选项 感觉加个下行限速够了

@Meo597
Copy link
Contributor Author

Meo597 commented Mar 31, 2025

after和brust是为了规避探测,因此要3个
上下行都可以被滥用,因此要x2

nginx也是六个参数限速,当前行为也和nginx一模一样
或者你有啥好办法没

@Fangliding

@Meo597 Meo597 force-pushed the feature-reality-fallback-ratelimit branch from 6d2b816 to 4cde0ed Compare March 31, 2025 13:38
@Meo597 Meo597 force-pushed the feature-reality-fallback-ratelimit branch from 4cde0ed to 99118bc Compare April 12, 2025 10:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants