Reality协议是什么:借用真实证书的伪装原理
一句话结论
Reality 不是独立协议,而是 VLESS 使用的一种握手伪装方式:它在建立连接时借用某个真实大站的证书完成 TLS 握手,因此不需要自己申请域名和证书。被主动探测时,对方看到的是那个真实网站的响应。
节点列表里出现「Reality」这个词的时候,它通常和 Trojan、Hysteria2 排在同一列,看上去理所当然是并列关系。这个排版误导了很多人。Reality 和它们不在同一个层级——前两者是完整的代理协议,Reality 只是 VLESS 建立连接时可以选用的一种握手方式。
要理解它解决的问题,得先看普通 TLS 方案的软肋在哪。用域名加证书的常规做法,信息是公开可查的:证书由哪家机构签发、绑定了哪个域名、这个域名注册了多久、指向的 IP 有没有别的服务,这些都能被第三方查到。一个刚注册两周、只有一台服务器、访问量全是加密流量的域名,本身就是一种模式。
Reality 的想法是跳过这一整套。既然自己的域名总会显得可疑,那就不用自己的——握手时借用一个访问量巨大、无论如何不会被封的真实站点的证书,让这次连接从外部看起来就是有人在访问那个站点。
Reality 是独立协议,还是 VLESS 的一部分
用一张对照表把常见误解和实际情况摆开:
| 常见说法 | 实际情况 |
|---|---|
| Reality 是一种新协议 | 它是 VLESS 的一种传输层安全方案,占据原本 TLS 的位置 |
| 可以用「Reality 协议」单独建节点 | 不能,它必须依附在 VLESS 之上 |
| 用了 Reality 就不需要 VLESS 了 | 恰恰相反,节点类型仍然是 VLESS |
| 它是 TLS 的替代加密算法 | 它仍然走 TLS 1.3,改的是证书从哪来 |
| 机场把它单列说明它是独立品类 | 只是为了让用户在列表里好挑 |
回到上一篇讲过的分层结构:VLESS 把加密责任交给外层,而 Reality 正是「外层」的一种具体实现。关于这一层责任是怎么被移交出去的,可以看 VLESS 与 VMess 的代际差异。
借用别人证书的握手,具体怎么走
把一次 Reality 握手拆成步骤,大致是这样:
- 客户端发起握手,声称要访问被借用的那个站点。ClientHello 里带的域名字段填的是真实大站,而不是你的服务器地址。从这一刻起,链路上看到的目的地就是那个站点。
- 服务端识别这是不是自己人。它检查握手中夹带的身份材料——由
publicKey协商出的密钥和shortId标识。这一步在标准 TLS 握手的正常字段里完成,不额外增加可见特征。 - 是自己人:服务端用借来的证书完成握手。它把从真实站点取得的证书原样返回,客户端因此看到一张完全有效、由正规机构签发的证书,校验自然通过。
- 不是自己人:服务端把连接原样转交给真实站点。这时它退化成一个纯粹的转发器,对方拿到的就是那个站点真实的响应,包括真实的证书和真实的网页。
- 握手完成后,VLESS 的数据在这条通道里传输。后续流程与普通 VLESS over TLS 没有区别。
配置侧的结构示例如下(地址与取值均不可用,仅示意字段位置):
{
"protocol": "vless",
"address": "203.0.113.20",
"port": 443,
"id": "示例UUID",
"flow": "示例流控值",
"security": "reality",
"reality": {
"serverName": "被借用的真实站点域名",
"publicKey": "示例公钥",
"shortId": "示例短ID",
"fingerprint": "chrome"
}
}
注意 address 填的是 IP,而 serverName 填的是一个和你完全无关的域名——这两项对不上是正常的,恰恰是 Reality 的设计意图。
为什么不必自己申请域名和证书
因为证书从头到尾不是你的。常规 TLS 方案里,你要买域名、申请证书、配置续期,这些步骤产生的每一份公开记录都是可查的线索。Reality 把这些线索全部去掉了:
- 没有属于你的域名,也就没有注册时间、注册商、解析记录这些信息可查。
- 没有属于你的证书,也就不会出现在证书透明度日志里被检索。
- 服务器只有一个 IP,这个 IP 上跑的服务对外表现为「访问某大站的流量」。
代价是配置项变多且必须精确。publicKey、shortId、serverName、fingerprint 四项任意一项填错,握手就会失败,而且失败方式往往是静默的——你只会看到连接超时,不会看到「参数错误」。所以 Reality 节点几乎不适合手动誊抄,应当直接从订阅导入。
被主动探测时会看到什么
主动探测指的是:观察方发现一个可疑 IP 后,自己去连一下,看它作何反应。不同方案在这一关的表现差别很大:
| 方案 | 探测者连过去看到的 |
|---|---|
| Shadowsocks | 无响应或直接断开,「什么都不像」本身成为特征 |
| Trojan | 一个可回落的真实网页,取决于服务端是否配了回落 |
| VLESS + 自有域名 TLS | 一张属于你自己的证书,域名可查、访问量为零 |
| VLESS + Reality | 那个真实大站的证书与真实响应 |
最后一行是 Reality 的核心价值:探测者拿到的不是「一个伪装成网站的服务器」,而是那个网站本身的内容,因为服务端确实把连接转过去了。
需要说明边界:这只能保证「单独看这一次探测」看不出问题。链路层面的流量规律——比如某个 IP 长期承载大量流向某单一站点的加密流量——是另一个维度的信息,不在 Reality 的处理范围内。
客户端版本与 TLS 指纹
TLS 指纹指的是不同软件在发起握手时,字段顺序、扩展项组合、算法列表的细微差异构成的特征。浏览器有浏览器的样子,代理客户端如果用自己那套默认值,握手包本身就和浏览器不一样——即使证书完全合法,这条流量也可能被认出不是浏览器发出的。配置里的 fingerprint 字段正是用来指定模仿哪种客户端的握手特征。
支持情况大致可以这样归类:
| 客户端状态 | 表现 |
|---|---|
| 版本足够新 | 正常识别并连接 |
| 版本较旧但认识 VLESS | 节点能导入,连接时静默超时 |
| 版本过旧 | 导入订阅后 Reality 节点整批不显示 |
| 只支持部分参数 | 提示未知字段或直接跳过该节点 |
因为失败大多是静默的,排查时不要盯着日志找关键词,先确认客户端版本是否覆盖了 Reality。升级方式可以对照 v2rayN 使用教程与 Clash 配置教程;如果确认版本没问题仍连不上,再走连接失败的分层排查。
机场在节点名里怎么标记
命名没有统一标准,但常见写法就几种:
| 节点名里出现的写法 | 通常含义 |
|---|---|
Reality / REALITY | 明确标注使用了该方案 |
VLESS-Reality | 完整写法,协议加安全层 |
RE / RL | 空间不够时的缩写 |
Vision | 常与 Reality 搭配的流控方式,间接暗示 |
只写 VLESS | 需要看配置详情才能确认,不能从名字判断 |
和其他线路标签一样,这些字符由机场自行填写,没有任何校验机制,只能当作筛选线索。
Reality 解决不了什么
把边界说清楚,比夸大它的作用有用:
- 不改善速度。带宽上限、跨境路径和落地负载都不归它管,这三项才是速度的主要来源。
- 不解决 IP 本身被封。如果服务器 IP 已经进了黑名单,握手伪装得再像也连不上。
- 不改变出口 IP 的归属判定。流媒体和账号风控看的是落地 IP 的注册信息与信誉,和握手方式无关。
- 不能对抗 TLS 中间人审计。企业网强制替换证书的环境下,借来的证书同样过不了校验。
- 不降低配置出错的概率,反而提高了——参数多、失败静默。
- 不是隐私保证。它防的是「被识别为代理」,不是「服务端看不到你的流量」。
小结
Reality 是 VLESS 的一层握手方案,不是并列的第四种协议,节点类型自始至终都是 VLESS。它的机制是借用真实大站的证书完成 TLS 1.3 握手,身份不匹配时把连接原样转给那个站点,因此主动探测得到的是真实响应。省掉自有域名和证书的同时,配置项变多,且四个关键参数任意一项写错都会静默失败,所以务必从订阅导入而不是手抄。它处理的只有握手识别这一个环节,速度、IP 信誉、线路质量都不在它的作用范围内。
常见问题
Reality 是一种新协议吗?
不是。它是 VLESS 可以选用的一种传输层安全方案,替代普通 TLS 那一层。节点仍然是 VLESS 节点,Reality 只是它握手的方式。机场把它单列出来是为了让用户好挑,不代表协议层面多了一个新家族。
用 Reality 需要自己买域名吗?
不需要。它借用的是某个真实公开网站的证书来完成握手,自己不签发也不申请证书。配置里出现的域名是被借用的那个站点,不是你的服务器域名,填写时必须与机场给出的值完全一致。
配置里的 publicKey 和 shortId 是干什么的?
publicKey 用于客户端与服务端在握手中协商出只有双方知道的密钥,shortId 是服务端用来区分不同用户或不同配置组的短标识。两者都由服务端生成,填错任何一位都会导致握手静默失败,通常不会给出明确报错。
换成 Reality 节点会更快吗?
不会显著变快。Reality 改变的是握手阶段的伪装方式,不改变线路路径、带宽上限和落地负载。它能间接改善的只有一种情况:原本因为被干扰而频繁重连的连接变得稳定,体感上不再卡顿。