技术

破案了:为什么开启代理后 TLS 总是报错?

最近用代理上网的时候,经常遇到 TLS 证书异常 或者 HSTS 错误。本来以为是节点抽风或者线路不稳定,今天实在忍不了了,打算深挖一下。

发现怪事

报错的时候我点开证书详情看了一眼,结果一脸懵逼:为什么我访问的网站,返回的证书是 Facebook 的?

我这明明没在刷 FB 啊。

溯源排查

带着这个关键词去 V2EX 考古(搜到了 2018 年的老帖),发现这其实是一个典型的 DNS 中间人攻击 导致的坑。

原理大概是这样:

  1. 我的本地 DNS 之前图省事设成了网关地址(类似 192.168.0.1)。
  2. 在开启代理或某些网络环境下,DNS 解析请求被中间人拦截/污染了。
  3. 由于 DNS 返回了错误的 IP(可能指向了 FB 的服务器或者是被劫持到了某个特定的 IP),浏览器去握手时,发现域名和证书完全对不上。
  4. 加上现在的网站基本都开了 HSTS,浏览器校验非常严格,直接锁死不让访问。

解决办法

其实就是把 DNS 链路理顺。

  • 路由器端: 弃用默认网关 DNS,手动改成了靠谱的公共 DNS(如 1.1.1.18.8.8.8)。
  • 代理客户端: 检查了 DNS 配置,确保开启了远程解析,防止本地污染。

改完之后重启代理,Nice,报错全部消失,丝滑上网。


总结: 以后遇到 TLS 报错,先别急着换节点,看看证书到底是谁发的,说不定又是 DNS 在背地里搞鬼。

— END —