REALITY
REALITY 是对 TLS 的一种修改,通过借用目标站点的 TLS 外观与握手特征来完成伪装。
TIP
REALITY 是目前最安全的传输安全方案之一, 且外部看来流量类型和正常上网具有一致性。
启用 REALITY 并且配置合适的 XTLS Vision 流控模式, 可以达到数倍甚至十几倍的性能提升。
致开发者
REALITY 只是修改了 TLS,客户端的实现只需要轻度修改完全随机的 session id 和自定义证书验证即可,理论上与大多数 TLS 组合完全兼容。 更多信息请参考 REALITY 项目.
RealityObject
RealityObject 对应 StreamSettingsObject 中的 realitySettings 项。
{
// outbound 示例,同样可用于 inbound
"outbounds": [
{
// ...
"streamSettings": {
"security": "reality",
"realitySettings": {
// 入站(服务端)配置
"show": false,
"target": "example.com:443",
"xver": 0,
"serverNames": ["example.com", "www.example.com"],
"privateKey": "",
"minClientVer": "",
"maxClientVer": "",
"maxTimeDiff": 0,
"shortIds": ["", "0123456789abcdef"],
"mldsa65Seed": "",
"limitFallbackUpload": {
"afterBytes": 0,
"bytesPerSec": 0,
"burstBytesPerSec": 0
},
"limitFallbackDownload": {
"afterBytes": 0,
"bytesPerSec": 0,
"burstBytesPerSec": 0
},
// 出站(客户端)配置
"serverName": "",
"fingerprint": "chrome",
"password": "",
"shortId": "",
"mldsa65Verify": "",
"spiderX": ""
}
}
}
]
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
show: true | false
当值为 true 时,输出调试信息。
TIP
以下为入站(服务端)配置。
target: string
必填,格式同 VLESS fallbacks 的 dest。
旧称 dest, 当前版本两个字段互为alias
如果 target 支持后量子密钥交换算法 X25519MLKEM768, 那么 REALITY 客户端也会自动使用该后量子算法进行密钥协商。具体是否支持可以使用 xray tls ping cloudflare.com (网址更改为dest, 可以带端口号) 检查。
核心按照这个字段是否存在区分是当前是客户端还是服务端配置,不要在客户端填写,否则会造成识别异常。
WARNING
为了伪装的效果考虑,Xray 对于鉴权失败(非合法 REALITY 请求)的流量,会直接转发至 target. 如果 target 网站的 IP 地址特殊(如使用了 CloudFlare CDN 的网站) 则相当于你的服务器充当了 CloudFlare 的端口转发,可能造成被扫描后偷跑流量的情况。
为了杜绝这种情况,可以考虑前置 Nginx 等方法过滤掉不符合要求的 SNI。 或者也可以考虑配置 limitFallbackUpload 和 limitFallbackDownload,限制其速率。
xver: number
选填,格式同 VLESS fallbacks 的 xver
serverNames: [string]
必填,客户端可用的 serverName 列表,不支持 * 通配符。
一般与 target 保持一致即可,实际的可选值为服务器所接受的任何 SNI(依据 target 本身的配置有所不同),一般是参考是所返回证书的 SAN.
其中可包含空值 "" 代表接受没有SNI的连接。使用此特性不要求 target 具有 IP 证书,只需确保在收到无 SNI 的 Client Hello 其不会拒绝连接。使用这一特性时客户端 serverName 不能为空,需要填入任意有效 IP 地址占位。
可以使用 xray tls ping 观察服务端对无 SNI 请求的响应行为。
privateKey: string
必填,执行 ./xray x25519 生成。
minClientVer: string
选填,客户端 Xray 最低版本,格式为 x.y.z。
maxClientVer: string
选填,客户端 Xray 最高版本,格式为 x.y.z。
maxTimeDiff: number
选填,允许的最大时间差,单位为毫秒。
shortIds: [string]
必填,客户端可用的 shortId 列表,可用于区分不同的客户端。
格式要求见 shortId
若包含空值,客户端 shortId 可为空。
mldsa65Seed: string
仅服务端,为发送给 REALITY 客户端的证书添加额外的后量子签名所使用的私钥,使用 ML-DSA-65 (如果存在可以破解 x25519 的量子计算机,password 泄露可能导致连接可以被 mitm, 该功能可以防止未来的这种攻击)
使用 xray mldsa65 生成使用的公私钥对,服务端配置私钥后只会在证书扩展中添加,不影响旧版客户端或没启用该功能的客户端。
注意,配置该功能后 target 所返回的证书长度必须大于 3500, 因为后量子签名会导致 REALITY 返回的临时证书变大,为了防止产生特征 target 返回的证书也要很大。 可以使用 xray tls ping example.com 进行查看检查。同时为了完美的后量子安全,target 也需要支持后量子密钥交换 X25519MLKEM768, 支持情况一样可以通过前面的命令查看。
limitFallbackUpload/limitFallbackDownload
WARNING
警告:对于 REALITY 最佳实践始终是偷同 ASN 的证书,那么你大概率用不到此功能;只有当你迫不得已偷了 Cloudflare 这种免费 CDN 的证书时,为避免你服务器成为别人加速节点时可考虑开启此功能。
回落限速是一种特征,不建议启用,如果您是面板/一键脚本开发者,务必让这些参数随机化。
TIP
limitFallbackUpload 和 limitFallbackDownload 为选填,可对未通过验证的回落连接限速,bytesPerSec 默认为 0 即不启用。
原理:针对每个未通过验证的回落连接,当传输了 afterBytes 字节后开启限速算法。 限速采用令牌桶算法,桶的容量是 burstBytesPerSec,每传输一个字节用掉一个令牌,初始 burstBytesPerSec 是满的。 每秒以 bytesPerSec 个令牌填充桶,直到容量满。
举例:afterBytes=10485760, burstBytesPerSec=5242880, bytesPerSec=1048576 代表传输 15MB 后开始限速为 1MB/s,如果暂停传输,5 秒后能突发到 5MB/s,然后又恢复到 1MB/s。
建议:过大的 afterBytes 和 burstBytesPerSec 将起不到限速效果,过小的 bytesPerSec 和 burstBytesPerSec 则十分容易被探测。 应结合被偷网站的资源大小合理设置参数,如果不允许突发,可以把 burstBytesPerSec 设为 0。
afterBytes: number
选填,对回落的 REALITY 连接限速,限制传输指定字节后开始限速,默认为 0。
bytesPerSec: number
选填,对回落的 REALITY 连接限速,限制基准速率(字节/秒),默认为 0 即不启用限速功能。
burstBytesPerSec: number
选填,对回落的 REALITY 连接限速,限制突发速率(字节/秒),大于 bytesPerSec 时生效。
TIP
以下为出站(客户端)配置。
serverName: string
服务端 serverNames 之一。
特别地,客户端可以将其设置为任意 IP 地址,Xray 将会发送无 SNI 扩展的 Client Hello. 要使用这一特性请确保服务端 serverNames 中包含空值 ""。
fingerprint: string
必填,同 TLSObject。 注意:此处不支持使用 unsafe 禁用 utls, 因为 REALITY 协议实现使用了该库以操作底层 TLS 参数。
shortId: string
服务端 shortIds 之一。
长度为 8 个字节,即 16 个 0~f 的数字字母,可以小于16个,核心将会自动在后面补0, 但位数必须是偶数 (因为一个字节有2位16进制数)
如 aa1234 会被自动补全为 aa12340000000000, 但是aaa1234 则会导致错误。
0也是偶数,所以若服务端的 shordIDs 包含空值 "" ,客户端也可为空。
password: string
必填,服务端私钥对应的公钥。使用 ./xray x25519 -i "服务器私钥" 生成。旧称 publicKey, 为防止误解更名(这个东西地位上确实是 x25519 公钥但是在 REALITY 的设计中是客户端持有,不能公开)
mldsa65Verify
可选,mldsa65 签名验证使用的公钥,非空时使用该公钥检查服务端返回的证书,详情见 "mldsa65Seed" 的描述。
spiderX: string
爬虫初始路径与参数,建议每个客户端不同。