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

背景

自从国内这些运营商开始打击 PCDN 后,整个个网络质量就越来越差。尤其是那个什么流量结算,让跨运营商、跨地区的网络变得十分难用。

不少人认为运营商不能以打击 PCDN 为由限制 NAS 用户备份文件。对于这种情况,本人也是见怪不怪了。其实,这个时候对于运营商来说,不管你跑不跑 PCDN,只要是上传大的,对他流量结算的影响都是一样的。见过很多投诉解开了,回去跑两天 BT / PT、NAS 备份、直播,又给封了的。所以不用抱着侥幸心理,只要这个流量结算存在,不管你跑不跑 PCDN,你上传到省外的流量那么大,不封你封谁。

众所周知,狗子经常使用网盘备份大量文件,属于运营商口中的“上传大户”,换哪家来了都受不了。反正狗子不跑 PCDN / BT / PT,也没有跑的意义,100M 小水管连狗子自己都不够用,更不会去弄个 PCDN 增加连接数去恶心自己的用网体验,最后连电费都跑不回本。而且就算是当时被关 IPv6 + 改 NAT4 的时候,对狗子的使用也没有任何影响,该备份的照样上传,速度也能够跑满,组网也能直连(其他的节点是 NAT1),远程串流一点都不卡,后面倒是投诉解封恢复了。

反倒是后面出的这个限速 5M 的政策,属实给狗子恶心坏了。本人最近有串流的需求,其实不介意中转,但这个串流即使中转也只有 5M 的概念就是连串流 720P 低画质都会卡,直接没法用,就不得不折腾一下了。目前还没到投诉的地步,毕竟测速测不出来,也找不到理由。当然走另外的协议也不是不行,就是要折腾一堆七七八八的东西,搞不好要自己写串流客户端之类的,或者是电脑后台挂一个命令窗口,用起来贼膈应。不然为了串流只能再开一条宽带 / CPE 了。

https://v2ex.com/t/1118730

折腾

当时是用 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://v2ex.com/t/1120910

https://github.com/LGA1150/nf_deaf

至于 udp2raw,由于这玩意是是 C/S 模式,双方都要使用,直接放弃。

然后最近又出现了 FakeHTTP,打算试用一下,最好能够解决问题。

https://v2ex.com/t/1135702

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
2
opkg update
opkg install kmod-nft-queue kmod-nf-conntrack iptables-mod-nfqueue iptables-mod-conntrack-extra

进入 Releases 页面,下载对应 CPU 架构的压缩包。解压后即可直接执行 fakehttp 文件。

这里直接用命令下载和安装。

1
2
3
4
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
2
3
4
5
6
7
8
9
10
11
12
13
14
用法: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
2
3
4
5
6
7
# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> 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 是测速网,从而实现解除限速的目的,但数据包最后到不了服务器,半路就丢了。

你可以使用 nexttracemtrtraceroute 等路由追踪工具查看具体的路由信息。根据狗子的测试,一般“干坏事”的路由很难一次就追踪出 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 的开发者,果然用二次元头像的都是大佬

结尾

如果程序被优化得十分简单就可以使用,那么就会有更多的人使用这个方法来绕过限速。因为限速会影响到正常用户,快进有人到卖突破限速的路由器,搞半天还催生黑产,造成网络危险。到最后运营商不高兴,肯定会研发出新的方法来检测,最终沦为新时代多拨

所以且用且珍惜!