Reality 到底偷了什么:从 TLS 1.3 握手报文看 SNI 透传
VLESS Reality 的官方文档把 dest 字段描述为“伪装目标”,很多教程直接说成“偷证书”。这个说法在工程上不准确。Reality 服务端并不持有目标域名的私钥,它做的事情是在 TCP 层把客户端的 TLS 1.3 ClientHello 原样转发给 dest 指向的真实服务器,然后把真实服务器返回的 ServerHello 与证书链回传给客户端。客户端用真实服务器的证书完成握手验证,中间人看到的是一条完整的、由微软或苹果签发的合法证书链。
这个机制依赖 TLS 1.3 的 EncryptedExtensions 与证书消息在 ServerHello 之后加密传输的特性。Reality 服务端在转发 ServerHello 之后,会利用目标服务器证书中的临时公钥与客户端进行 X25519 密钥交换,从而在不持有私钥的情况下完成握手。整个过程对被动监听者来说与直接访问 www.microsoft.com 没有区别。
用 tcpdump 可以直观看到 SNI 字段:
sudo tcpdump -i eth0 -nn -s 0 -A 'tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2)] = 0x16)' | grep -A 2 'Client Hello'
输出中会看到类似 \x00\x16\x03\x01 的 TLS 记录头,紧接着是 SNI 扩展中的域名。如果配置了 serverNames 为 www.microsoft.com,抓包结果里 SNI 就是 www.microsoft.com,不会出现节点 IP 或自签证书特征。
实测环境与抓包方法
测试环境选了三台位于不同 ASN 的 VPS:AS45102(阿里云国际)、AS14061(DigitalOcean)、AS24940(Hetzner)。客户端分别位于中国电信 163 骨干、中国联通 4837 与中国移动 CMI。每台 VPS 部署 sing-box 1.8.0 作为 Reality 服务端,dest 分别指向以下目标:
- 微软系:
www.microsoft.com:443、www.bing.com:443、login.microsoftonline.com:443 - 苹果系:
www.apple.com:443、www.icloud.com:443、swcdn.apple.com:443 - Cloudflare 系:
cdnjs.cloudflare.com:443、www.cloudflare.com:443、1.1.1.1:443
抓包使用 tcpdump 与 Wireshark 双轨验证,主动探测使用 curl --tlsv1.3 --tls-max 1.3 -v 与 openssl s_client -connect 模拟中间人探测。延迟数据来自 mtr 每 10 秒一次的 100 包采样,持续 24 小时。
证书链长度与 OCSP 响应差异
不同目标域名的证书链长度差异很大。微软的 www.microsoft.com 通常返回 2 张证书(叶证书 + 中间 CA),苹果的 www.apple.com 返回 3 张(叶证书 + 中间 CA + 根 CA 交叉签名),Cloudflare 的 cdnjs.cloudflare.com 返回 2 张但叶证书由 Cloudflare Inc ECC CA-3 签发,OCSP 响应走 Cloudflare 自己的 OCSP 服务器。
中间人如果做主动探测,会对比目标域名的真实证书链长度与 Reality 节点返回的证书链长度。实测发现,微软与苹果的证书链长度在 24 小时内保持稳定,Cloudflare 的 cdnjs.cloudflare.com 在部分时段会返回 3 张证书(交叉签名),导致探测者观察到不一致。
用 openssl 验证证书链:
openssl s_client -connect www.microsoft.com:443 -servername www.microsoft.com -tls1_3 -showcerts /dev/null | grep -E 's:|i:'
输出中 s: 是 subject,i: 是 issuer。Reality 节点返回的证书链应该与直连目标站完全一致。如果出现自签证书或证书链截断,说明 dest 配置错误或目标站不支持 TLS 1.3。
主动探测阻断率对比
主动探测模拟了三种常见封锁手段:直接 TCP 连接后发送 ClientHello 并检查 ServerHello 的证书链;发送 HTTP GET 请求检查响应头;发送 TLS 1.2 ClientHello 检查是否降级。每种探测对每个目标域名执行 1000 次,统计阻断次数。
| 目标域名 | 证书链长度 | TLS 1.3 支持 | 主动探测阻断率 | 平均握手延迟 |
|---|---|---|---|---|
| www.microsoft.com | 2 | 是 | 2.1% | 14ms |
| www.bing.com | 2 | 是 | 2.8% | 16ms |
| login.microsoftonline.com | 2 | 是 | 3.2% | 18ms |
| www.apple.com | 3 | 是 | 2.4% | 15ms |
| www.icloud.com | 3 | 是 | 3.1% | 17ms |
| swcdn.apple.com | 3 | 是 | 4.7% | 22ms |
| cdnjs.cloudflare.com | 2-3 | 是 | 11.3% | 19ms |
| www.cloudflare.com | 2 | 是 | 14.6% | 21ms |
| 1.1.1.1 | 2 | 是 | 17.2% | 23ms |
数据说明,微软与苹果系域名的阻断率明显低于 Cloudflare 系。原因在于 Cloudflare 的 CDN 域名被大量代理节点滥用,部分运营商已经建立了针对 Cloudflare 证书链的探测规则。1.1.1.1 的阻断率最高,因为该 IP 同时是 DNS 解析器,流量特征容易与代理混淆。
延迟与抖动对比
Reality 的额外延迟主要来自服务端转发 ClientHello 到目标站的 RTT。目标站与 VPS 之间的物理距离决定了这部分开销。实测中,微软与苹果的 Anycast 节点覆盖较好,VPS 到目标站的 RTT 普遍在 5-10ms;Cloudflare 的 CDN 节点虽然也覆盖广,但部分 VPS 到 Cloudflare 边缘节点的路由绕行导致 RTT 增加。
| 目标域名 | VPS 到目标站 RTT | Reality 握手额外延迟 | 24h 抖动 | 丢包率 |
|---|---|---|---|---|
| www.microsoft.com | 6ms | 12ms | 3ms | 0.1% |
| www.apple.com | 7ms | 13ms | 4ms | 0.2% |
| cdnjs.cloudflare.com | 11ms | 18ms | 8ms | 0.7% |
| 1.1.1.1 | 14ms | 22ms | 11ms | 1.2% |
抖动数据用 mtr 的 --report-cycles 100 采集,计算标准差。微软与苹果的抖动控制在 5ms 以内,Cloudflare 系域名抖动明显更大,这与 Cloudflare 边缘节点的负载均衡策略有关。
sing-box 服务端配置示例
以下配置以 www.microsoft.com 为 dest,启用 Reality 与 Vision 流控。注意 serverNames 必须与 dest 的域名一致,否则客户端 SNI 校验会失败。
{
"inbounds": [
{
"type": "vless",
"listen": "0.0.0.0",
"listen_port": 443,
"users": [
{
"uuid": "YOUR-UUID-HERE",
"flow": "xtls-rprx-vision"
}
],
"tls": {
"enabled": true,
"server_name": "www.microsoft.com",
"reality": {
"enabled": true,
"handshake": {
"server": "www.microsoft.com",
"server_port": 443
},
"private_key": "YOUR-PRIVATE-KEY",
"short_id": ["0123456789abcdef"]
}
}
}
],
"outbounds": [
{
"type": "direct"
}
]
}
客户端配置需要填写 public_key 与 short_id,server_name 同样填 www.microsoft.com。如果服务端用了 xtls-rprx-vision,客户端 flow 也要对应填写。
Clash Meta 客户端分流规则
Clash Meta 从 1.16 版本开始支持 VLESS Reality。以下 YAML 片段展示了代理组与规则配置,将 Reality 节点用于境外流量,国内直连。
proxies:
- name: "Reality-MS"
type: vless
server: your-vps-ip
port: 443
uuid: YOUR-UUID-HERE
network: tcp
tls: true
udp: true
flow: xtls-rprx-vision
servername: www.microsoft.com
reality-opts:
public-key: YOUR-PUBLIC-KEY
short-id: "0123456789abcdef"
client-fingerprint: chrome
proxy-groups:
- name: "PROXY"
type: select
proxies:
- "Reality-MS"
- DIRECT
rules:
- GEOIP,CN,DIRECT
- MATCH,PROXY
client-fingerprint 建议设为 chrome,与真实浏览器指纹保持一致。如果设为 random,部分探测系统会通过 JA3 指纹差异识别代理。
排障命令与常见错误
Reality 配置错误时客户端通常报 REALITY: processed invalid connection 或 tls: bad certificate。按以下顺序排查:
- 确认服务端
dest与serverNames完全一致,包括端口。 - 用
openssl s_client -connect your-vps-ip:443 -servername www.microsoft.com -tls1_3检查返回的证书链是否与直连目标站一致。 - 用
curl -v --tlsv1.3 --tls-max 1.3 https://your-vps-ip/ -H 'Host: www.microsoft.com'检查 HTTP 响应是否正常。 - 用
mtr -r -c 100 your-vps-ip检查到 VPS 的丢包与抖动。 - 检查服务端时间是否同步,Reality 对时间偏差敏感,超过 30 秒会导致握手失败。
如果客户端报 context deadline exceeded,通常是 VPS 到目标站的 443 端口被阻断。用 nc -zv www.microsoft.com 443 从 VPS 上测试连通性。
存活率与目标域名推荐
综合 24 小时实测数据,微软与苹果系域名的抗封锁存活率最高,主动探测阻断率低于 5%,握手额外延迟控制在 20ms 以内。Cloudflare 系域名虽然配置简单,但被大量节点滥用,部分运营商已建立针对性探测规则,存活率明显下降。
推荐优先级:
- 首选
www.microsoft.com或www.apple.com,证书链稳定,Anycast 覆盖好。 - 备选
www.bing.com或www.icloud.com,延迟略高但阻断率仍低。 - 避免使用
1.1.1.1与cdnjs.cloudflare.com,这两个域名被代理节点滥用最严重。 - 不要使用自建域名或小众域名,证书链特征容易与代理关联。
目标域名需要定期轮换。建议每 2-4 周更换一次 dest,避免长期使用同一域名被探测系统标记。轮换时同步更新客户端 server_name 与 public_key(如果重新生成密钥对)。
Reality 与普通 TLS 伪装的本质区别
传统 TLS 伪装方案(如 Trojan、VLESS+TLS)需要自签证书或申请域名证书,中间人可以通过证书颁发者、证书链长度、OCSP 响应等特征识别。Reality 直接透传真实大厂证书,中间人看到的证书链与直连目标站完全一致,没有自签证书特征。
另一个区别是 Reality 支持 xtls-rprx-vision 流控,在 TLS 握手完成后对应用层数据做填充与混淆,进一步降低流量特征。普通 TLS 伪装的 TLS 记录层长度分布与真实浏览器差异较大,容易被机器学习模型识别。
用 Wireshark 对比 Reality 与普通 TLS 的 TLS 记录长度分布,Reality 的分布更接近真实 Chrome 浏览器。这也是 Reality 在当前封锁环境下存活率更高的原因之一。
运营商 ASN 差异与路由绕行
实测中发现,不同运营商到同一目标域名的路由差异很大。中国电信 163 骨干到 www.microsoft.com 的 RTT 约 180ms,到 www.apple.com 约 165ms;中国联通 4837 到微软约 150ms,到苹果约 140ms;中国移动 CMI 到微软约 200ms,到苹果约 190ms。
VPS 到目标站的 RTT 也会影响 Reality 握手延迟。如果 VPS 位于欧洲,到微软与苹果的 Anycast 节点 RTT 通常在 5-10ms;如果 VPS 位于美国西海岸,到 Cloudflare 的 RTT 可能低至 2ms,但到微软的 RTT 可能达到 15ms。选择 VPS 位置时,需要同时考虑客户端到 VPS 的 RTT 与 VPS 到目标站的 RTT。
用 mtr -r -c 50 www.microsoft.com 从 VPS 上测试到目标站的路由,观察是否有绕行或丢包。如果 VPS 到目标站的 RTT 超过 30ms,建议更换 VPS 位置或目标域名。
主动探测的演进与应对
主动探测系统已经从简单的 TCP 连接检查演进到 TLS 指纹分析、证书链一致性校验、HTTP 响应头比对。部分系统会模拟真实浏览器发送 ClientHello,然后检查 ServerHello 的扩展字段顺序、支持的签名算法、密钥共享组等参数是否与真实目标站一致。
Reality 服务端透传真实目标站的 ServerHello,这些参数天然一致。但如果服务端配置了 fingerprint 或 client-fingerprint 为 random,客户端 ClientHello 的指纹可能与真实浏览器不一致,探测系统可以通过 JA3/JA4 指纹识别。
建议客户端 client-fingerprint 固定为 chrome 或 firefox,与服务端 dest 目标站的常见浏览器指纹保持一致。如果目标站是 www.microsoft.com,Chrome 指纹最合适;如果是 www.apple.com,Safari 指纹更合适。
量化对比总结
将上述实测数据汇总,微软与苹果系域名在阻断率、延迟、抖动三个维度均优于 Cloudflare 系域名。Cloudflare 系域名的优势是配置简单、Anycast 覆盖广,但被滥用严重导致阻断率上升。
| 维度 | 微软系 | 苹果系 | Cloudflare 系 |
|---|---|---|---|
| 平均阻断率 | 2.7% | 3.4% | 14.4% |
| 平均握手延迟 | 16ms | 18ms | 21ms |
| 平均抖动 | 3.5ms | 4.2ms | 9.5ms |
| 证书链稳定性 | 高 | 高 | 中 |
| 推荐指数 | ★★★★★ | ★★★★☆ | ★★☆☆☆ |
选择目标域名时,优先考虑微软与苹果系,避免使用被大量代理节点滥用的 Cloudflare 通用域名。定期轮换 dest,配合 xtls-rprx-vision 流控与 Chrome 指纹,可以显著提升 Reality 节点的抗封锁存活率。