network@sni介绍
SNI,全称是 Server Name Indication,是 TLS(传输层安全协议)扩展的一部分,用于在 TLS 握手阶段指明客户端要访问的主机名(域名)。
📌 SNI 是做什么的?
当你访问一个启用了 HTTPS 的网站时(例如 https://example.com
),客户端和服务器之间会进行 TLS 握手。问题是,多个网站常常共用同一个 IP(例如在云服务中),服务器需要知道你想访问哪个具体的网站来返回正确的证书。这就是 SNI 的作用。
简而言之:
- 客户端在 TLS 握手时说:“我要访问
example.com
”; - 服务器基于这个 SNI,返回
example.com
的证书; - 握手继续,建立安全连接。
✅ SNI 的实际应用
- 虚拟主机支持 HTTPS:多个 HTTPS 域名共享一个 IP;
- CDN 与多租户支持:Cloudflare、阿里云等依赖 SNI 路由请求;
- GFW(防火墙)审查依据:SNI 是明文的,可被检测并用于封锁敏感域名。
🔓 安全注意
- SNI 是明文的(直到 TLS 1.2),这意味着第三方(如 ISP、防火墙)可以看到你访问的是哪个网站。
- 为此,TLS 1.3 引入了 ESNI(Encrypted SNI),后发展为 ECH(Encrypted Client Hello),目的是加密 SNI 信息,防止被识别。
tls1.3 sni支持加密
🧠 在 sing-box/ShadowTLS 中的用途
在 sing-box
中,如果使用 shadowtls
,SNI 是伪装成目标域名的一部分,比如:
1 | "handshake": { |
这会使防火墙看到一个正常的 TLS 握手,SNI 指向的是 Cloudflare 的网站,从而降低被识别为代理的风险。