长城防火墙(Great Fire Wall, GFW)依赖被动嗅探和主动探测来封禁节点,因此我参考WallesPKU1的思路,编写了一种基于iptables的白名单管理工具blockGFW。这种工具能够屏蔽GFW的主动探测,延长节点的存活时间。实验证明在二十大期间,部署该工具的三个vmess节点并未受到封禁。同时该白名单管理工具对用户使用体验影响较小。

被动嗅探

GFW会抓取数据包分析流量特征, 从而识别翻墙流量。所以一些特征明显的协议,如VPN,SSH隧道短暂被用于翻墙之后便被封禁。Shadowsocks,v2ray这些后起之秀凭借加密混淆,显著减少了协议特征,使得这些协议寿命得到一定地延长。

主动探测

根据gfw.report的研究2, GFW已经启用主动探测的手段来识别Shadowsocks服务器,其首先监测网络连接找出疑似Shadowsocks的连接,然后再把自己伪装成一个客户端,尝试对疑似Shadowsocks的服务器进行连接,从而验证自己的猜测。

blockGFW工作原理

对于GFW来说,互联网中的协议多如牛毛,且流量巨大,要精准识别翻墙流量是一件困难的事情。如果GFW封禁范围太大,很容易造成正常业务无法使用,所以先通过被动嗅探预筛选出可疑流量、缩小探测范围,再对这些可疑流量进行主动探测,最终确认其是否为翻墙流量就成了一种理所当然的方式。通过前面对被动嗅探和主动探测的介绍,我们可以从以下两个方面入手,延长节点寿命:

  1. 使用特征更少的协议
  2. 封锁GFW的主动探测 针对第一点,一方面我们的翻墙协议应该保持更新,及时修复协议漏洞;另一方面也可以使用自行设计的混淆协议,这样目标小,不容易被墙研究破解。对于第二点,我们可以通过白名单机制阻断GFW主动试探,从而使GFW不能确认加密流量的类型。

白名单策略

白名单策略是指, 我们通过数据过滤防火墙, 只允许服务器接收特定 IP 来源的入站流量, 而拒绝所有别的流量. 具体而言, 我们在翻墙节点上运行blockGFW,. 用户在翻墙前通过访问订阅链接记录自己的 IP,这样翻墙节点就可以只接受用户IP,而拒绝GFW的主动探测。 但是这样操作会给用户带来不必要的负担. 用户的网络环境可能很复杂; 宽带的每次重新拨号, 从 WiFi 环境过度到蜂窝网, 或者在蜂窝网的不同基站之间穿梭都可能会导致 IP 的变化, 从而无法被服务器识别. 为了减轻用户的负担, 我们把 IP 注册功能和 订阅更新功能绑定. 用户每次向订阅服务器请求订阅列表的时候, 我们会抽取用户的 IP, 然后更新blockGFW的白名单列表. 这样的策略大大减轻了用户的操作负担. 实践中我们还发现开放 22 端口和接受 ICMP 包并不会导致服务器被墙. 为了避免开启防火墙导致失联, 我们可以考虑开放 ICMP 协议和 22 端口.

致谢

本文参考了以下链接,并通过修改开源程序selfhelp-iptables形成了blockGFW,没有他们的无私奉献,GFW的封锁只会愈加严厉,感谢这些披荆斩棘的前行者们。

参考链接


  1. [以墙制墙: 用白名单防火墙对抗 GFW 主动探测][https://wallesspku.com/misc/2020/04/13/eye4eye.html] ↩︎

  2. [Shadowsocks 是如何被检测和封锁的][https://gfw.report/blog/gfw_shadowsocks/zh.html] ↩︎