墙,墙和更高的墙
发表于更新于阅读时长 4 分钟Dread it, run from it, wall arrives all the same
我相信本文的读者早就已经清楚地知晓 GFW 的性质和作用,本文将对其机制和原理进行简要的分析,GFW 用于干扰的机制有三种,我将按照它们的严重性从低到高开始分析,本文用到的主要工具为 Wireshark.
1. DNS 污染
这是最容易绕过,也常常是最先被应用的干扰,在 17 年年末开始的新一轮封禁中,Reddit 和 Pixiv 就是先被施加了这样的干扰.
标准指出 DNS 可以使用 UDP 或是 TCP 来传输,因为 DNS 数据量通常非常小,因此出于降低延迟的考虑,各种操作系统中的 DNS 都默认使用 UDP,UDP 不基于连接的特性极大便利了中间人给数据动手脚,因此在查询 Reddit 的 IP 地址时
drill www.reddit.com @8.8.8.8;; ANSWER SECTION:www.reddit.com. 65 IN A 31.13.69.129
可以看到返回了 Facebook 的地址,因此显然不能建立到 Reddit 的连接。GFW 的污染策略经历过一次更新,在过去返回一些奇怪的小国家的地址,现在则一般返回 Facebook 或是 SoftLayer 的地址.
对 DNS 请求进行抓包可以看到 GFW 是如何实现这一特性的.
GFW 通过运行商部署(通常在省级出口上)了 DNS 污染系统,在检查到域名在屏蔽列表中且该次请求访问的是境外服务器的 53 端口时,立即返回一个假的 DNS 查询结果,这很容易做到,因为 DNS 唯一的标识是以明文写在请求中的 Transcation ID,因为这个结果显然会比真正的结果返回的更快,因此系统就会把这个结果当作本次 DNS 请求的结果,这带来了另一个奇妙的现象: 在境内对任意境外服务器的 53 端口查询被屏蔽的网站,都会返回查询结果,即使服务器不开放 53 端口.
使用 TCP 传输的 DNS 虽然没有 UDP 的一些缺点,但同样会被 GFW 干扰,此时会直接断开连接而非返回假数据包,其原理将在下一节详细讲述.
可以看出这个机制非常简单粗暴,因此绕过干扰的方法也很容易,大致可以归为以下几个思路
- 使用境内的无污染 DNS
- 使用境外的非标准端口 DNS
- 使用特殊的 DNS 查询机制,可以识别并丢弃 GFW 制造的假数据
2. TCP RST
TCP 标准中规定了 Control Bits 中的第四位为 RST,如果置 1 则立即中止当前的连接,GFW 就是恶意使用该机制来对 TCP 连接进行干扰.
伪造 TCP 数据包则较为复杂,众所周知,识别一个 TCP 连接只需要四元组,其中源 IP 和 目的 IP 都被存放在下层的 IP 包中,而源端口和目的端口则被存放在 TCP 头中,此外,还需要计算出 TCP 包的序列号并记录下源和目的的 MAC 地址,这样就可以向请求者和服务器双方发出伪造的 RST 包(在过去,GFW 只会向请求者发出 RST,在本地忽略掉这些包是很轻松的),造成 TCP 连接中断。
同样以对 8.8.8.8 发起的 DNS 请求为例,只不过这次加上了强制 TCP 的选项。
我们可以清晰地看到这次请求被中断的过程,首先和服务器进行三次握手,建立 TCP 连接,之后向服务器发出数据,此处为 DNS 请求,GFW 检测到了本次请求需要干扰,向双方发送了伪造的 RST 数据包,在收到 RST 之后,连接立刻中断。
RST 攻击是 GFW 最常见也是运用最广泛的屏蔽手段之一,因此一一列举它的所有应用场合是不可能的,此处将会举出影响最大的几种。
- 使用 TCP 的 DNS
- 包含敏感词的 HTTP 请求。这在互联网逐渐 HTTPS 化之后逐渐失去了意义
- SNI和 HTTPS 证书中包含被屏蔽网址的 HTTPS 请求
其中第三种场景在当下造成的影响最为严重。针对 GFW 的这一策略,很多方法被开发了出来.
- 最基础的,各种代理均可绕过
- 前文提到,RST 攻击的实现是有状态的且较为复杂,因此总有办法能找到其中的漏洞并进行反干扰
- 在使用了 HTTPS 的网站上,使用 ESNI 来避免 SNI 触发 GFW。也可以仅代理 HTTPS 握手,之后的数据直连
- 对于使用了 HTTPS 以及 CDN 的网站,可以通过指定 HOST 的方式隐藏 SNI
3. IP 黑洞
这是最严重的封锁方法。在 GFW 尚未完善的时候,这是唯一的屏蔽手段,因此很多早期就被屏蔽的网站诸如 Facebook 等等均被使用该手段屏蔽。被 GFW 察觉到的 VPS,因为除了 IP 没有其他特征,也会被使用该手段封禁。
其实现方式是使用 BGP 协议,把无效的路由黑洞加入到主干路由器的路由表中,然后让它们把到指定 IP 的包给丢弃掉。这个手段的特征非常明显: 无法 ping 通,数据就更不用说了。
对抗 IP 黑洞没有什么好办法,只有使用代理。对于 Google 或是 Facebook 这样拥有巨量 IP 的公司,常常能找到尚未被屏蔽的地址,但这样只能短暂地解决问题,更不用说该手段常常结合其他手段使用.