REALITY 节点为什么会“偷跑流量”?

REALITY 的 target 指向 Cloudflare CDN 时,服务器可能被第三方当作 Cloudflare 的前置转发入口,并产生异常流量。社区通常称其为“REALITY 偷跑流量”或“反代 Cloudflare”。

这一现象发生在 REALITY 层,与 VLESS、VMess 等代理协议以及 RAW 等传输方式无关。第三方无需获得代理协议的认证信息、REALITY 私钥或 shortId,利用的是 REALITY 对鉴权失败连接的处理方式。

REALITY 如何处理连接

常见服务端配置如下:

{
  "security": "reality",
  "realitySettings": {
    "target": "example.com:443",
    "serverNames": [
      "example.com"
    ]
  }
}

旧版配置可能使用 dest。当前版本中,desttarget 互为别名。1

REALITY 的伪装机制用于应对 GFW 等网络审查系统的主动探测。审查系统可以主动连接公开端口,观察服务端如何响应。如果服务端对无效请求立即断开连接或返回固定错误,这种行为可能成为识别代理服务的特征。

合法客户端携带正确的 REALITY 认证信息,通过验证后进入上层代理协议。扫描器、浏览器、错误客户端以及主动探测请求无法通过验证,Xray 会把连接转发到 target,让探测方看到真实网站的 TLS 响应:

客户端 → VPS:443
          ├─ REALITY 验证成功 → 上层代理协议 → Internet
          └─ REALITY 验证失败 → target

未通过验证的连接也会产生真实的服务器出站流量。该行为原本用于降低主动探测的识别能力,也为 Cloudflare 转发滥用提供了入口。

文中沿用社区常见的“REALITY fallback”称呼,具体指未通过鉴权连接的 target 转发行为。它与代理协议中名为 "fallbacks": [...] 的配置项无关。官方文档只说明 target 的格式与该配置项的 dest 相同。1

更换代理协议或传输方式不会消除这条转发路径。风险由 REALITY 的未鉴权转发行为和目标服务器的网络结构共同决定。

Cloudflare target 为什么容易被利用

普通独立 HTTPS 服务器通常只处理自己的域名。此类目标收到陌生连接时,VPS 只会向该站点转发流量,可利用范围有限。

Cloudflare 的代理域名共享其 Anycast IP 地址。Cloudflare 边缘节点根据 TLS SNI 和 HTTP Host 等信息处理不同站点的请求。2 当 REALITY 的 target 位于 Cloudflare CDN,鉴权失败的连接会进入 Cloudflare 边缘网络:

第三方 → VPS:443 → REALITY target → Cloudflare Edge → Cloudflare 托管站点

第三方可以连接 VPS 的 443 端口,并在 TLS 请求中携带另一个 Cloudflare 托管域名的 SNI。VPS 随后充当 Cloudflare 的 TCP 前置转发器。Xray 官方文档已明确提示,Cloudflare 一类特殊 target 可能让服务器在被扫描后产生流量盗用。1

所有 REALITY 服务都会为未通过鉴权的连接产生一定 target 流量。普通独立站点的风险通常较低;Cloudflare 等共享 CDN 提供了更大的转发范围。其他采用共享入口 IP 和 SNI 路由的大型 CDN 也需要单独评估。

这类问题属于资源滥用。REALITY 验证和上层代理协议的认证仍然有效,第三方没有取得代理权限,也没有登录 VPS。可能出现的后果包括流量额度耗尽、限速、停机和额外费用。

检查 REALITY target

先检查服务端的以下字段:

realitySettings.target
realitySettings.dest

如果值为 www.cloudflare.com:443,或域名启用了 Cloudflare 代理,应更换或增加限制。普通域名也需要检查实际解析结果。

查询 IPv4 和 IPv6:

dig +short A example.com
dig +short AAAA example.com

查询解析地址的 ASN:

whois 104.xxx.xxx.xxx

减少 whois 输出:

whois 104.xxx.xxx.xxx \
  | grep -Ei 'origin|originas|aut-num|netname|org-name|orgname'

结果中出现 AS13335CLOUDFLARENETCloudflare,通常表示该地址属于 Cloudflare。Cloudflare 支持 BYOIP 等部署方式,因此 ASN 检查不能覆盖全部情况。

Cloudflare 官方维护 IPv4 和 IPv6 网段列表:

curl -s https://www.cloudflare.com/ips-v4
curl -s https://www.cloudflare.com/ips-v6

自动化检测应读取当前列表,避免长期使用硬编码的旧网段。

Xray 还可以检查目标的 TLS 行为:

xray tls ping example.com
xray tls ping example.com:443

xray tls ping 用于判断 TLS 行为是否适合作为 REALITY target,不负责识别 Cloudflare。选取目标时可以结合 DNS、ASN 和 TLS 检查结果。

处理方案

更换共享 CDN target

个人节点可优先选择网络特征合理的独立目标,避免直接使用:

"target": "www.cloudflare.com:443"

REALITY 官方文档建议优先选择与 VPS 位于同一 ASN 的合适目标。1 选择时需要检查 TLS 支持、网络可达性、地理位置、ASN、网络路径和证书行为。

限制未鉴权连接的带宽

Xray 提供 limitFallbackUploadlimitFallbackDownload,只限制未通过 REALITY 验证的连接:

"realitySettings": {
  "target": "example.com:443",
  "serverNames": [
    "example.com"
  ],

  "limitFallbackUpload": {
    "afterBytes": 10485760,
    "bytesPerSec": 1048576,
    "burstBytesPerSec": 5242880
  },

  "limitFallbackDownload": {
    "afterBytes": 10485760,
    "bytesPerSec": 1048576,
    "burstBytesPerSec": 5242880
  }
}
  • afterBytes:传输达到指定字节数后开始限速。
  • bytesPerSec:持续速率。
  • burstBytesPerSec:令牌桶的突发容量。

以上参数会在累计传输约 15 MB 后,将持续速度限制在约 1 MB/s。连接暂停 5 秒后,可再次突发传输约 5 MB。1

固定限速会形成可识别的网络特征。官方文档不建议默认启用该功能,并要求面板或一键脚本随机化参数。限速适合无法更换 CDN target 时控制资源消耗。

按 SNI 过滤连接

Nginx、HAProxy 或 Xray 自身的路由可以只允许预期 SNI:

客户端 → SNI 检查
          ├─ 正确 SNI → Xray REALITY 或 target
          └─ 其他 SNI → DROP

严格过滤会改变 REALITY 对陌生连接的伪装行为,需要结合资源滥用风险和主动探测场景评估。

XTLS 官方示例仓库提供了 VLESS-TCP-REALITY (without being stolen) 目录。该示例使用 dokodemo-door + TLS sniffing + routing + blackhole 过滤 SNI:3

REALITY 未认证连接
本机 dokodemo-door
读取 TLS SNI
        ├─ 预期 serverName → direct → target
        └─ 其他 serverName → blackhole

示例中的核心入站结构如下:

{
  "listen": "127.0.0.1",
  "tag": "dokodemo-in",
  "port": 4431,
  "protocol": "dokodemo-door",
  "settings": {
    "address": "speed.cloudflare.com",
    "port": 443,
    "network": "tcp"
  },
  "sniffing": {
    "enabled": true,
    "destOverride": [
      "tls"
    ],
    "routeOnly": true
  }
}

REALITY 指向本机入站:

"realitySettings": {
  "dest": "127.0.0.1:4431",
  "serverNames": [
    "speed.cloudflare.com"
  ]
}

路由允许预期域名直连:

{
  "inboundTag": [
    "dokodemo-in"
  ],
  "domain": [
    "speed.cloudflare.com"
  ],
  "outboundTag": "direct"
}

其余连接进入 block

{
  "inboundTag": [
    "dokodemo-in"
  ],
  "outboundTag": "block"
}

部署时应使用官方示例仓库的当前完整配置。上述片段只展示转发和过滤结构,不包含 UUID、密钥等必要字段。

排查异常流量

Debian 或 Ubuntu 可以使用 vnstat 记录流量:

apt install vnstat
systemctl enable --now vnstat

查看每日、每月和实时流量:

vnstat -d
vnstat -m
vnstat -l

检查当前 443 连接:

ss -tnp | grep ':443'
ss -tn state established '( sport = :443 )'

统计连接来源:

ss -tn state established '( sport = :443 )' \
  | awk 'NR>1 {print $5}' \
  | sort \
  | uniq -c \
  | sort -nr \
  | head

公网 443 端口经常收到扫描连接,连接数量本身不能证明流量被盗用。大量持续连接、异常带宽和缺少对应的正常使用记录同时出现时,应继续检查连接日志、进程、监听端口和网络连接。

参考资料