
REALITY 是 Xray 在 2023 年引入的传输协议,解决了 TLS 代理的一个根本性弱点:你的证书是假的。传统 VLESS+TLS 方案需要一个域名和 Let’s Encrypt 证书,但这个证书本身就是特征——没有真实网站对应的 TLS 参数,流量特征明显。
REALITY 的思路完全不同:直接借用真实网站的 TLS 握手,服务端呈现给检测方的,就是那个真实网站的 TLS 证书和握手细节,无法与正常流量区分。
REALITY 的核心原理
正常的 TLS 连接过程:
客户端 → ClientHello(包含 SNI,比如 www.apple.com)→ 服务端
服务端 → Certificate(www.apple.com 的真实证书)→ 客户端
REALITY 的魔法:Xray 服务端在收到 ClientHello 时,把这个握手请求转发给真实的 www.apple.com,拿到真实证书,再原封不动地回给客户端。
对于中间的检测设备来说,看到的完全是 www.apple.com 的合法 TLS 握手,无法区分。
客户端和服务端之间的实际加密通信,隐藏在这个握手之后,使用 Xray 自己的密钥对(通过 shortId 验证身份)。
优势总结:
- 不需要域名,不需要证书
- TLS 指纹完全借用真实网站
- 即使有人主动探测你的服务器端口,得到的也是目标网站的正常响应
准备工作
- 一台 VPS(推荐 DMIT,CN2 GIA 延迟低)→ 注册 DMIT
- Xray 最新版(当前 v25.x)
- 不需要域名和证书
服务端部署
安装 Xray
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
生成密钥对
xray x25519
输出:
Private key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Public key: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
保存这两个值,配置里要用。
生成 Short ID
Short ID 用于区分不同客户端,可以是 0-16 位的十六进制字符串:
openssl rand -hex 4 # 生成 8 位,如 55470656
openssl rand -hex 8 # 生成 16 位
服务端配置
/usr/local/etc/xray/config.json:
{
"inbounds": [{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [{
"id": "your-uuid-here",
"flow": "xtls-rprx-vision"
}],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"show": false,
"dest": "www.apple.com:443",
"xver": 0,
"serverNames": ["www.apple.com"],
"privateKey": "你的私钥",
"shortIds": ["55470656", "7a3bc239"]
}
}
}],
"outbounds": [{
"protocol": "freedom",
"tag": "direct"
}]
}
生成 UUID:
xray uuid
启动服务
systemctl enable xray
systemctl start xray
systemctl status xray
SNI(伪装域名)选择
SNI 是 REALITY 最关键的配置,直接决定你的流量能否通过检测。
好的 SNI 的特征:
网站真实存在,且 443 端口一直开着
- 检测方可能主动访问这个域名,如果域名不存在或 443 不通,马上暴露
TLS 握手响应快
- REALITY 的握手需要实时转发到目标网站,目标越近越好
- 推荐:使用和你 VPS 同区域的大网站
HTTPS 流量大的网站
- 你的流量混在大量正常流量里,被单独关注的概率低
推荐的 SNI:
| SNI | 适合区域 | 说明 |
|---|---|---|
www.apple.com | 全球 | Apple CDN 全球节点,响应快 |
www.cloudflare.com | 全球 | CF 节点遍布全球 |
www.microsoft.com | 全球 | Azure CDN,稳定 |
itunes.apple.com | 全球 | Apple 服务,TLS 1.3 |
addons.mozilla.org | 欧美 | Mozilla CDN |
不推荐:
- 国内网站(
www.baidu.com等)——服务器在国外,握手延迟高 - 小众网站——443 端口可能不稳定
- 已知被大量代理用户使用的 SNI(特征明显)
Short ID 的作用
Short ID 是服务端验证客户端身份的机制。
原理:Xray 客户端在 ClientHello 里的 session_id 字段里嵌入一个随机值,服务端通过私钥解密验证,看 padding 里是否包含合法的 Short ID。
- 合法客户端:服务端返回代理响应
- 普通扫描器:服务端正常转发到目标网站(看起来就是普通网站)
配置多个 Short ID(推荐):不同设备用不同的 Short ID,这样某台设备泄露时只需删除对应 ID,不影响其他设备。
"shortIds": ["55470656", "7a3bc239", "a1b2c3d4"]
Flow 选择
REALITY 推荐用 xtls-rprx-vision:
"flow": "xtls-rprx-vision"
Vision 模式可以区分 TLS-in-TLS 流量,避免主动探测时暴露代理特征。如果不加 flow,也能用,但抗检测能力稍弱。
防火墙配置
# Ubuntu UFW
ufw allow 443/tcp
ufw enable
# 或者 iptables
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
建议用 443 端口,混在 HTTPS 流量里最自然。
验证部署
在客户端配置好之后,测试连通性:
# 直接 curl 测试(需要客户端配置好代理)
curl -x vless://uuid@your-vps:443?security=reality&... https://api.ipify.org
更简单的方式:用 mihomo 或 Surge 配置好节点,访问 whatismyip.com 确认 IP 是你的 VPS。
常见问题
Q:服务端启动报错 failed to read config
检查 JSON 格式,用 jq . config.json 验证语法。
Q:客户端连接超时
- 检查防火墙:
ss -tlnp | grep 443 - 检查 SNI 目标是否可达:
curl -I https://www.apple.com(从 VPS 上测) - 检查 privateKey 和 publicKey 是否对应
Q:连接成功但速度慢 SNI 目标离 VPS 太远,握手延迟高。换一个同区域的大网站作为 SNI。
Q:想用非 443 端口 可以,但容易被识别。如果用非标准端口,SNI 对应的目标也要用同样端口:
"dest": "www.apple.com:8443",
"serverNames": ["www.apple.com"]
→ 查看客户端配置:mihomo / Surge 接入 REALITY → 查看 DMIT VPS 购买指南
📷 封面图 · Flux Schnell AI 生成 · panshi.io 品牌风格