使用 FakeHTTP 绕过运营商白名单限速 5M 上行

使用 FakeHTTP 绕过运营商白名单限速 5M 上行
狂犬主子背景
自从国内这些运营商开始打击 PCDN 后,整个个网络质量就越来越差。尤其是那个什么流量结算,让跨运营商、跨地区的网络变得十分难用。
不少人认为运营商不能以打击 PCDN 为由限制 NAS 用户备份文件。对于这种情况,本人也是见怪不怪了。其实,这个时候对于运营商来说,不管你跑不跑 PCDN,只要是上传大的,对他流量结算的影响都是一样的。见过很多投诉解开了,回去跑两天 BT / PT、NAS 备份、直播,又给封了的。所以不用抱着侥幸心理,只要这个流量结算存在,不管你跑不跑 PCDN,你上传到省外的流量那么大,不封你封谁。
众所周知,狗子经常使用网盘备份大量文件,属于运营商口中的“上传大户”,换哪家来了都受不了。反正狗子不跑 PCDN / BT / PT,也没有跑的意义,100M 小水管连狗子自己都不够用,更不会去弄个 PCDN 增加连接数去恶心自己的用网体验,最后连电费都跑不回本。而且就算是当时被关 IPv6 + 改 NAT4 的时候,对狗子的使用也没有任何影响,该备份的照样上传,速度也能够跑满,组网也能直连(其他的节点是 NAT1),远程串流一点都不卡,后面倒是投诉解封恢复了。
反倒是后面出的这个限速 5M 的政策,属实给狗子恶心坏了。本人最近有串流的需求,其实不介意中转,但这个串流即使中转也只有 5M 的概念就是连串流 720P 低画质都会卡,直接没法用,就不得不折腾一下了。目前还没到投诉的地步,毕竟测速测不出来,也找不到理由。当然走另外的协议也不是不行,就是要折腾一堆七七八八的东西,搞不好要自己写串流客户端之类的,或者是电脑后台挂一个命令窗口,用起来贼膈应。不然为了串流只能再开一条宽带 / CPE 了。
折腾
当时是用 iperf3
测速,发现速度不对,换了好多个组网软件,全都不对劲。用各种测速测上行都能跑满,上传知名的网盘也可以跑满,就是传私人的服务跑不满。最抽象的是那个运营商的网盘不在白名单里面就离谱。折腾半天发现是运营商的问题,去网上一搜发现这种是普遍现象。没过几天,狗子的 B 站首页就天天被各种限速的案例刷屏了,哈哈。
不过当时发现 HTTP 没有出现限速的问题,就将上传的地址改成 HTTP,虽然不安全,但是能跑满。试了只要套 SSL/TLS 就限速,HTTP + Websocket 也是不行的。据说部分地区又是反过来,不知道是不是听反指令了,哈哈。
后面无意间发现往 VPS 上传数据的时候发现 SSH 能跑满,然后发现 FRP 支持用 SSH,试了下,确实可以跑满,而且超级安全,就给一些异地备份的工作改用这套传输方案,缺点是 SSH 加解密传输超级吃 CPU。
然后平时上传大文件的话就分流到另一条没限速的宽带。反正根据木桶效应,虽然会比现在这条宽带慢一点,毕竟那边只给 30~50M 上行,但肯定是要比被限制的 5M 要快得多,至少快 3 倍以上。如果没有宽带的话,各大云厂商也有一些大带宽的服务器,可以了解一下,这些服务器通常都有三网 BGP 接入,而且都是运营商的大客户,一般不会轻易限速(遇到蝗虫邻居另当别论),便宜一般是签了“对赌”协议。为了避免推广嫌疑,这里就不说名称了。而且需要注意使用限制,建议到手 dd 系统。
说回到工具。其实狗子很早就尝试过给 OpenWrt 编译 nf_deaf
了,但是没用,看了下它那个默认 payload 是 FTP 协议,估计 FTP 没在白名单里面,狗子这边测试速度还是一样的垃。网络上发现有些人还是可以使用这个默认的 payload 突破上行的,不然狗子差点以为这个工具就是哄人的。
https://github.com/LGA1150/nf_deaf
至于 udp2raw
,由于这玩意是是 C/S 模式,双方都要使用,直接放弃。
然后最近又出现了 FakeHTTP,打算试用一下,最好能够解决问题。
https://github.com/MikeWang000000/FakeHTTP
前提
首先是你的宽带要已经被限速。没被限速但是要访问被限速的,也可以试试看。
- 这里说的 5M 指的是 5 Mbps,单位是比特不是字节,如果你的上传速度是 5 MBytes/s,相当于是 50M 的上行,为正常现象。国内宽带 1000M 配 30M 上行都算正常。
另外常见的限速案例大致分两种:
- 一种是高科技 QoS,基于 DPI 深度包检测,白名单外限速,那你就需要知道你用的哪些网站没有被限速;
- 一种是胡子眉毛一把抓,所有流量统统限速,有的案例甚至用运营商的自己省内的测速工具都测不达标,这种情况下就要么投诉、要么换网吧。
当然还有特殊情况,比如限制连接数、DNS 解析等,反正都是低劣的手段。
此外对于路由器的系统也是有一定的要求,最好是 OpenWrt 系统。建议使用软路由,且确保 CPU 性能足够。
如果你的路由器、服务器支持开启 BBR 加速,据说有效果,你也可以开启试试看,反正狗子早就开了,没效果。
https://mp.weixin.qq.com/s/wsqbU0b1PVIlN5Oz-glafA
原理
在 TCP 三次握手之后,立即发送一个 HTTP GET 请求,Host 为指定域名。使用 NFQUEUE 实现。
在 TCP 连接建立时,使用较小的 TTL 发送 HTTP 特征。HTTP 特征由于 TTL 值很低,被半路丢弃,目标服务器收不到,所以不需要任何处理。这样既通过了运营商的检测,又不会到达服务器。
其实这个相当骗运营商说是你在用 HTTP 协议请求一个白名单内的网站。
另外要说明一下这个 FakeHTTP 不是内核模块,这点和 nf_deaf
不太一样。它的原理跟那些透明代理插件有点像,走的是 iptables
之类的防火墙。
FakeHTTP 的一个好处是不用编译,不然 OpenWrt 用的 C 库是 musl
不是 glibc
,直接在 Ubuntu 这种下面用 gcc
编译的用不了,哪怕都是 x86_64
,你还要去折腾 OpenWrt 的那套编译工具链,编译完还要配置防火墙,各种掩码,头都给你搞大。FakeHTTP 就没有这种麻烦,防火墙那些都会自动给你调好,等稳定了说不定哪天直接合入 OpenWrt 软件库,到时候连依赖安装都没这么麻烦。
使用
https://github.com/MikeWang000000/FakeHTTP/wiki
首先,打开路由器的 SSH,然后用 SSH 工具连接到你的路由器。
执行命令,安装以下内核模块与 iptables
扩展。现在新一点的 OpenWrt 用的是 nftables
,因此这里以 nftables
为例。如果你是 iptables
,那么以下命令不适合你。
1 | opkg update opkg install kmod-nft-queue kmod-nf-conntrack iptables-mod-nfqueue iptables-mod-conntrack-extra |
进入 Releases 页面,下载对应 CPU 架构的压缩包。解压后即可直接执行 fakehttp
文件。
这里直接用命令下载和安装。
1 | curl -L https://gh.xrgzs.top/https://github.com/MikeWang000000/FakeHTTP/releases/latest/download/fakehttp-linux-x86_64.tar.gz -o fakehttp.tar.gz tar xzvf fakehttp.tar.gz chmod +x ./fakehttp-linux-x86_64/fakehttp ./fakehttp-linux-x86_64/fakehttp |
应该就能运行了,以下是执行参数,以实际的为准:
1 | 用法:fakehttp [选项] 选项说明: -d 作为守护进程运行 -h <主机名> 用于混淆的主机名(必需) -i <网络接口> 网络接口名称(必需) -k 终止正在运行的进程 -m <标记> 设置 fwmark 以绕过队列 -n <编号> netfilter 队列编号 -r <重复次数> 将生成的数据包重复 <重复次数> 次 -s 启用静默模式 -t <ttl值> 生成数据包的 TTL -w <文件> 将日志写入 <文件> 而非标准错误输出 -x <掩码> 设置 fwmark 的掩码 |
接下来找到你上网的网络接口(WAN 口)。狗子这边是光猫拨号,因此没有 pppoe-wan
。请以实际的为准。
然后这里的主机名对应没有限速的域名。生成命令如下:
1 | ./fakehttp-linux-x86_64/fakehttp -h www.speedtest.cn -i eth1 |
执行命令,此时屏幕会输出一堆包含 IP 连接信息的日志,说明成功,否则就是环境不对,需要重新安装依赖。
如果需要设置成开机启动,可以进入 luci http://192.168.1.1/cgi-bin/luci/admin/system/startup
,在 本地启动脚本 中加入以下命令,在开机时使用 -d
参数运行即可,程序会在后台运行。
1 | # Put your custom commands here that should be executed once # the system init finished. By default this file does nothing. /root/fakehttp-linux-x86_64/fakehttp -h www.speedtest.cn -i eth1 -d exit 0 |
如果要关闭后台运行,可以使用 -k
参数运行,会自动删除添加的防火墙规则。
测速
终于到了喜闻乐见的测速环节。
首先要在测速服务器上启用 iperf3
:
1 | iperf3 -s |
然后在电脑上连接服务器进行测速。
这里服务器是国内跨省阿里云的,那边入站应该是共享 100M,这里单线程能跑到 50M 左右,已经不错了,用 -P 8
测了下多线程能跑满。
1 | > iperf3 -c <服务器IP> Connecting to host <服务器IP>, port 5201 [ 5] local 10.0.1.123 port 12782 connected to <服务器IP> port 5201 [ ID] Interval Transfer Bitrate [ 5] 0.00-1.01 sec 11.9 MBytes 99.1 Mbits/sec [ 5] 1.01-2.01 sec 15.1 MBytes 126 Mbits/sec [ 5] 2.01-3.01 sec 9.00 MBytes 75.9 Mbits/sec [ 5] 3.01-4.01 sec 7.88 MBytes 66.3 Mbits/sec [ 5] 4.01-5.01 sec 6.25 MBytes 52.0 Mbits/sec [ 5] 5.01-6.01 sec 4.12 MBytes 34.8 Mbits/sec [ 5] 6.01-7.01 sec 4.50 MBytes 37.9 Mbits/sec [ 5] 7.01-8.01 sec 4.88 MBytes 40.9 Mbits/sec [ 5] 8.01-9.01 sec 3.62 MBytes 30.1 Mbits/sec [ 5] 9.01-10.01 sec 3.75 MBytes 31.5 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate [ 5] 0.00-10.01 sec 71.0 MBytes 59.5 Mbits/sec sender [ 5] 0.00-10.05 sec 69.3 MBytes 57.8 Mbits/sec receiver iperf Done. |
在路由器上使用 Ctrl+C 结束运行 FakeHTTP ,然后再在电脑上用 iperf3
测速:
1 | > iperf3 -c <服务器IP> Connecting to host <服务器IP>, port 5201 [ 5] local 10.0.1.123 port 12782 connected to <服务器IP> port 5201 [ ID] Interval Transfer Bitrate [ 5] 0.00-1.01 sec 3.38 MBytes 28.1 Mbits/sec [ 5] 1.01-2.00 sec 512 KBytes 4.22 Mbits/sec [ 5] 2.00-3.01 sec 512 KBytes 4.16 Mbits/sec [ 5] 3.01-4.00 sec 640 KBytes 5.27 Mbits/sec [ 5] 4.00-5.01 sec 640 KBytes 5.21 Mbits/sec [ 5] 5.01-6.01 sec 640 KBytes 5.27 Mbits/sec [ 5] 6.01-7.00 sec 640 KBytes 5.25 Mbits/sec [ 5] 7.00-8.00 sec 512 KBytes 4.20 Mbits/sec [ 5] 8.00-9.01 sec 640 KBytes 5.19 Mbits/sec [ 5] 9.01-10.01 sec 640 KBytes 5.27 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate [ 5] 0.00-10.01 sec 8.62 MBytes 7.23 Mbits/sec sender [ 5] 0.00-10.06 sec 6.71 MBytes 5.59 Mbits/sec receiver iperf Done. |
这个速度肯定有鬼,而且狗子是半夜三更测速,还不是用网高峰期。设置多少线程都没有用,总共加起来还是 5M。
对比说明,这个工具对于狗子的宽带在一定程度上是有用的。但经过实际测试,在狗子这对于上传 HTTPS 没有太大帮助,仅对其它的 TCP 协议有效。对于 ZeroTier 这种 UDP 协议是无用的,还需寻找 TCP 的组网工具。
调优
根据原帖,作者的 TTL 默认设置为 3。这里解释一下 TTL(Time to Live,生存时间)可以理解为数据包在网络中经过路由器(网关)的最大台数,每经过一台路由器就会增加一跳,就是这么简单。
由于网间结算涉及到 “3Q”——三网互相 QOS ,跨网 Q ,跨省 Q ,UDP Q ,有些时候你的运营商也是被其它运营商限速,所以根据木桶效应,需要适当增加 TTL 跳数以便让这个 HTTP 数据包达到最后一个 QOS 路由节点。
比如你在 OpenWrt 路由器上运行设置为 3 跳,假设你是光猫拨号,也就是从你的 OpenWrt 路由器开始,光猫是第 1 跳,运营商的路由器上有 2 跳,然后就停止了,那么运营商路由的那 2 跳就可以知道你的 host 是测速网,从而实现解除限速的目的,但数据包最后到不了服务器,半路就丢了。
你可以使用 nexttrace
、mtr
、traceroute
等路由追踪工具查看具体的路由信息。根据狗子的测试,一般“干坏事”的路由很难一次就追踪出 IP 地址,只显示 *
,需要用 MTR 多次追踪才能查到。
比如狗子这里的测试结果:
- 对于国内服务器,设置 TTL 为 1、2 都是限速,直到设置 3 才解除,路由追踪刚好就那一跳显示不出来,MTR 查出来那一跳是一个地州的 IP,说明限狗子国内服务器速的路由就是地州的运营商;
- 对于某家日本 VPS,设置 TTL 为 3 都是限速,直到设置 4 才解除,路由追踪刚好就那一跳显示不出来,MTR 查出来那一跳是一个省上的 IP,说明限狗子国外服务器速的路由就是省级的运营商;
- 对于某家韩国 VPS,设置 TTL 为 4 都是限速,路由追踪有好几跳都显示不出来,那就重点试那几跳,直到设置 6 才解除,MTR 查出来那一跳是骨干网的 IP,说明限速的路由就是骨干网。
- 像这台鸡子,说是三网优化,测试下来去程回程都一样,延迟确实不高,下行也正常,但回程的优先级肯定是排得低的
这些知识还可以在你购买的 VPS 出现 QOS 速度问题时提供参考和解决方案,当然也不是每个路由都吃测速白名单这套的。对于 iperf3 测速服务器的获取,不一定非得购买对应的服务器,某些 VPS 的买家会提供 Looking Glass Server,你可以去找找看。这里避免广告嫌疑就不放链接了,反正经常玩鸡的人应该都能找得到。
另外还有一个 -r
参数,可以设置重发次数。狗子遇到不是每一次测速都能跑满。这些参数需要你根据你的实际使用环境测试。目前程序属于测试阶段,需要等待作者进一步调优。目前还不支持 IPv6(PR:#5)。
另外发现如果这个 iperf3
加个 -t 0
参数一直跑着,即使给 FakeHTTP 停了,也不影响测速。反之,如果先测速,然后再开 FakeHTTP,那么测速就是 5M。说明只需要在连接建立的时候发那个 HTTP 欺骗即可,有点像 STUN + NAT1 的思路。然后发现这个作者就是打洞软件 Natter 的开发者,果然用二次元头像的都是大佬。
结尾
如果程序被优化得十分简单就可以使用,那么就会有更多的人使用这个方法来绕过限速。因为限速会影响到正常用户,快进有人到卖突破限速的路由器,搞半天还催生黑产,造成网络危险。到最后运营商不高兴,肯定会研发出新的方法来检测,最终沦为新时代多拨。
所以且用且珍惜!