最近复习了一下 gfw.repot 的论文,手写了一个工具用来检测海外服务的连通性,把线程拉到了 6 万线程,基本上就贴着默认可用端口跑,这样比较快,结果被 GFW 拉清单了,一开始很诧异,大约 90 秒后解封,多次测试后发现时间相对来说非常固定,然后我就开始针对这个机制研究起来,无聊就随便写写。。
被拉黑的这段期间很神奇,用起来就跟伊朗那边的墙一样,从这里一窥合理怀疑墙其实真的分至少两个部分。
1. 国内网站没问题,因为没墙,有省墙的不好说,测试分别使用了东莞电信和东莞移动进行,确认过软路由杠杠的,并没有爆炸,不是残存 TCP 才导致所谓没问题
2. 有些域名有白名单,比如 Steam / GitHub 等网站,如果在你没有被拉黑的时候就能访问,那你被短暂拉黑后也能访问,为了方便理解把它们成为 Tier 1 网站,猜测与无状态 GFW 有关
3. 没有白名单的网站的协议在被拉黑期间通通被阻断了,只能收到握手,但是无法进行数据传输,这里把它们称为 Tier 2 网站,猜测与有状态 GFW 有关
墙有豁免并不出奇,但是让我感到惊讶的是它居然不完全豁免 SSH ,目前只发现有部分 SNI 是被完全豁免的,在拉黑期间测试了 VLESS / Reality / WireGuard / Shadowsocks 和 SSH ,只有偷了其中一些豁免域名的证书的 Reality 能正常工作,否则只能依赖没有墙的国内线路中转。
根据以上发现,判断它们的顺序,很有可能先交给无状态的防火墙处理,然后再交给有状态的防火墙处理,无状态的墙只要满足 SNI 豁免列表,如 Tier 1 里的网站,则此连接会被豁免,且这个无状态的防火墙没有连接数限制。
接下来,如果 Tier 1 豁免列表里没有匹配的规则,则会交给有状态的 Tier 2 防火墙进行 DPI 处理,而这个防火墙很可能有对来自单一 IP 的并行处理限制,一次只能处理某一个数值范围内的连接,超过此数量的连接,如上面的 SSH 例子,一开始握手看似是成功,实际上回程过程中数据会直接被丢弃,而 SSH 默认的配置是在 45 秒钟后如果没有收到客户端的回复,连接断开。
这种设计看上去倒没啥太大的问题,大吞吐用无状态的防火墙,精准打靶用有状态的防火墙。
伊朗那边的墙现在几乎就是白名单,很少一部分 IP 能够相对稳定的翻墙,按伊朗人的说法,只有宽带豁免程度最高,包括但不限于家宽和专线,且所有 IDC 和蜂窝网络,均被无状态防火墙高度丢包,甚至访问伊朗国内的网站也无法幸免。
此外,还在这次的测试中尝试了在被拉黑过程中从海外反向连接国内,发现仍然工作,这意味着有状态的 GFW 是基于五元组的连接跟踪,并且不共享一套策略的同时限制也更加宽松。