Hysteria2 — Xray-core
Xray-core поддерживает Hysteria v2, но разбивает конфигурацию на два блока: протокольный settings (версия, адрес/порт, пользователи) и транспортный streamSettings.hysteriaSettings (аутентификация, полоса пропускания, скачки портов, маскировка). Чтобы исходящий был работоспособен, заполнить нужно оба.
Исходящий — протокольный уровень
settings для исходящего с "protocol": "hysteria":
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
version | int32 | (required) | 2 | Должно быть ровно 2. Любое другое значение отклоняется при запуске (`infra/conf/hysteria.go:19-21`). |
address | *Address | (required) | <host> | Имя хоста или IP сервера. |
port | uint16 | (required) | <port> | UDP-порт сервера. |
Исходный код: infra/conf/hysteria.go:13-17 · зафиксировано на v26.7.28 (5ca6f4b)
Hysteria v1 не поддерживается
Поле version обязано равняться 2. HysteriaClientConfig.Build (infra/conf/hysteria.go:19-21) возвращает errors.New("version != 2") для любого другого значения.
Входящий — протокольный уровень
settings для входящего с "protocol": "hysteria":
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
version | int32 | (required) | 2 | Должно быть 2. |
users | []*HysteriaUserConfig | [] | [HysteriaUserConfig] | Принимаемые пользователи. `users` — более новое имя, принимаемое наряду с `clients`. |
clients | []*HysteriaUserConfig | [] | [HysteriaUserConfig] | Принимаемые пользователи (старое имя; та же форма, что у `users`). |
Исходный код: infra/conf/hysteria.go:39-43 · зафиксировано на v26.7.28 (5ca6f4b)
clients[]
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
auth | string | (required) | <string> | Строка аутентификации. |
level | uint32 | 0 | <uint32> | Уровень политики для этого пользователя. |
email | string | (unset) | <string> | Метка в статистике / журналах. |
Исходный код: infra/conf/hysteria.go:33-37 · зафиксировано на v26.7.28 (5ca6f4b)
Транспортный уровень — hysteriaSettings
Задаётся в streamSettings.hysteriaSettings. Несёт все эксплуатационные настройки, которых нет на протокольном уровне.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
version | int32 | (required) | 2 | Версия протокола Hysteria. Должна совпадать с `version` в `settings`. |
auth | string | (required on outbound) | <string> | Строка аутентификации исходящего. На входящем это поле передаётся валидатору, но аутентификация пользователей задаётся в `settings.clients[].auth`. |
congestion | *string | (unset) | bbr | cubic | reno | Серверная подсказка алгоритма управления перегрузкой. Новые сборки переносят её в параметры QUIC — при установке здесь печатается предупреждение. |
up | *Bandwidth | (unset) | <bandwidth> | Оценка полосы отдачи (строка с единицей: `1Mbps`, `100kbps`, `50mbps`). |
down | *Bandwidth | (unset) | <bandwidth> | Оценка полосы приёма. |
udphop | *UdpHop | (unset) | UdpHop | Конфигурация скачков UDP-портов для исходящего. |
udpIdleTimeout | int64 | 60 | <2..600 seconds> | Секунды простоя UDP-потока до закрытия QUIC-потока. Должно быть от 2 до 600 включительно (`infra/conf/transport_method.go:783-785`). |
masquerade | Masquerade | (unset) | Masquerade | Только для входящего: маскировка HTTP-ответом для неаутентифицированного трафика. |
Исходный код: infra/conf/transport_method.go:761-772 · зафиксировано на v26.7.28 (5ca6f4b)
udphop
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
ports | PortList | (required) | <JSON array or string> | Список портов для скачков. Принимает JSON-массивы портов/диапазонов или строку вида `"100,200-210,400"`. |
interval | Int32Range | (unset) | Int32Range | Диапазон (`{From, To}`), задающий частоту смены портов, в секундах. |
Исходный код: infra/conf/transport_method.go:742-745 · зафиксировано на v26.7.28 (5ca6f4b)
masquerade
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
type | string | (required) | file | proxy | string | Выбирает, какой под-блок применяется. |
dir | string | (file only) | <dir path> | Каталог, отдаваемый при `type: file`. |
url | string | (proxy only) | <URL> | Вышестоящий URL при `type: proxy`. |
rewriteHost | bool | false | true | false | Переписывать заголовок Host при проксировании (`type: proxy`). |
insecure | bool | false | true | false | Пропустить проверку TLS у вышестоящего при `type: proxy`. |
content | string | (string only) | <text> | Тело, возвращаемое при `type: string`. |
headers | map[string]string | {} | {<header>: <value>} | Дополнительные заголовки ответа при `type: string`. |
statusCode | int32 | 200 | <int> | Код статуса, возвращаемый при `type: string`. |
Исходный код: infra/conf/transport_method.go:747-759 · зафиксировано на v26.7.28 (5ca6f4b)
Поле type переключает активный под-блок: file использует dir, proxy — url/rewriteHost/insecure, string — content/headers/statusCode.
Синтаксис полосы пропускания
up и down разбираются вспомогательной функцией в infra/conf/transport_method.go:701-739. Принимаемые суффиксы:
| Суффикс | Множитель |
|---|---|
(пусто), b, bps | 1 |
k, kb, kbps | 1024 |
m, mb, mbps | 1 048 576 |
g, gb, gbps | 1 073 741 824 |
t, tb, tbps | 1 099 511 627 776 |
Числовая часть разбирается как float64, результат делится на 8 (в protobuf передаются байты в секунду, но единица в источнике названа bps).
Примеры
Исходящий:
{
"outbounds": [
{
"tag": "hy2-out",
"protocol": "hysteria",
"settings": {
"version": 2,
"address": "example.com",
"port": 443
},
"streamSettings": {
"network": "hysteria",
"security": "tls",
"tlsSettings": { "serverName": "example.com" },
"hysteriaSettings": {
"version": 2,
"auth": "<password>",
"up": "100mbps",
"down": "300mbps",
"udpIdleTimeout": 120
}
}
}
]
}Входящий с двумя пользователями и файловой HTTP-маскировкой:
{
"inbounds": [
{
"tag": "hy2-in",
"listen": "0.0.0.0",
"port": 443,
"protocol": "hysteria",
"settings": {
"version": 2,
"clients": [
{ "auth": "<alice>", "email": "alice" },
{ "auth": "<bob>", "email": "bob" }
]
},
"streamSettings": {
"network": "hysteria",
"security": "tls",
"tlsSettings": { "certificates": [{ "certificateFile": "/etc/ssl/cert.pem", "keyFile": "/etc/ssl/key.pem" }] },
"hysteriaSettings": {
"version": 2,
"masquerade": {
"type": "file",
"dir": "/var/www"
}
}
}
}
]
}Примечания
- Частая ошибка: задать
authтолько внутриsettings(как если бы это было поле имени пользователя/пароля). Xray читает аутентификацию исходящего изstreamSettings.hysteriaSettings.auth. Пользователи входящего задаются вsettings.clients[].auth(для каждого пользователя), а транспортныйauthпри сопоставлении игнорируется. congestion,up,downиudphopв будущем релизе переедут в новые блокиfinalmask/quicParams. Если они заданы в старом месте, печатается предупреждение (infra/conf/transport_method.go:779-781).- Hysteria v1 полностью удалена из Xray-core. Имя «v1» в исходном коде теперь лишь историческая метка —
version != 2означает жёсткий отказ. udpIdleTimeout < 2или> 600вызывает ошибку при запуске (infra/conf/transport_method.go:783-785).
Сравнение с другими ядрами
- sing-box использует единый, гораздо более плоский блок — без транспортного разделения. Полоса задаётся простым
intв Мбит/с (без строки с единицей), а маскировка поддерживает полиморфную форму (строка-URL или типизированный объект). См. Hysteria2 — sing-box. - mihomo тоже одноблочный; скачки портов задаются через
ports(синтаксис диапазонов) плюсhop-interval. mihomo принимает строки с суффиксами единиц дляup/down, как Xray. См. Hysteria2 — mihomo.
Исходный код: infra/conf/hysteria.go:13-43 · v26.7.28 (5ca6f4b)
