SNI(服务器名称指示)
TLS 握手里的一段明文字段,告诉服务器你要访问哪个站点,被审查者用来过滤流量。
SNI(RFC 6066)是一个 TLS 扩展,让一台服务器能托管多个 HTTPS 站点。客户端把目标主机名放进 ClientHello,告诉服务器该出示哪个证书。这个字段是明文发送的,因为加密密钥还没协商完——服务器需要先知道用哪个证书才能开始加密。这就产生了一个小但关键的泄漏:你和服务器之间路径上的任何人都能看到你连接的域名,即使握手后每个字节都是加密的。
GFW 把 SNI 作为主要的过滤手段。当你连接服务器时,GFW 解析 ClientHello、读出 SNI、把域名和黑名单比对。如果域名被封(某个特定 VPN 厂商、某个特定新闻站),GFW 就重置连接。这就是为什么有些站点用 IP 能通、用域名却不行;以及为什么从被审查的网络连接被封 SNI 时,无论用哪个端口或协议都失败。
长期修法是 ECH——一旦 SNI 加密,GFW 的过滤器就什么也读不到。短期变通:域前置(外层 ClientHello 放没被封的 SNI、内层 HTTP Host header 放真实的,Cloudflare 在 2022 年废弃了这种方式)、使用允许任意 Host header 的 CDN、或把一切包进 TLS 隧道发到没被封的域名。IPCombo 没法绕过 SNI 过滤,但能显示你的 SNI 是到达目标了还是中途被中间人重置。