Skip to content

REALITY — mihomo

mihomo поддерживает REALITY с обеих сторон. Исходящий использует reality-opts:, встроенный в запись прокси; входящий — reality-config: на слушателе.

Исходящий — reality-opts

ПолеТипПо умолчаниюДопустимые значенияОписание
public-keystring(required)<base64 X25519 public key>Публичный ключ X25519 сервера. Генерируется администратором сервера через `generate reality-keypair` в mihomo или `xray x25519` в Xray.
short-idstring(unset)<hex string>Short ID, объявляемый серверу. Должен совпадать с одной из записей `short-id` на сервере (или быть пустым, если сервер перечисляет `""`).
support-x25519mlkem768boolfalsetrue | falseОбъявлять постквантовый гибридный обмен ключами X25519MLKEM768. Сервер должен поддерживать соответствующую кривую.

Исходный код: adapter/outbound/reality.go:13-18 · зафиксировано на v1.19.29 (e26714a)

Входящий — reality-config

ПолеТипПо умолчаниюДопустимые значенияОписание
deststring(required)<host:port>Камуфляжная цель — легитимный сайт, чьё TLS-рукопожатие проксируется для неавторизованных соединений. Сертификат сайта должен быть валиден; 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` (камуфляжный fallback).
max-time-differenceint0 (no limit)<seconds>Максимально допустимое расхождение часов клиента и сервера, в секундах. 0 отключает проверку.
proxystring(direct)<proxy name>Направлять камуфляжный fallback-трафик через именованный исходящий прокси вместо прямого подключения к `dest`. Полезно, когда камуфляжный сайт недостижим с сервера.
limit-fallback-uploadRealityLimitFallback(unset)RealityLimitFallbackОграничить скорость камуфляжного fallback в направлении отдачи. Используйте, чтобы трафик REALITY был неотличим от медленного легитимного сайта.
limit-fallback-downloadRealityLimitFallback(unset)RealityLimitFallbackОграничить скорость камуфляжного fallback в направлении загрузки.

Исходный код: listener/inbound/reality.go:5-15 · зафиксировано на v1.19.29 (e26714a)

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>Потолок пиковой (burst) пропускной способности. 0 оставляет равным `bytes-per-sec` (без пиков).

Исходный код: listener/inbound/reality.go:17-21 · зафиксировано на v1.19.29 (e26714a)

Генерация ключей

mihomo включает генератор ключей:

sh
$ mihomo generate reality-keypair
PrivateKey: <base64-private-key>
PublicKey:  <base64-public-key>

xray x25519 в Xray выдаёт тот же формат (оба используют X25519 в base64-RawURLEncoding) — ключи взаимозаменяемы между тремя ядрами.

Примеры

Исходящий — VLESS с REALITY:

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

Входящий — слушатель VLESS с REALITY на стороне сервера:

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: на входящем направляет камуфляжный fallback через другой исходящий mihomo. Это уникальная возможность mihomo — полезно, когда сервер не может напрямую достучаться до камуфляжного сайта (sing-box и Xray всегда подключаются к dest напрямую).
  • limit-fallback-upload.after-bytes — это «разогрев»: ограничение включается только после указанного числа байтов. Используйте небольшое значение (~100 КБ), чтобы само камуфляжное рукопожатие не затормаживалось.
  • max-time-difference: 60 (одна минута) — достаточно щедрое значение для серверов без 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.29 (e26714a)

Core Tutorial от Argsment