Hysteria2 — mihomo
mihomo поддерживает Hysteria2 с обеих сторон. Исходящее подключение несёт явные поля перескока портов (port-hopping) и обширный набор настроек управления потоком quic-go. Таблица пользователей входящего — плоское отображение: одна пара «имя пользователя / пароль» на запись.
Исходящий
Запись в proxies: с type: hysteria2. Встраивает BasicOption (общие поля исходящих: interface-name, routing-mark, …).
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя прокси. |
server | string | (required) | <host> | Имя хоста или IP вышестоящего сервера. |
port | int | (unset) | <port> | Одиночный порт сервера. Опустите, когда задан `ports`. |
ports | string | (unset) | <port-list> | Список для перескока портов (port-hopping). Принимает разделённый запятыми набор одиночных портов и диапазонов, например `"20000,20002-20100"`. Хорошо сочетается с `hop-interval`. |
hop-interval | string | 30 | <seconds string> | <duration> | Интервал между перескоками портов. Числовая строка (`"30"`) трактуется как секунды; также принимается длительность в стиле Go (`"30s"`). Минимум — 5 (`adapter/outbound/hysteria2.go:25`). |
up | string | (unset) | <bandwidth> | Пропускная способность исходящего канала. Строка с единицей измерения, например `"100 Mbps"`, `"500 kbps"`, `"1 Gbps"`. |
down | string | (unset) | <bandwidth> | Пропускная способность входящего канала, тот же формат. |
password | string | (unset) | <string> | Пароль аутентификации пользователя. Необязателен, только если сервер допускает неаутентифицированных клиентов. |
obfs | string | (disabled) | salamander | Тип обфускации. Сейчас осмысленно только значение `salamander`. |
obfs-password | string | (unset) | <string> | Пароль обфускации, отдельный от пароля пользователя. |
obfs-min-packet-size | int | 0 | <bytes> | Минимальный размер случайного дополнения для обфускации Salamander. Имеет смысл только при `obfs: salamander`. |
obfs-max-packet-size | int | 0 | <bytes> | Максимальный размер случайного дополнения для обфускации Salamander. |
sni | string | (server) | <SNI> | TLS Server Name Indication (SNI). По умолчанию — значение `server`. |
ech-opts | ECHOptions | (disabled) | ECHOptions | Конфигурация Encrypted Client Hello. |
skip-cert-verify | bool | false | true | false | Отключить проверку TLS (только для тестов). |
name-cert-verify | string | (unset) | <hostname> | Проверять сертификат сервера по этому имени хоста вместо SNI. |
fingerprint | string | (unset) | <SHA256 hex> | Зафиксировать отпечаток TLS-сертификата сервера. |
certificate | string | (unset) | <PEM file path> | Клиентский сертификат (mTLS). |
private-key | string | (unset) | <key file path> | Закрытый ключ для `certificate`. |
alpn | []string | [h3] | h3 | Список ALPN. Hysteria2 обычно использует `h3`. |
cwnd | int | 0 | <int> | Переопределение начального окна перегрузки QUIC. |
bbr-profile | string | (unset) | default | aggressive | Профиль настройки встроенного варианта Brutal/BBR. |
udp-mtu | int | 1200 | <bytes> | MTU для фрагментации UDP-полезной нагрузки внутри QUIC-датаграммы. |
realm-opts | Hysteria2RealmOption | (disabled) | Hysteria2RealmOption | Подключение через Hysteria2 *realm* — мультиарендный сервер, доступный через управляющую конечную точку. См. таблицу realm-opts ниже. |
initial-stream-receive-window | uint64 | 0 (quic-go default) | <bytes> | Начальное окно управления потоком для каждого потока (stream). |
max-stream-receive-window | uint64 | 0 (quic-go default) | <bytes> | Максимальное окно управления потоком для каждого потока. |
initial-connection-receive-window | uint64 | 0 (quic-go default) | <bytes> | Начальное окно управления потоком для всего соединения. |
max-connection-receive-window | uint64 | 0 (quic-go default) | <bytes> | Максимальное окно управления потоком для всего соединения. |
Исходный код: adapter/outbound/hysteria2.go:39-72 · зафиксировано на v1.19.29 (e26714a)
Входящий
Запись в listeners: с type: hysteria2. Встраивает BaseOption (listen, port).
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
users | map[string]string | {} | {<username>: <password>} | Таблица пользователей — отображение имени пользователя в пароль. Пустая таблица допускает неаутентифицированных клиентов. |
obfs | string | (disabled) | salamander | Тип обфускации Salamander. |
obfs-password | string | (unset) | <string> | Пароль обфускации. |
obfs-min-packet-size | int | 0 | <bytes> | Минимальный размер случайного дополнения для обфускации Salamander. Имеет смысл только при `obfs: salamander`. |
obfs-max-packet-size | int | 0 | <bytes> | Максимальный размер случайного дополнения для обфускации Salamander. |
certificate | string | (required) | <PEM file path> | TLS-сертификат сервера. Обязателен для входящего. |
private-key | string | (required) | <key file path> | Закрытый TLS-ключ. |
client-auth-type | string | (none) | no-client-cert | request-client-cert | require-any-client-cert | verify-client-cert-if-given | require-and-verify-client-cert | Режим клиентской аутентификации mTLS. |
client-auth-cert | string | (unset) | <PEM file path> | Набор CA-сертификатов, принимаемых как корневые для клиентов. |
ech-key | string | (unset) | <ECH config> | Ключевой материал Encrypted Client Hello. |
max-idle-time | int | 0 | <seconds> | Тайм-аут простоя на стороне слушателя. 0 оставляет значение QUIC по умолчанию. |
alpn | []string | [h3] | h3 | Список ALPN, предлагаемый при TLS-рукопожатии. |
up | string | (unset) | <bandwidth> | Пропускная способность исходящего канала (строка с единицей измерения). |
down | string | (unset) | <bandwidth> | Пропускная способность входящего канала. |
ignore-client-bandwidth | bool | false | true | false | Игнорировать заявленную клиентом пропускную способность и навязывать настройки сервера. |
masquerade | string | (unset) | <URL> | Цель маскировки — строка-URL (`file:///path` или `https://upstream/`). |
cwnd | int | 0 | <int> | Начальное окно перегрузки QUIC. |
bbr-profile | string | (unset) | default | aggressive | Профиль настройки Brutal/BBR. |
udp-mtu | int | 1200 | <bytes> | MTU фрагментации UDP-датаграмм. |
mux-option | MuxOption | (disabled) | MuxOption | Настройки мультиплексирования в стиле sing. |
realm-opts | Hysteria2RealmOption | (disabled) | Hysteria2RealmOption | Подключение через Hysteria2 *realm* — мультиарендный сервер, доступный через управляющую конечную точку. См. таблицу realm-opts ниже. |
initial-stream-receive-window | uint64 | 0 (quic-go default) | <bytes> | Начальное окно потока (per-stream). |
max-stream-receive-window | uint64 | 0 (quic-go default) | <bytes> | Максимальное окно потока (per-stream). |
initial-connection-receive-window | uint64 | 0 (quic-go default) | <bytes> | Начальное окно соединения. |
max-connection-receive-window | uint64 | 0 (quic-go default) | <bytes> | Максимальное окно соединения. |
Исходный код: listener/inbound/hysteria2.go:12-42 · зафиксировано на v1.19.29 (e26714a)
realm-opts
Блоки realm-opts исходящего и входящего имеют одинаковую форму. В исходящем они направляют прокси на Hysteria2 realm — арендатора на мульти-realm-сервере — через управляющую конечную точку, которая возвращает фактические данные подключения. Режим realm — новая продвинутая возможность; оставьте его отключённым, если вы не подключаетесь к realm-серверу.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
enable | bool | false | true | false | Включить режим realm для этого прокси. |
server-url | string | (unset) | <URL> | URL управляющего сервера realm, у которого запрашиваются данные для подключения к realm. |
token | string | (unset) | <string> | Токен аутентификации, предъявляемый управляющему серверу realm. |
realm-id | string | (unset) | <string> | Идентификатор realm, к которому нужно присоединиться. |
stun-servers | []string | (unset) | <host:port list> | STUN-серверы для обхода NAT в режиме realm. |
sni | string | (unset) | <SNI> | TLS SNI для соединения с управляющим сервером. |
skip-cert-verify | bool | false | true | false | Пропустить проверку TLS при подключении к управляющему серверу (только для тестов). |
name-cert-verify | string | (unset) | <hostname> | Проверять сертификат сервера по этому имени хоста вместо SNI. |
fingerprint | string | (unset) | <SHA256 hex> | Зафиксировать отпечаток TLS-сертификата управляющего сервера. |
certificate | string | (unset) | <PEM file path> | Клиентский сертификат (mTLS) для управляющего сервера. |
private-key | string | (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:
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:
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 через управляющий сервер:
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:
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-interval— 5 секунд (adapter/outbound/hysteria2.go:25) — значения меньше 5 поднимаются до минимума. - Значения пропускной способности принимают суффиксы единиц (
b,kbps,Mbps,Gbps,Tbps) с пробелом между числом и единицей —"100 Mbps". Строки разбираются вспомогательной функцией mihomotools.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)
