REALITY — mihomo
mihomo поддерживает REALITY с обеих сторон. Исходящий использует reality-opts:, встроенный в запись прокси; входящий — reality-config: на слушателе.
Исходящий — reality-opts
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
public-key | string | (required) | <base64 X25519 public key> | Публичный ключ X25519 сервера. Генерируется администратором сервера через `generate reality-keypair` в mihomo или `xray x25519` в Xray. |
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.29 (e26714a)
Входящий — reality-config
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
dest | string | (required) | <host:port> | Камуфляжная цель — легитимный сайт, чьё TLS-рукопожатие проксируется для неавторизованных соединений. Сертификат сайта должен быть валиден; 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` (камуфляжный fallback). |
max-time-difference | int | 0 (no limit) | <seconds> | Максимально допустимое расхождение часов клиента и сервера, в секундах. 0 отключает проверку. |
proxy | string | (direct) | <proxy name> | Направлять камуфляжный fallback-трафик через именованный исходящий прокси вместо прямого подключения к `dest`. Полезно, когда камуфляжный сайт недостижим с сервера. |
limit-fallback-upload | RealityLimitFallback | (unset) | RealityLimitFallback | Ограничить скорость камуфляжного fallback в направлении отдачи. Используйте, чтобы трафик REALITY был неотличим от медленного легитимного сайта. |
limit-fallback-download | RealityLimitFallback | (unset) | RealityLimitFallback | Ограничить скорость камуфляжного fallback в направлении загрузки. |
Исходный код: listener/inbound/reality.go:5-15 · зафиксировано на v1.19.29 (e26714a)
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> | Потолок пиковой (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)
