Close-up of wooden blocks spelling ’encryption’, symbolizing

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 的特征:

  1. 网站真实存在,且 443 端口一直开着

    • 检测方可能主动访问这个域名,如果域名不存在或 443 不通,马上暴露
  2. TLS 握手响应快

    • REALITY 的握手需要实时转发到目标网站,目标越近越好
    • 推荐:使用和你 VPS 同区域的大网站
  3. 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:客户端连接超时

  1. 检查防火墙:ss -tlnp | grep 443
  2. 检查 SNI 目标是否可达:curl -I https://www.apple.com(从 VPS 上测)
  3. 检查 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 品牌风格