REALITY — mihomo
mihomo 双端支持 REALITY。出站使用嵌入代理条目的 reality-opts:; 入站使用监听器上的 reality-config:。
出站 —— reality-opts
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
public-key | string | (required) | <base64 X25519 public key> | 服务端 X25519 公钥。由服务端管理员通过 mihomo 的 `generate reality-keypair` 或 Xray 的 `xray x25519` 生成。 |
short-id | string | (unset) | <hex string> | 向服务器声明的 short ID。必须命中服务端 `short-id` 之一(服务端列表含 `""` 时可为空)。 |
support-x25519mlkem768 | bool | false | true | false | 宣告对后量子 X25519MLKEM768 混合密钥交换的支持。服务端必须支持匹配的曲线。 |
源码: adapter/outbound/reality.go:13-18 · 锚定版本 v1.19.27 (5184081)
入站 —— reality-config
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
dest | string | (required) | <host:port> | 伪装目标 —— 对未授权连接代理握手的合法站点。该站点的证书必须有效;mihomo 在转发握手期间会校验。 |
private-key | string | (required) | <base64 X25519 private key> | 服务端 X25519 私钥。 |
short-id | []string | [] | [<hex string>] | 允许的 short ID 列表(hex,偶长度,≤ 16 字符)。含 `""` 项允许不声明 short ID 的客户端。 |
server-names | []string | (required) | [<hostname>] | 可接受的 SNI 值。SNI 不在列表内的连接被转发到 `dest`(伪装回落)。 |
max-time-difference | int | 0 (no limit) | <seconds> | 客户端与服务端容忍的最大时钟偏移,单位秒。0 关闭检查。 |
proxy | string | (direct) | <proxy name> | 通过指定命名出站转发伪装回落流量,而不是直接连 `dest`。服务端无法直接到达伪装站点时有用。 |
limit-fallback-upload | RealityLimitFallback | (unset) | RealityLimitFallback | 对伪装回落的上行方向限速。可让 REALITY 流量与慢速的合法站点无法区分。 |
limit-fallback-download | RealityLimitFallback | (unset) | RealityLimitFallback | 对伪装回落的下行方向限速。 |
源码: listener/inbound/reality.go:5-15 · 锚定版本 v1.19.27 (5184081)
limit-fallback-upload / limit-fallback-download
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
after-bytes | uint64 | 0 | <bytes> | 仅在已通过这么多字节后再启用限速。0 从第一个字节就限速。 |
bytes-per-sec | uint64 | 0 (no limit) | <bytes> | 持续带宽上限,字节 / 秒。0 关闭限速。 |
burst-bytes-per-sec | uint64 | 0 (=bytes-per-sec) | <bytes> | 突发带宽上限。0 等同于 `bytes-per-sec`(不允许突发)。 |
源码: listener/inbound/reality.go:17-21 · 锚定版本 v1.19.27 (5184081)
生成密钥
mihomo 内置密钥生成器:
sh
$ mihomo generate reality-keypair
PrivateKey: <base64-private-key>
PublicKey: <base64-public-key>Xray 的 xray x25519 产生相同格式(都使用 base64-RawURLEncoding 的 X25519)—— 密钥可在三个内核间通用。
示例
出站 —— 带 REALITY 的 VLESS:
yaml
proxies:
- name: vless-reality
type: vless
server: your.server.example
port: 443
uuid: <UUID>
flow: xtls-rprx-vision
tls: true
servername: www.cloudflare.com
client-fingerprint: chrome
reality-opts:
public-key: <base64-public-key>
short-id: 0123456789abcdef入站 —— REALITY 服务端形态的 VLESS 监听器:
yaml
listeners:
- name: vless-reality-in
type: vless
listen: 0.0.0.0
port: 443
users:
- username: alice
uuid: <UUID>
flow: xtls-rprx-vision
reality-config:
dest: www.cloudflare.com:443
private-key: <base64-private-key>
short-id:
- ''
- 0123456789abcdef
server-names:
- www.cloudflare.com
max-time-difference: 60
limit-fallback-upload:
bytes-per-sec: 8388608
burst-bytes-per-sec: 16777216
limit-fallback-download:
bytes-per-sec: 12582912说明
- 出站的
support-x25519mlkem768启用 2024 年新增的混合后量子密钥 交换。带有匹配曲线的服务器会接受;旧服务器看到的是普通 X25519 握手。 - 入站的
proxy:字段把伪装回落流量经另一个 mihomo 出站转发。这是 mihomo 独有的能力 —— 服务端无法直接到达伪装站点时有用(sing-box 与 Xray 始终直接拨号dest)。 limit-fallback-upload.after-bytes是预热:仅在通过该字节数后限速 才生效。用一个较小的值(约 100 KB)能避免伪装握手本身被限速。- 设置
max-time-difference: 60(1 分钟)对没有 NTP 的服务器足够 宽松。设为 0 则完全禁用时钟偏移检查 —— 开发方便、生产风险。
跨内核说明
- Xray-core 把所有字段放在单一
REALITYConfig。伪装目标是dest;uTLS 指纹是同一结构体的fingerprint字段。参见 REALITY — Xray-core。 - sing-box 把 REALITY 嵌入两端的
tls:块。伪装目标是子块handshake(内嵌 ServerOptions + DialerOptions)。参见 REALITY — sing-box。
源码: adapter/outbound/reality.go:13-18 · v1.19.27 (5184081)
