REALITY
REALITY 是 Xray 的传输安全机制,通过借用目标站点的 TLS 外观与握手特征完成伪装;未通过 REALITY 鉴权的连接会被转发到 target,这一 fallback 行为在共享 CDN target 上可能形成开放端口转发风险。
[!info] related notes
- 所属 MOC: 计算机网络 MOC
- 前置概念: SNI、TLS 握手(TLS 1.3 主线)
- 并列概念: VLESS
- 易混淆概念: Cloudflare 优选 IP
- 关系笔记: REALITY、Cloudflare 与 fallback 流量滥用
- 实践: 在 Oracle VPS 上部署 sing-box 代理
REALITY
一句话定义
REALITY 是 Xray 的传输安全机制。它修改并利用 TLS 握手行为,借用一个真实目标站点的 TLS 外观与握手特征作为伪装,使外部观察到的连接更接近普通 TLS/Web 流量。
REALITY 不是 VLESS 本身;它属于传输安全层,常与 VLESS 组合。
在协议栈中的位置
可以把一条常见代理连接拆成:
代理协议:VLESS
↓
传输方式:RAW / XHTTP / gRPC
↓
传输安全:REALITY
↓
TCP / 网络
因此:
- VLESS 负责代理请求、身份字段和真正的目标地址;
- REALITY 负责外层握手、传输安全与伪装;
- SNI 是 REALITY/TLS 外层握手中的主机名信息之一。
Project X 当前文档说明 REALITY 可与 RAW、XHTTP、gRPC 等传输方式组合。
一条 REALITY 连接中的三个“目标”
在 VLESS + REALITY 场景中,经常同时存在三个容易混淆的地址:
1. server
= 客户端真正连接的 VPS_IP:port
2. serverName / SNI
= REALITY 外层握手使用的伪装主机名
3. VLESS destination
= 代理隧道建立后真正想访问的网站
例如:
server = 203.0.x.x:443
serverName/SNI = example.com
VLESS destination
= youtube.com:443
因此,SNI 指向 example.com 并不意味着最终代理流量只会访问 example.com。
服务端的 target 是什么
REALITY 服务端有一个关键字段:
target = example.com:443
旧版本文档和配置中也常看到 dest,当前 Xray 文档将两者视为别名。
target 的角色不是“用户最终代理访问的网站”,而是 REALITY 借用 TLS 外观、证书/握手特征以及处理非合法连接时使用的真实目标。
通常还会配置:
serverNames:客户端允许使用的 serverName/SNI;- 服务端私钥;
shortIds;- 客户端对应的 serverName、凭据/公钥信息与 shortId。
合法 REALITY 客户端
简化流程:
合法客户端
│
│ 连接 VPS
│ REALITY 参数匹配
▼
REALITY 验证通过
│
▼
进入真正的代理协议
│
▼
VLESS destination
│
▼
YouTube / GitHub / 其他目标
这里 target 主要承担伪装参考角色,而不是把合法代理流量永久转发给 target。
关键机制:鉴权失败会 fallback 到 target
REALITY 为了让“不合法的 REALITY 连接”看起来仍像正常 TLS 服务,而不是立即暴露一个明显异常的代理端口,Xray 会把鉴权失败、不是合法 REALITY 请求的流量直接转发到 target。
简化为:
陌生客户端
│
▼
VPS:443
│
├─ REALITY 验证通过 → 正常代理
│
└─ REALITY 验证失败 → 原样转发到 target
这个 fallback 行为是 REALITY 伪装模型的重要组成部分,也是共享 CDN target 风险的根源。
为什么 target 不能随便选共享 CDN
如果 target 是普通单站点服务器:
VPS
↓
ordinary.example:443
陌生连接即使触发 fallback,通常也只获得到该目标站点的有限转发价值。
如果 target 位于 Cloudflare 这类共享 CDN 上:
VPS
↓
Cloudflare Edge IP
├─ tenant-a.example
├─ tenant-b.example
├─ tenant-c.example
└─ ...
Cloudflare 的公开代理 IP 段被大量 proxied hostnames 共享,并通过 Anycast 在全球多个数据中心发布。此时 VPS 可能等价于一个通往 Cloudflare 边缘的 TCP 端口转发器。
Project X 官方 REALITY 文档专门警告:如果 target 使用 Cloudflare CDN 等“特殊”共享地址,服务器可能在被扫描后被第三方滥用、偷跑流量。
详细机制见 REALITY、Cloudflare 与 fallback 流量滥用。
“偷域名/偷证书”在 REALITY 语境中的含义
中文社区常把 REALITY 选择第三方真实站点作为 target/serverName 的做法口语化称为:
- 偷域名;
- 偷 SNI;
- 偷证书。
更准确的理解是:
借用第三方目标站点的 TLS 证书/握手外观作为 camouflage target。
这不是取得该域名的控制权,也不等于入侵该网站。
Project X 中文文档自身也使用“偷同 ASN 的证书”“偷了 Cloudflare 这种免费 CDN 的证书”一类表述,因此这一社区术语在 REALITY 讨论中较常见。
与 Domain Fronting 的区别
REALITY 不应简单等同于传统 Domain Fronting。
传统 Domain Fronting 通常利用:
TLS SNI = front.example
HTTP Host = hidden.example
由共享 CDN 在不同层看到不同 hostname 完成前置。
REALITY 的核心则是:
- 客户端直接连接 REALITY 服务端;
- 借用 target 的 TLS 外观与握手特征;
- 通过自定义验证识别合法 REALITY 客户端;
- 非合法连接 fallback 到 target。
两者都可能涉及共享基础设施和不同层的主机名,但机制不同。
防止 fallback 被滥用
Project X 当前文档给出的主要方向包括:
- 避免把共享免费 CDN 作为 target,优先选择更合适、与服务端网络特征接近的普通目标;
- 在前面增加 Nginx 等入口,过滤不符合预期的 SNI;
- 使用
limitFallbackUpload/limitFallbackDownload对未通过验证的 fallback 连接限速; - 对公网流量、连接数、带宽和异常 SNI 做监控。
需要注意:官方文档也提醒 fallback 限速本身可能形成特征,因此它不是没有代价的万能方案。
常见误解
REALITY target 就是最终代理目标
不是。合法代理会进入 VLESS 等代理协议,再访问 VLESS 请求里的 destination。
非法客户端一定会被直接丢弃
不是。REALITY 的关键设计之一就是把未通过验证的连接 fallback 到 target。
流量被跑光一定说明 UUID 或面板被攻破
不是。若第三方只利用 REALITY fallback 把 VPS 当开放中转,VLESS UUID、面板密码和 SSH 都可能完全没有泄漏。
学习检查
- REALITY 与 VLESS 分别位于哪一层?
server、serverName/SNI、target和 VLESS destination 分别是什么意思?- 为什么 REALITY 不直接丢弃全部非法连接?
- 为什么共享 CDN target 会把 fallback 风险放大?
- “偷域名/偷证书”在 REALITY 语境下到底偷了什么?
- REALITY 为什么不能简单等同于 Domain Fronting?
参考
- Project X — REALITY: https://xtls.github.io/en/config/transports/reality.html
- Project X — 传输配置: https://xtls.github.io/en/config/transport.html
- Cloudflare — Cloudflare IP addresses: https://developers.cloudflare.com/fundamentals/concepts/cloudflare-ip-addresses/