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
2
3
"handshake": {
"server": "www.cloudflare.com"
}

这会使防火墙看到一个正常的 TLS 握手,SNI 指向的是 Cloudflare 的网站,从而降低被识别为代理的风险