Skip to content

REALITY — mihomo

mihomo 双端支持 REALITY。出站使用嵌入代理条目的 reality-opts:; 入站使用监听器上的 reality-config:

出站 —— reality-opts

字段类型默认值允许值描述
public-keystring(required)<base64 X25519 public key>服务端 X25519 公钥。由服务端管理员通过 mihomo 的 `generate reality-keypair` 或 Xray 的 `xray x25519` 生成。
short-idstring(unset)<hex string>向服务器声明的 short ID。必须命中服务端 `short-id` 之一(服务端列表含 `""` 时可为空)。
support-x25519mlkem768boolfalsetrue | false宣告对后量子 X25519MLKEM768 混合密钥交换的支持。服务端必须支持匹配的曲线。

源码: adapter/outbound/reality.go:13-18 · 锚定版本 v1.19.27 (5184081)

入站 —— reality-config

字段类型默认值允许值描述
deststring(required)<host:port>伪装目标 —— 对未授权连接代理握手的合法站点。该站点的证书必须有效;mihomo 在转发握手期间会校验。
private-keystring(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-differenceint0 (no limit)<seconds>客户端与服务端容忍的最大时钟偏移,单位秒。0 关闭检查。
proxystring(direct)<proxy name>通过指定命名出站转发伪装回落流量,而不是直接连 `dest`。服务端无法直接到达伪装站点时有用。
limit-fallback-uploadRealityLimitFallback(unset)RealityLimitFallback对伪装回落的上行方向限速。可让 REALITY 流量与慢速的合法站点无法区分。
limit-fallback-downloadRealityLimitFallback(unset)RealityLimitFallback对伪装回落的下行方向限速。

源码: listener/inbound/reality.go:5-15 · 锚定版本 v1.19.27 (5184081)

limit-fallback-upload / limit-fallback-download

字段类型默认值允许值描述
after-bytesuint640<bytes>仅在已通过这么多字节后再启用限速。0 从第一个字节就限速。
bytes-per-secuint640 (no limit)<bytes>持续带宽上限,字节 / 秒。0 关闭限速。
burst-bytes-per-secuint640 (=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)

由 Argsment 出品的 Core Tutorial