关于本站被墙的一些分析

标签:无

自从本站被墙之后,我也好久没更新博客了。
今天稍微看了一下,似乎是域名被封了,现象有:
  1. nslookup 随机解析到其他无法访问的 IP。
  2. 改本地 /etc/hosts 后,curl 报 35 错误(SSL connect error. The SSL handshaking failed.),openssl 可以正常连接 443 端口,但带了 -servername 参数后失败。
  3. 改本地 /etc/hosts 后,用 HTTP 可以访问。
  4. 换域名可以访问。
  5. 换端口的 HTTPS 不可以访问。

那这个事就清楚了,第一点说明是域名被劫持,第二、三点说明是 TLS 握手阶段被干扰。
了解 TLS 原理的都知道,客户端在发送 ClientHello 时,消息是未加密的(服务端还不知道你的密钥,当然没法加密)。又因为一台服务器是需要同时为多个域名提供服务的,这些域名又可能使用不同的证书,因此客户端需要访问的域名也需要在发送 ClientHello 时,以明文的方式发送给服务端(即 SNI)。所以墙的做法很简单,在 ClientHello 中匹配要墙的域名,把连接断了即可。
然后我抓包试了下,果然是在 ClientHello 后连发了 4 个 RST 包。
那么 DNS 劫持又是咋实现的呢?抓包发现是抢在 DNS 服务器返回响应前,先发了 2 个错误的响应,于是正确的响应就被忽略了。

那有什么技术手段可以对付这种流氓行径呢?
可以想到的是把 SNI 加密。那连接都没建立,密钥放哪呢?答案是 DNS 记录。可是 DNS 也被劫持了呀?那就用加密的 DNSSEC、DNS over TLS (DoT) 和 DNS over HTTPS (DoH)。详细的说明可以看 Encrypt it or lose it: how encrypted SNI works
遗憾的是这些技术都没有普及,我一个人能访问也没啥用,所以现实的答案是啥也做不了。

2022年10月07日更新:
发现 2 个绕过 GFW 的方法:
  1. 把域名的 NS 服务器放在国内,抢在 GFW 之前返回正确的 IP,这样 HTTP 就能访问了。
  2. GFW 好像并未拦截 UDP,使用 HTTP/3 时,连接成功后就可以不翻墙访问了(但是连接时会先采用 TCP)。

1条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?