[长文] 移动白名单上传限速机制,以及解决办法

mikewang:

背景

移动开始对白名单以外的域名、网络协议进行上传限速。

具体表现在:

  • 国内网盘、邮箱、微信、测速网站等上传一切正常。
  • 使用 IPv6 公网回家连 NAS ,或者 IPv4 打洞回家,读取文件异常缓慢。
  • BT 没有上传流量。
  • iperf3 测速只有 1 Mbps 左右。
  • 上传被限速,达到 1 Mbps 峰值时,时有丢包现象或者 ping 值上升。

除了移动以外,其他运营商也有类似表现:

  • /t/1112956 北京移动 测速正常但上传看着确实变小了
  • /t/1057505 移动似乎对非常用端口上传进行了限速
  • /t/1063534 电信宽带测速正常,NAS 上传被限速
  • /t/1108373 上海电信上传限速
  • /t/1081007 上海电信上传限速

限速机制

深度包检测。默认限速 1 Mbps ( 125 kB/s ),检测到白名单协议、域名之后,放开至正常速(我测得 100 Mbps )。

以下均是我在移动宽带下测得的结果。

TCP

  • HTTPS:TCP 443 端口,SNI 探测

    目标端口为 443 的 TCP 连接建立成功,客户端发送的 TLS Client Hello 包含白名单域名,解除限速。

    比如,在 TCP 建立时,使用下方二进制串,即可解除限速。虽然很多字段是不合法的,比如长度填了 0 ,域名直接放在了最后。但是不影响上游匹配到了 TLS 特征,并命中了域名关键字,放开限速。

    1
    2
    3
    4
    5
    6
    7
    "\x16"         // Handshake
    "\x03\x00" // TLS version
    "\x00\x00" // Length (0)
    "\x01" // Client Hello
    "\x00\x00\x00" // Length (0)
    "\x03\x00" // TLS version
    "speedtest.cn"

    这个检测仅适用于 443 端口。其他端口使用 HTTPS 依然保持限速。

  • HTTP:所有 TCP 端口,HTTP 头 Host 字段检测

    同样地,只要匹配到关键特征即可解除限速。

    1
    2
    3
    "HTTP/\r\n"
    "Host: speedtest.cn\r\n"
    "\r\n"

UDP

  • DNS:53 端口,首个 UDP 包含有 DNS 协议特征

    目标端口为 53 端口,只要第一个 UDP 包发送含有如下 DNS 特征的请求,就可以解除限速。同样是特征匹配,不需要合法。

    1
    "\0\0\1\0\0\1\0\0\0\0\0\0\0\0\0\1\0\1"
  • 待发现

    尚未找出对其他 UDP 端口解除限速的方法。

补充

该检测会追踪整个 TCP 的状态。在已建立的 TCP 连接中,构造 SYN 之后再发 SNI 或者 HTTP 特征并不会骗过检测机制,达成解除限速的效果。

话说,这个探测方式是不是很眼熟。我怀疑是不是某个神秘技术下放到了运营商,区别只在:一个是检测到就断流,一个是检测到就恢复上传速度。

解决方案

这里介绍除了投诉以外的规避方案。

带 HTTP 混淆的网络工具

设置混淆的 host 为白名单网站即可。

udp2raw 中加上 HTTP 特征

使用 TCP 协议作为隧道可能不是最佳,因此我 fork 了 udp2raw ,在上面加上了 HTTP 特征: https://github.com/MikeWang000000/udp2raw

这个特征很明显的通过了运营商的检测,上传速度恢复到 100 Mbps 。

可以参考这个提交:commit c4995ea

使用方法是在参数后加上 --fake-http [speedtest.cn](http://speedtest.cn/) 这样就会混淆为在访问测速网站。

对于一般的 TCP 连接

(理论上,未验证)可以使用 eBPF 等手段,在 TCP 连接建立时,使用较小的 TTL 发送 HTTP 特征。这样既通过了运营商的检测,又不会到达服务器。

后记

因为省间结算,运营商费尽心机限制用户上传。这种白名单机制也让用户难以投诉:常见网站、测速网站的上传检测都是正常。运营商可以直接不承认有限速行为,而归结为用户问题。不知道以后还有什么新的手段呢?