目录
什么是 SNI?
SNI(Server Name Indication)是一种 TLS 扩展,它允许客户端在建立 TLS 连接时指定目标服务器的主机名。这使得单个 IP 地址可以托管多个 HTTPS 网站,每个网站使用不同的证书。
在没有 SNI 的情况下,服务器只能根据客户端连接的 IP 地址来确定提供哪个证书。但有了 SNI,客户端在建立 TLS 连接时会将目标服务器的主机名发送给服务器,服务器据此选择正确的证书进行回应。
SNI 的工作原理
SNI 的工作原理如下:
- 客户端在建立 TLS 连接时,在 Client Hello 消息中包含目标服务器的主机名。
- 服务器收到 Client Hello 消息后,根据主机名选择合适的证书进行回应。
- 之后的 TLS 握手过程正常进行,客户端验证服务器证书并建立安全连接。
通过这种方式,单个 IP 地址就可以提供多个 HTTPS 网站的服务,而不需要为每个网站分配独立的 IP 地址。这大大节省了 IPv4 地址资源,也简化了网站的维护和管理。
在 V2Ray 中配置 SNI
V2Ray 中可以通过以下方式配置 SNI:
服务端配置
在 V2Ray 服务端配置文件的 inbound
部分,添加如下配置:
{ “port”: 443, “protocol”: “vmess”, “settings”: { “clients”: [ { “id”: “your-uuid”, “alterId”: 64 } ] }, “streamSettings”: { “network”: “tcp”, “security”: “tls”, “tlsSettings”: { “serverName”: “your-domain.com”, “alpn”: [ “http/1.1” ] } }}
其中:
"serverName"
指定了 TLS 证书的域名,也就是 SNI 的值。"alpn"
配置了 ALPN 协议,用于在 TLS 握手时协商应用层协议。
客户端配置
在 V2Ray 客户端配置文件的 outbound
部分,添加如下配置:
{ “protocol”: “vmess”, “settings”: { “vnext”: [ { “address”: “your-domain.com”, “port”: 443, “users”: [ { “id”: “your-uuid”, “alterId”: 64 } ] } ] }, “streamSettings”: { “network”: “tcp”, “security”: “tls”, “tlsSettings”: { “serverName”: “your-domain.com” } }}
其中:
"address"
指定了服务器地址,通常是一个域名。"serverName"
指定了 TLS 证书的域名,也就是 SNI 的值,需要与服务端配置一致。
通过以上配置,V2Ray 就可以在 TLS 握手时发送 SNI 信息,实现流量的域名伪装。
SNI 常见问题解答
SNI 可以隐藏我的真实目标域名吗?
SNI 可以隐藏您的真实目标域名,但仅限于 TLS 握手阶段。在 TLS 建立连接之后,服务端会知道您的真实目标域名。因此,如果您希望完全隐藏目标域名,建议结合其他流量混淆技术,如 Websocket、HTTP/2 等。
使用 SNI 会增加延迟吗?
使用 SNI 确实会增加一定的延迟,因为客户端需要在 TLS 握手时发送 SNI 信息。不过,这种延迟通常很小,对大多数用户体验影响不大。如果您对延迟很敏感,可以考虑使用其他流量混淆技术,如 Websocket 或 HTTP/2。
SNI 有哪些局限性?
SNI 的主要局限性包括:
- 仅能隐藏 TLS 握手阶段的目标域名,之后的流量依然可能被检测。
- 部分老旧设备或浏览器可能不支持 SNI,无法使用。
- 如果服务端证书与 SNI 值不匹配,可能会引起证书验证失败。
因此,如果您有更高的隐藏需求,建议结合其他流量混淆技术一起使用,以获得更好的效果。