免流分析

这里说的免流就是绕过移动、联通、电信这些 ISP 的流量计费系统,让计费系统认为我们的流量是合法的免计费流量(当然手段是非法的)。

tiny 本地免流(wap):原始方式是利用 10.0.0.172:80、10.0.0.200:80 HTTP代理服务器(wap 网关)进行免流的,基本原理是利用代理计费的 HTTP 头部差异进行免流的,这种方式在早期还挺好用的,因为基本满速,还不用额外云服务器费用。不过 ISP 也对这种方式进行了重点打击,基本上已经修复了所有可能的计费漏洞,代理计费系统基本上都使用同一套标准,已经没有可利用的地方了。

tiny 云端免流(net):因为 10.0.0.172、10.0.0.200 已经不可能再利用了,所以我们只能购买 VPS 云服务器,在 80 端口搭建 HTTP/HTTPS 代理服务器,这个代理服务器需要能够处理 HTTP 代理、HTTP-Tunnel 代理(CONNECT),并且这个代理服务器与平常的 HTTP 代理服务器要不一样,需要将真实的 Host 头部伪装起来,以此欺骗计费系统(tiny 发送的包的 Host 头部为免流 Host,而真实的 Host 则使用其它头部传递给 HTTP 免流代理服务器)。这个代理服务器一般需要自己开发,因为网上找的一般用不了。HTTPS 代理很简单,单个 TCP 连接只需处理第一个 HTTP 请求头部,找到真实 Host 字段,与目的主机建立 TCP 连接,然后无脑转发数据就可以了。而 HTTP 代理就稍微复杂一点了,现在大多数 HTTP 客户端和服务器都启用了 Connection: keep-alive 保持长连接,所以单个 TCP 连接可能有多个 HTTP 请求(强调一点,HTTP 协议必须由客户端主动发送请求,服务端才会进行响应,客户端发送的数据只有 HTTP 请求,如果是 GET/HEAD 等请求,则没有附带请求体,如果是 POST 等请求,则附带请求体)。而在服务端需要做的就是将客户端发过来的每个 HTTP 请求的头部都进行替换,将真实 Host 替换到假的 Host 上,然后再转发给目的主机,而目的主机发过来的数据无需处理,只需无脑转发,也就是只需要处理请求,响应不用动。

ssr/openvpn 云免:ssr/openvpn 免流的原理都差不多,不过因为 openvpn 配置稍微复杂,而且感觉有点笨重,所以建议使用 ssr 云免。ssr 混淆需要使用 http_simple(端口当然为 80,基本常识),伪装成 GET 请求,我们只需在客户端的混淆参数中填上免流 Host 就可以使这个 GET 请求的 Host 字段为免流 Host。不过因为 ss/ssr 被干扰的多,所以速度可能略微慢了点,测试发现只有 http隧道 + ssh隧道 方式的一半。不过因为 ssr 比较容易搭建,所以也是不错的选择。

ssh-tunnel via http-tunnel 云免:这应该是最佳的方式,速度最快,而且建立的连接数最少,理想情况下只会有一个 TCP 连接,显著减少因为频繁建立 TCP 连接导致的延迟增加问题。ssh-tunnel 就是 ssh socks5 隧道代理,在 linux vps 上非常容易搭建,因为 sshd 默认都自带,只要创建一个普通无权限帐号就可以使用。但是仅有 ssh-tunnel 还不能达到免流的目的,因为需要伪装为 HTTP 请求啊,所以我们需要 ssh 服务器上搭建一个非标的 http-tunnel 代理服务器。这个非标 http-tunnel 代理只关心某个头部字段,比如不起眼的 Cookie 字段,通过它来传递需要的信息(本机 sshd 的端口号,为了安全可以加个密码,而且最好进行某种编码,比如 base64),而客户端则通过这个 http-tunnel 代理来连接该服务器上的 sshd 服务,进行 ssh-tunnel 代理。我们要做的手脚就是在建立 http-tunnel 连接的时候,伪装免流 Host 就可以了。在 Android 上,我们可以使用 HTTP 注射器(Injector)来完成,它好像就是专门用来免流用的。在配置模式的时候,不要使用 CONNECT 请求方法,因为 ISP 已经和谐了此方式,它认为只有为了免流的人才会发送此请求,所以只要看到了 CONNECT 请求就不会加入免流白名单。建议使用 GET/POST 请求方法,因为我们的 http-tunnel 代理服务器只要 Cookie 头部的信息就行,所以管你是什么请求方法都能正常连接到 sshd 服务器。强调一点,这个 http-tunnel server 和 ssh-tunnel server 可以在同一台 vps 上,也可以在不同的 vps 上,但是强烈建议位于同一 vps,因为性能最好啊。http 注射器只会建立一条与 http-tunnel 的长连接,所以 TCP 握手次数很少,跳点可以说基本没有,最多也就是开始启动 http 注射器前那一点儿流量会走掉。而且下载、上传速度都很不错,比 ssr 云免强,ssr 云免只能达到 4m/s 的下载速度,而 http 注射器可以达到 6m/s 的下载速度。且跳点明显更少,也可能是因为 tcp 连接只有一条的缘故,减轻了计费系统的负担。起初我还以为需要使用 POST 等有请求体的 HTTP Method 才能免掉上传的流量(因为怕计费检测到),但测试发现,只要在 GET 请求体中加入 Connection: keep-alive 长连接头部(纯属推测,未验证过),计费系统就会只检测第一个 HTTP 请求体,如果是免流的请求则将这整条 TCP 连接的流量都免掉,无论上行还是下行。综上所述:HTTP 注射器免流方法是最好的,速度快、跳点低、连接数低