本页目录(11)
一句话结论:VLESS + Reality 是「轻量代理协议 + 借用真实网站 TLS 握手」的组合:探测者连过去看到的是一个真实大网站,只有持有密钥的客户端才能进入代理,因此很难被主动探测识别,是目前公认抗封锁能力最强的方案之一。
VLESS + Reality 是什么?简单说,它是目前机场在敏感时期最常依靠的一类节点。要理解它为什么抗封锁强,需要先拆开看:VLESS 负责「代理」,Reality 负责「伪装」。两者组合后,再加上 Vision 流控,构成了现在常见的 VLESS + Vision + Reality 节点。
VLESS:只做代理,不做加密
VLESS 是 V2Ray / Xray 体系里的轻量代理协议。它的设计很克制:只负责告诉服务器「我是谁、要去哪」,用 UUID 做身份认证,自身不提供加密,加密完全交给外层的 TLS 或 Reality。
这样做的好处是没有重复加密,开销小、速度快;缺点是 VLESS 不能单独裸奔使用,必须套一层安全传输。早期常见的是 VLESS + TLS(需要自己的域名和证书),而 Reality 出现后,绝大多数新节点改用了 VLESS + Reality。
Reality:借用别人的网站做伪装
传统 TLS 伪装的思路是「我自己建一个网站」:申请域名、签发证书,让代理流量看起来像在访问这个网站。问题是,这个域名和网站往往很小众,访问量和行为模式容易显得可疑;证书、域名也会留下可关联的特征。
Reality 换了个思路:服务器不再自己扮演网站,而是借用一个真实存在的大网站(服务端配置里称为目标网站)。
握手时发生了什么
- 客户端发起 TLS 握手:ClientHello 里的 SNI 写的是目标网站的域名,TLS 指纹则通过 uTLS 模拟成常见浏览器(如 Chrome)。
- 暗中携带认证信息:客户端利用服务器公钥,通过 X25519 密钥交换得到共享密钥,把认证信息藏在握手字段中。外人看来这只是一个普通浏览器的握手。
- 服务器判断身份:能验证通过的,服务器用临时密钥完成握手,进入代理;验证不通过的,服务器把连接原样转发给真实的目标网站。
- 探测者看到真网站:主动探测时,对方拿到的是目标网站本身的真实证书和内容,无法证明这台服务器在跑代理。
这里的关键在第 3、4 步:主动探测是封锁系统识别代理的重要手段,而 Reality 让探测结果和访问真实网站完全一致。再加上不需要自己的域名和证书,服务器本身几乎没有额外可供关联的身份特征。
Vision 流控:解决 TLS in TLS
代理里跑的大多是 HTTPS 流量,也就是「外层 TLS 里面再套一层 TLS」。内层 TLS 握手的包长度、时序有比较固定的模式,即使外层加密了,也可能被统计分析识别出来,这就是常说的 TLS in TLS 特征。
Xray 的 xtls-rprx-vision 流控针对这个问题,对内层握手阶段的数据做填充和处理,减少可识别特征。所以机场节点常写作 VLESS + Vision + Reality。Reality 项目文档也提示,不建议把 Reality 和不处理 TLS in TLS 的其他协议搭配使用。
为什么抗封锁强:三点总结
主动探测无效
未认证的连接被转发到真实网站,探测者拿到的是真证书、真页面。
无域名证书特征
服务器不需要自己的域名和证书,少了一大类可被关联、封锁的标识。
浏览器级指纹
握手指纹模拟主流浏览器,和普通 HTTPS 访问难以区分。
配合 Vision
削弱 TLS in TLS 统计特征,降低被流量分析识别的概率。
和传统 TLS 伪装、Trojan 有什么不同
| 对比项 | Trojan / VLESS + TLS | VLESS + Reality |
|---|---|---|
| 是否需要自己的域名 | 需要 | 不需要 |
| 证书来源 | 为自己的域名签发 | 借用目标网站的真实握手 |
| 被主动探测时 | 返回自建的伪装网站 | 转发到真实目标网站 |
| 能否套 CDN | 部分方案可以(如 WebSocket) | 不可以 |
| TLS in TLS 处理 | 默认不处理 | 常配合 Vision 流控 |
可以看出,Reality 主要强化的是「被探测时露不露馅」和「有没有可关联的身份标识」这两点。Trojan 的伪装网站再逼真也是自建的,而 Reality 背后是真正的大网站,这一点从根本上抬高了识别门槛。
看懂 Reality 节点的参数
机场下发的订阅已经填好参数,一般无需手动修改。但了解每个字段的含义,有助于排查「导入后连不上」的问题。以 mihomo 配置为例:
- name: "VLESS-Reality-JP"
type: vless
server: 203.0.113.10
port: 443
uuid: 你的UUID
network: tcp
tls: true
udp: true
flow: xtls-rprx-vision
servername: www.example.com
client-fingerprint: chrome
reality-opts:
public-key: 服务器公钥
short-id: 短ID
uuid:VLESS 的用户身份,相当于密码。flow:流控类型,常见为xtls-rprx-vision,必须与服务端一致。servername:握手时声明的 SNI,也就是被借用的目标网站域名,必须在服务端允许的列表里。public-key与short-id:Reality 认证所需的服务器公钥和短 ID,填错任何一个,连接都会被当作普通访问转发给目标网站,表现为超时或无法上网。client-fingerprint:模拟的浏览器 TLS 指纹,常用chrome。
如果担心订阅内容被客户端解析错误,可以用 订阅解析工具 看看节点参数是否完整。
VLESS Reality 的局限
- 不能套 CDN:Reality 依赖客户端与服务器直接握手,IP 被封后只能换 IP,不能像 WebSocket + CDN 那样借 CDN 续命。
- 目标网站选择有讲究:Reality 文档建议目标网站在境外、支持 TLS 1.3 和 HTTP/2,且最好与服务器 IP 地理位置接近。SNI 写着某大站、IP 却是不相关机房,理论上也是一种可被分析的不一致。
- 并非绝对安全:它提高的是被识别的成本,封锁方仍可能依据流量规模和行为对 IP 采取措施。
- 客户端要求较新:需要 Xray、mihomo 或 sing-box 内核,已停更的原版 Clash 不支持。
Reality 节点也连不上时怎么办
即使是 Reality 节点,也可能出现全部超时的情况。常见原因大致有三类,可以按顺序排查:
- 参数不匹配:机场更换了服务器公钥、短 ID 或目标域名,而你的订阅还是旧的。先在客户端里手动更新订阅,这是最简单也最常见的解决办法。
- IP 被封锁:Reality 难以被证明是代理,但不代表 IP 不会被封。如果同一服务器上的所有节点同时失联,而其他地区正常,多半是该 IP 出了问题,只能等机场更换。
- 本地网络问题:换手机流量或其他网络测试一下,排除公司、校园网对境外连接的限制。
另外,部分客户端在导入 Reality 节点时会因为字段解析不完整而静默失败,比如漏掉短 ID 或流控字段。遇到「只有这一个客户端连不上」的情况,换一个内核不同的客户端交叉验证,往往能很快定位问题。
如果所有协议、所有节点都连不上,问题可能不在 Reality,而在入口线路或机场本身,这时备用机场就派上用场了。
日常该怎么用 Reality 节点
平时不必刻意只用 Reality。大多数机场同一地区会提供多种协议的节点,让客户端按延迟自动选择即可。真正需要切换到 VLESS Reality 的场景,是遇到大面积节点超时、尤其是 敏感时期 其他协议纷纷失联的时候。
选机场时,建议把「是否提供 VLESS Reality 或 AnyTLS 这类高抗封锁协议」作为一条硬指标。四大主流协议的横向对比可以看 Shadowsocks、Trojan、VLESS、Hysteria2 对比,另一个同样主打抗封锁的新协议见 AnyTLS 协议详解。