插图来源:Storyset
先说 SNI 是干嘛的#
你访问一个 HTTPS 网站时,浏览器要先和服务器"握手"。握手的第一步,浏览器会明文告诉服务器:“我想访问的是 www.example.com”。这个明文报上名的字段,就叫 SNI(服务器名称指示)。
为什么要明文?因为一台服务器上可能托管着上百个网站,服务器得先知道你要找谁,才能拿出对应的证书。SNI 就是握手阶段的"报名字"环节。
SNI 阻断是怎么回事#
既然 SNI 是明文的,那中间设备就能看到你在访问哪个网站。SNI 阻断就是:在握手阶段看到 SNI 是某个目标,直接把连接掐断。你的浏览器会看到"连接被重置"之类的错误,页面一片白。
被 SNI 阻断时的典型症状#
- 特定网站打不开,换浏览器、清缓存都没用。
- 同一个网站,HTTP 能开(如果还支持的话),HTTPS 不行。
- 开代理后能打开,关掉就不行——因为代理把 SNI 藏在了隧道里。
- 有意思的是:同一 IP 上的其他网站能正常打开,只有目标网站不行。这是 SNI 阻断区别于 IP 封锁的关键特征。
它和 DNS 污染的区别#
这两个经常被搞混,一张表分清:
| SNI 阻断 | DNS 污染 | |
|---|---|---|
| 发生阶段 | TLS 握手时 | 域名解析时 |
| 现象 | 连接被重置、打不开 | 解析到错误的 IP,跳到奇怪页面 |
| 针对目标 | 按域名精确打击 | 按域名,但可能误伤 |
| 绕过思路 | 把流量包进隧道(代理/VPN) | 换可信 DNS 或同样走代理 |
简单记:DNS 污染是"指错路",SNI 阻断是"认出你然后拦下"。
普通人需要做什么#
- 大多数情况下什么都不用做:你用的代理本身就是 SNI 阻断的解法,流量进隧道后 SNI 对外不可见。
- 如果你发现"开了代理某个站还是打不开",那可能不是 SNI 的问题,按IP 被墙排查走。
- 对技术细节感兴趣:Trojan 协议的设计就是围绕"让 SNI 和握手看起来正常"展开的;Cloudflare 相关的握手异常见这篇。
一句话总结#
SNI 是握手时明文报的名字,SNI 阻断就是按名字拦人。代理把名字藏进隧道,问题自然消失。理解这个概念,很多"为什么这个站打不开"的疑惑就通了。