Skip to content

Hysteria2 — mihomo

mihomo поддерживает Hysteria2 с обеих сторон. Исходящее подключение несёт явные поля перескока портов (port-hopping) и обширный набор настроек управления потоком quic-go. Таблица пользователей входящего — плоское отображение: одна пара «имя пользователя / пароль» на запись.

Исходящий

Запись в proxies: с type: hysteria2. Встраивает BasicOption (общие поля исходящих: interface-name, routing-mark, …).

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
serverstring(required)<host>Имя хоста или IP вышестоящего сервера.
portint(unset)<port>Одиночный порт сервера. Опустите, когда задан `ports`.
portsstring(unset)<port-list>Список для перескока портов (port-hopping). Принимает разделённый запятыми набор одиночных портов и диапазонов, например `"20000,20002-20100"`. Хорошо сочетается с `hop-interval`.
hop-intervalstring30<seconds string> | <duration>Интервал между перескоками портов. Числовая строка (`"30"`) трактуется как секунды; также принимается длительность в стиле Go (`"30s"`). Минимум — 5 (`adapter/outbound/hysteria2.go:25`).
upstring(unset)<bandwidth>Пропускная способность исходящего канала. Строка с единицей измерения, например `"100 Mbps"`, `"500 kbps"`, `"1 Gbps"`.
downstring(unset)<bandwidth>Пропускная способность входящего канала, тот же формат.
passwordstring(unset)<string>Пароль аутентификации пользователя. Необязателен, только если сервер допускает неаутентифицированных клиентов.
obfsstring(disabled)salamanderТип обфускации. Сейчас осмысленно только значение `salamander`.
obfs-passwordstring(unset)<string>Пароль обфускации, отдельный от пароля пользователя.
obfs-min-packet-sizeint0<bytes>Минимальный размер случайного дополнения для обфускации Salamander. Имеет смысл только при `obfs: salamander`.
obfs-max-packet-sizeint0<bytes>Максимальный размер случайного дополнения для обфускации Salamander.
snistring(server)<SNI>TLS Server Name Indication (SNI). По умолчанию — значение `server`.
ech-optsECHOptions(disabled)ECHOptionsКонфигурация Encrypted Client Hello.
skip-cert-verifyboolfalsetrue | falseОтключить проверку TLS (только для тестов).
name-cert-verifystring(unset)<hostname>Проверять сертификат сервера по этому имени хоста вместо SNI.
fingerprintstring(unset)<SHA256 hex>Зафиксировать отпечаток TLS-сертификата сервера.
certificatestring(unset)<PEM file path>Клиентский сертификат (mTLS).
private-keystring(unset)<key file path>Закрытый ключ для `certificate`.
alpn[]string[h3]h3Список ALPN. Hysteria2 обычно использует `h3`.
cwndint0<int>Переопределение начального окна перегрузки QUIC.
bbr-profilestring(unset)default | aggressiveПрофиль настройки встроенного варианта Brutal/BBR.
udp-mtuint1200<bytes>MTU для фрагментации UDP-полезной нагрузки внутри QUIC-датаграммы.
realm-optsHysteria2RealmOption(disabled)Hysteria2RealmOptionПодключение через Hysteria2 *realm* — мультиарендный сервер, доступный через управляющую конечную точку. См. таблицу realm-opts ниже.
initial-stream-receive-windowuint640 (quic-go default)<bytes>Начальное окно управления потоком для каждого потока (stream).
max-stream-receive-windowuint640 (quic-go default)<bytes>Максимальное окно управления потоком для каждого потока.
initial-connection-receive-windowuint640 (quic-go default)<bytes>Начальное окно управления потоком для всего соединения.
max-connection-receive-windowuint640 (quic-go default)<bytes>Максимальное окно управления потоком для всего соединения.

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

Входящий

Запись в listeners: с type: hysteria2. Встраивает BaseOption (listen, port).

ПолеТипПо умолчаниюДопустимые значенияОписание
usersmap[string]string{}{<username>: <password>}Таблица пользователей — отображение имени пользователя в пароль. Пустая таблица допускает неаутентифицированных клиентов.
obfsstring(disabled)salamanderТип обфускации Salamander.
obfs-passwordstring(unset)<string>Пароль обфускации.
obfs-min-packet-sizeint0<bytes>Минимальный размер случайного дополнения для обфускации Salamander. Имеет смысл только при `obfs: salamander`.
obfs-max-packet-sizeint0<bytes>Максимальный размер случайного дополнения для обфускации Salamander.
certificatestring(required)<PEM file path>TLS-сертификат сервера. Обязателен для входящего.
private-keystring(required)<key file path>Закрытый TLS-ключ.
client-auth-typestring(none)no-client-cert | request-client-cert | require-any-client-cert | verify-client-cert-if-given | require-and-verify-client-certРежим клиентской аутентификации mTLS.
client-auth-certstring(unset)<PEM file path>Набор CA-сертификатов, принимаемых как корневые для клиентов.
ech-keystring(unset)<ECH config>Ключевой материал Encrypted Client Hello.
max-idle-timeint0<seconds>Тайм-аут простоя на стороне слушателя. 0 оставляет значение QUIC по умолчанию.
alpn[]string[h3]h3Список ALPN, предлагаемый при TLS-рукопожатии.
upstring(unset)<bandwidth>Пропускная способность исходящего канала (строка с единицей измерения).
downstring(unset)<bandwidth>Пропускная способность входящего канала.
ignore-client-bandwidthboolfalsetrue | falseИгнорировать заявленную клиентом пропускную способность и навязывать настройки сервера.
masqueradestring(unset)<URL>Цель маскировки — строка-URL (`file:///path` или `https://upstream/`).
cwndint0<int>Начальное окно перегрузки QUIC.
bbr-profilestring(unset)default | aggressiveПрофиль настройки Brutal/BBR.
udp-mtuint1200<bytes>MTU фрагментации UDP-датаграмм.
mux-optionMuxOption(disabled)MuxOptionНастройки мультиплексирования в стиле sing.
realm-optsHysteria2RealmOption(disabled)Hysteria2RealmOptionПодключение через Hysteria2 *realm* — мультиарендный сервер, доступный через управляющую конечную точку. См. таблицу realm-opts ниже.
initial-stream-receive-windowuint640 (quic-go default)<bytes>Начальное окно потока (per-stream).
max-stream-receive-windowuint640 (quic-go default)<bytes>Максимальное окно потока (per-stream).
initial-connection-receive-windowuint640 (quic-go default)<bytes>Начальное окно соединения.
max-connection-receive-windowuint640 (quic-go default)<bytes>Максимальное окно соединения.

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

realm-opts

Блоки realm-opts исходящего и входящего имеют одинаковую форму. В исходящем они направляют прокси на Hysteria2 realm — арендатора на мульти-realm-сервере — через управляющую конечную точку, которая возвращает фактические данные подключения. Режим realm — новая продвинутая возможность; оставьте его отключённым, если вы не подключаетесь к realm-серверу.

ПолеТипПо умолчаниюДопустимые значенияОписание
enableboolfalsetrue | falseВключить режим realm для этого прокси.
server-urlstring(unset)<URL>URL управляющего сервера realm, у которого запрашиваются данные для подключения к realm.
tokenstring(unset)<string>Токен аутентификации, предъявляемый управляющему серверу realm.
realm-idstring(unset)<string>Идентификатор realm, к которому нужно присоединиться.
stun-servers[]string(unset)<host:port list>STUN-серверы для обхода NAT в режиме realm.
snistring(unset)<SNI>TLS SNI для соединения с управляющим сервером.
skip-cert-verifyboolfalsetrue | falseПропустить проверку TLS при подключении к управляющему серверу (только для тестов).
name-cert-verifystring(unset)<hostname>Проверять сертификат сервера по этому имени хоста вместо SNI.
fingerprintstring(unset)<SHA256 hex>Зафиксировать отпечаток TLS-сертификата управляющего сервера.
certificatestring(unset)<PEM file path>Клиентский сертификат (mTLS) для управляющего сервера.
private-keystring(unset)<key file path>Закрытый ключ для `certificate`.
alpn[]string(unset)<string list>ALPN для соединения с управляющим сервером.

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

Примеры

Исходящее — один порт, обфускация salamander, 100/300 Mbps:

yaml
proxies:
  - name: hy2-plain
    type: hysteria2
    server: example.com
    port: 443
    password: <password>
    obfs: salamander
    obfs-password: <obfs>
    sni: example.com
    up: 100 Mbps
    down: 300 Mbps
    alpn: [h3]

Исходящее — перескок портов в диапазоне 20000-20100:

yaml
proxies:
  - name: hy2-hop
    type: hysteria2
    server: example.com
    ports: 20000-20100
    hop-interval: 30s
    password: <password>
    obfs: salamander
    obfs-password: <obfs>
    sni: example.com
    up: 200 Mbps
    down: 1 Gbps
    alpn: [h3]

Исходящее, подключающееся к realm через управляющий сервер:

yaml
proxies:
  - name: hy2-realm
    type: hysteria2
    server: example.com
    port: 443
    password: <password>
    sni: example.com
    alpn: [h3]
    realm-opts:
      enable: true
      server-url: https://realm.example.com/control
      token: <realm-token>
      realm-id: team-a
      stun-servers:
        - stun.example.com:3478

Входящее с двумя пользователями и маскировкой файлами по HTTP:

yaml
listeners:
  - name: hy2-in
    type: hysteria2
    listen: 0.0.0.0
    port: 443
    users:
      alice: <alice-password>
      bob: <bob-password>
    obfs: salamander
    obfs-password: <obfs>
    certificate: /etc/mihomo/server.crt
    private-key: /etc/mihomo/server.key
    up: 500 Mbps
    down: 1 Gbps
    masquerade: file:///var/www
    alpn: [h3]

Примечания

  • ports принимает набор одиночных портов и диапазонов через запятую, например "20000,20002-20100,30000". port и ports взаимоисключающие — выберите что-то одно. Когда задан ports, mihomo каждые hop-interval подключается к новому случайно выбранному порту из списка.
  • Минимум hop-interval5 секунд (adapter/outbound/hysteria2.go:25) — значения меньше 5 поднимаются до минимума.
  • Значения пропускной способности принимают суффиксы единиц (b, kbps, Mbps, Gbps, Tbps) с пробелом между числом и единицей — "100 Mbps". Строки разбираются вспомогательной функцией mihomo tools.StringToBps.
  • obfs-min-packet-size и obfs-max-packet-size действуют только при obfs: salamander. Они задают границы случайного дополнения для обфускатора Salamander; при любом другом (или отсутствующем) obfs они игнорируются.
  • Входящее поле users в mihomo — YAML-отображение, а не список объектов. Ключ — имя пользователя, значение — пароль, например users: { alice: pw1, bob: pw2 }. Чтобы разрешить анонимных клиентов, оставьте отображение пустым.
  • Четыре поля *-receive-window — прямые настройки встроенного стека quic-go. Большинству пользователей стоит оставить их равными 0 (по умолчанию). Увеличивайте окна уровня соединения, чтобы поднять пропускную способность на каналах с большим BDP.

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

  • Xray-core разносит конфигурацию между settings (версия / клиенты) и streamSettings.hysteriaSettings (аутентификация / полоса / маскировка). См. Hysteria2 — Xray-core.
  • sing-box держит конфигурацию в одном блоке, но задаёт полосу целым числом в Мбит/с (без суффикса единицы) и допускает полиморфное значение masquerade (строка-URL или типизированный объект). См. Hysteria2 — sing-box.
  • mihomo может также сам размещать realm — см. слушатель Hysteria2 realm.

Исходный код: adapter/outbound/hysteria2.go:39-89 · v1.19.29 (e26714a)

Core Tutorial от Argsment