VLESS 与 Reality 是什么?协议本身不加密,安全靠外层
拾沙 · 首发于 · 更新于
30 秒结论:VLESS 是 Xray 项目使用的一种无状态、轻量的传输协议,用 UUID 识别用户,协议本身不做加密。它的安全性来自外层:搭配 TLS 时和 Trojan 类似,搭配 Reality 时可以借用别人网站的 TLS 握手,不需要自己的域名和证书,还能消除服务端的 TLS 特征。VLESS 不加密并不等于不安全,关键看外面套的是哪一层;只要节点用了 TLS 或 Reality,流量就是加密的。
近两年,越来越多机场在订阅里加入 VLESS 节点,尤其是标着「Reality」的节点。很多人第一次听说时会被一句话吓到:VLESS 本身不加密。这篇文章讲清 VLESS 到底是什么、为什么不加密也不影响安全,以及 Reality 解决了什么问题。
VLESS 是什么
按照 Project X(Xray)官方文档的描述,VLESS 是一个无状态的轻量传输协议,作为 Xray 客户端和服务器之间的桥梁。它的请求结构很简单:协议版本、一个 16 字节的 UUID(用来识别用户)、附加信息、指令、目标端口和地址,然后就是要传输的数据。
为什么不加密
VLESS 的设计者有意把加密从协议里拿掉了。原因是:在实际使用中,VLESS 几乎总是跑在 TLS 或 Reality 里面,外层已经完成了加密;如果协议内部再加密一次,就是重复劳动,白白消耗性能。
所以,VLESS 的安全性完全取决于它外面套的是什么:
VLESS + TLS:和 Trojan 的思路相近,流量被 TLS 加密,看起来像访问普通 HTTPS 网站,需要服务端有域名和证书。
VLESS + Reality:用 Reality 代替普通 TLS,不需要自己的域名和证书,伪装效果更好。
裸 VLESS:既不套 TLS 也不套 Reality,是明文传输,正规机场不会这样提供节点。
和 VMess 的区别
VMess 是 V2Ray 早期的主力协议,自带加密,并且要求客户端和服务器的时间误差不能太大,时间不准时就会连不上。VLESS 去掉了协议内的加密和时间校验,结构更简单。官方文档提到,VLESS 的用户验证模块经过多次重构,资源占用很低,能同时支持大量用户,这也是机场愿意采用它的原因之一。
Reality 解决了什么问题
普通的 TLS 伪装有两个麻烦:服务端需要自己的域名和证书;服务端的 TLS 实现本身也可能带有可被识别的特征。Reality 就是为了解决这两个问题而设计的。
借用真实网站的身份
根据 REALITY 项目的说明,它可以「指向别人的网站」,不需要购买域名、也不需要配置 TLS 服务器。服务端会设定一个目标网站,当有人连接时,对网络中间的观察者来说,这就是一次访问该网站的、完整而真实的 TLS 连接,探测者拿到的也是那个网站的真实证书。
只有持有正确密钥的客户端,才会收到服务端签发的临时证书,从而进入代理模式。项目说明还提到,Reality 可以消除服务端可被检测的 TLS 指纹,同时保留前向保密等安全特性。
对目标网站的要求
Reality 并不是随便借一个网站就行。项目说明给出的最低标准是:目标网站在中国大陆之外、支持 TLS 1.3 和 HTTP/2,并且所用的域名不是用来跳转的。这些都由机场在服务端配置,用户不需要操心。
XTLS Vision
很多 Reality 节点的参数里会出现 flow: xtls-rprx-vision。这是 VLESS 的一种流控方式,用来处理「代理的 TLS 里面再套着网站的 TLS」这种情况,减少相关特征和性能损耗。看到这个参数时,确认你的客户端支持即可。
Reality 节点的参数怎么看
Reality 节点的分享链接通常写成 vless://UUID@服务器地址:端口?参数#节点名称,参数比其他协议多,但每一项都有明确的用途:
security=reality:说明外层用的是 Reality,而不是普通 TLS。
sni:要借用的目标网站域名,必须是服务端允许的域名之一。
pbk:服务端的公钥,用于验证服务端签发的临时证书。
sid:shortId,用来区分不同的客户端,可以为空,但必须和服务端配置对应。
fp:客户端模拟的 TLS 指纹,例如 chrome、firefox,用来让握手看起来像常见浏览器。
flow:流控模式,Reality 节点常见的是 xtls-rprx-vision。
这些参数缺一不可,任意一项填错,连接都会失败。所以 Reality 节点几乎只能通过订阅导入,手动抄写很容易出错。
Reality 节点连不上时怎么排查
第一,确认客户端版本支持 Reality。较旧的 v2rayN、v2rayNG 和所有基于原版 Clash 内核的客户端都不支持。
第二,确认参数完整。部分客户端在导入时会丢掉 pbk 或 sid 字段,导致连接失败,换一个客户端导入对比一下。
第三,检查 fp 指纹选项。个别客户端不支持某些指纹值,可以改成 chrome 再试。
第四,如果同一机场的其他协议节点都正常,只有 Reality 节点异常,留意机场公告,可能是服务端更换了目标网站或密钥,更新订阅即可。
VLESS 的优缺点
优点:协议精简、性能开销低;搭配 Reality 后伪装效果好,服务端没有自己的 TLS 特征;不依赖设备时间。
缺点:客户端支持面比 Trojan 窄,原版 Clash 内核不支持,Reality 还要求客户端较新;参数多(UUID、公钥、shortId、sni、flow),手动配置容易出错,好在机场订阅会自动填好。
机场用户需要知道什么
如果你的机场提供 VLESS 或 Reality 节点,最常见的问题是导入失败或节点不显示。原因几乎都在客户端:原版 Clash 不支持 VLESS,需要换成基于 mihomo 内核的客户端,或者 v2rayN、v2rayNG、sing-box 等,具体见 代理软件 栏目。
另外,Reality 节点的参数一个都不能错。导入后不要手动修改 sni、公钥等字段,连不上时优先更新订阅。如果网络对 UDP 比较友好,也可以试试机场的 Hysteria2 节点作为对照。
常见问题
VLESS 不加密,用起来安全吗?
安全与否取决于外层。机场提供的 VLESS 节点几乎都会搭配 TLS 或 Reality,这两种方式都会完整加密流量。只有既不套 TLS 也不套 Reality 的「裸 VLESS」才是明文传输,正规机场不会这样提供节点。
VLESS 和 VMess 有什么区别?
VMess 是更早的协议,自带加密,并且对设备时间有要求;VLESS 去掉了协议内的加密,把加密交给 TLS 或 Reality,结构更简单、性能开销更低,也不再依赖时间校验。
Reality 为什么不需要自己的域名?
Reality 让服务器在 TLS 握手时借用另一个真实网站(目标网站)的身份,探测者看到的是那个网站的真实证书。只有持有正确密钥的客户端,才能完成代理连接。
VLESS 节点导不进 Clash 怎么办?
原版 Clash 内核不支持 VLESS。需要使用基于 mihomo(Clash Meta)内核的客户端,或者 v2rayN、v2rayNG、sing-box 等客户端。Reality 节点还要求客户端版本足够新。
XTLS Vision(xtls-rprx-vision)是什么?
它是 VLESS 的一种流控模式,用来减少「TLS 里再套 TLS」时的特征和性能损耗。节点参数里的 flow 字段写着 xtls-rprx-vision 时,客户端需要支持这个模式。
参考资料
本文的结论以下列官方文档、规范或资料为准: