Skip to content

ECH — mihomo

mihomo предоставляет ECH как блок ech-opts на каждом адаптере прокси, работающем по TLS. Одна и та же структура из трёх полей используется в VLESS, VMess, Trojan, Hysteria2, TUIC, AnyTLS и obfs-вариантах Shadowsocks.

ech-opts

ПолеТипПо умолчаниюДопустимые значенияОписание
enableboolfalsetrue | falseВключить ECH для этого прокси. При false остальная часть блока игнорируется.
configstring(auto-discover)<base64 ECHConfigList>Закреплённый список конфигураций ECH (в base64, со стандартным заполнением). Если не задан, mihomo запрашивает HTTPS-запись DNS для имени сервера, чтобы обнаружить конфигурацию автоматически.
query-server-namestring(server name)<hostname>Переопределяет домен, используемый для запроса HTTPS-записи ECH. По умолчанию берётся `sni` / `servername` / `server` прокси. Полезно, когда «обложечное» имя хоста отличается от фактической цели.

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

Та же структура переиспользуется как ECH-блок обфусцирующих плагинов (в plugin-opts shadowsocks для v2ray-plugin и gost-plugin) — поэтому у каждого поля есть и тег proxy:, и тег obfs:.

Примеры

Исходящий — VLESS с оппортунистическим ECH:

yaml
proxies:
  - name: vless-ech
    type: vless
    server: example.com
    port: 443
    uuid: <UUID>
    tls: true
    servername: example.com
    network: tcp
    ech-opts:
      enable: true

Исходящий — закреплённая конфигурация ECH (base64):

yaml
proxies:
  - name: vless-ech-pinned
    type: vless
    server: example.com
    port: 443
    uuid: <UUID>
    tls: true
    servername: example.com
    ech-opts:
      enable: true
      config: <base64 ECHConfigList>
      query-server-name: cover.example.com

Примечания

  • Значение config в mihomo — стандартный base64 (с заполнением), а не URL-безопасный base64. Если у вас значение в URL-безопасном base64, сначала конвертируйте его.
  • Автообнаружение использует ProxyServerHostResolver mihomo — резолвер, применяемый для разрешения имён хостов прокси. Он, в свою очередь, подчиняется верхнеуровневому блоку dns:, включая любые настройки DoH/DoT.
  • Входящие слушатели mihomo с поддержкой ECH (VLESS / VMess / Trojan / Hysteria2 / TUIC / AnyTLS) принимают связку ключей ECH в поле слушателя ech-key — см. страницы соответствующих входящих. Консолидированного входящего блока ech-config не существует.

Сравнение с другими ядрами

  • Xray-core предоставляет ECH как поля непосредственно на tlsSettings (echServerKeys, echConfigList, echSockopt). См. ECH — Xray-core.
  • sing-box использует вложенный блок tls.ech на входящих и исходящих с именами в snake_case. См. ECH — sing-box.

Исходный код: adapter/outbound/ech.go:12-17 · v1.19.29 (e26714a)

Core Tutorial от Argsment