关于本站被墙的一些分析
2022 9 11 01:36 PM 503次查看
分类:无 标签:无
今天稍微看了一下,似乎是域名被封了,现象有:
- nslookup 随机解析到其他无法访问的 IP。
- 改本地
/etc/hosts
后,curl 报 35 错误(SSL connect error. The SSL handshaking failed.),openssl 可以正常连接 443 端口,但带了-servername
参数后失败。 - 改本地
/etc/hosts
后,用 HTTP 可以访问。 - 换域名可以访问。
- 换端口的 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 的方法:
- 把域名的 NS 服务器放在国内,抢在 GFW 之前返回正确的 IP,这样 HTTP 就能访问了。
- GFW 好像并未拦截 UDP,使用 HTTP/3 时,连接成功后就可以不翻墙访问了(但是连接时会先采用 TCP)。
向下滚动可载入更多评论,或者点这里禁止自动加载。