Skip to content

Hysteria2 — Xray-core

Xray-core поддерживает Hysteria v2, но разбивает конфигурацию на два блока: протокольный settings (версия, адрес/порт, пользователи) и транспортный streamSettings.hysteriaSettings (аутентификация, полоса пропускания, скачки портов, маскировка). Чтобы исходящий был работоспособен, заполнить нужно оба.

Исходящий — протокольный уровень

settings для исходящего с "protocol": "hysteria":

ПолеТипПо умолчаниюДопустимые значенияОписание
versionint32(required)2Должно быть ровно 2. Любое другое значение отклоняется при запуске (`infra/conf/hysteria.go:19-21`).
address*Address(required)<host>Имя хоста или IP сервера.
portuint16(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":

ПолеТипПо умолчаниюДопустимые значенияОписание
versionint32(required)2Должно быть 2.
users[]*HysteriaUserConfig[][HysteriaUserConfig]Принимаемые пользователи. `users` — более новое имя, принимаемое наряду с `clients`.
clients[]*HysteriaUserConfig[][HysteriaUserConfig]Принимаемые пользователи (старое имя; та же форма, что у `users`).

Исходный код: infra/conf/hysteria.go:39-43 · зафиксировано на v26.7.28 (5ca6f4b)

clients[]

ПолеТипПо умолчаниюДопустимые значенияОписание
authstring(required)<string>Строка аутентификации.
leveluint320<uint32>Уровень политики для этого пользователя.
emailstring(unset)<string>Метка в статистике / журналах.

Исходный код: infra/conf/hysteria.go:33-37 · зафиксировано на v26.7.28 (5ca6f4b)

Транспортный уровень — hysteriaSettings

Задаётся в streamSettings.hysteriaSettings. Несёт все эксплуатационные настройки, которых нет на протокольном уровне.

ПолеТипПо умолчаниюДопустимые значенияОписание
versionint32(required)2Версия протокола Hysteria. Должна совпадать с `version` в `settings`.
authstring(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-портов для исходящего.
udpIdleTimeoutint6460<2..600 seconds>Секунды простоя UDP-потока до закрытия QUIC-потока. Должно быть от 2 до 600 включительно (`infra/conf/transport_method.go:783-785`).
masqueradeMasquerade(unset)MasqueradeТолько для входящего: маскировка HTTP-ответом для неаутентифицированного трафика.

Исходный код: infra/conf/transport_method.go:761-772 · зафиксировано на v26.7.28 (5ca6f4b)

udphop

ПолеТипПо умолчаниюДопустимые значенияОписание
portsPortList(required)<JSON array or string>Список портов для скачков. Принимает JSON-массивы портов/диапазонов или строку вида `"100,200-210,400"`.
intervalInt32Range(unset)Int32RangeДиапазон (`{From, To}`), задающий частоту смены портов, в секундах.

Исходный код: infra/conf/transport_method.go:742-745 · зафиксировано на v26.7.28 (5ca6f4b)

masquerade

ПолеТипПо умолчаниюДопустимые значенияОписание
typestring(required)file | proxy | stringВыбирает, какой под-блок применяется.
dirstring(file only)<dir path>Каталог, отдаваемый при `type: file`.
urlstring(proxy only)<URL>Вышестоящий URL при `type: proxy`.
rewriteHostboolfalsetrue | falseПереписывать заголовок Host при проксировании (`type: proxy`).
insecureboolfalsetrue | falseПропустить проверку TLS у вышестоящего при `type: proxy`.
contentstring(string only)<text>Тело, возвращаемое при `type: string`.
headersmap[string]string{}{<header>: <value>}Дополнительные заголовки ответа при `type: string`.
statusCodeint32200<int>Код статуса, возвращаемый при `type: string`.

Исходный код: infra/conf/transport_method.go:747-759 · зафиксировано на v26.7.28 (5ca6f4b)

Поле type переключает активный под-блок: file использует dir, proxyurl/rewriteHost/insecure, stringcontent/headers/statusCode.

Синтаксис полосы пропускания

up и down разбираются вспомогательной функцией в infra/conf/transport_method.go:701-739. Принимаемые суффиксы:

СуффиксМножитель
(пусто), b, bps1
k, kb, kbps1024
m, mb, mbps1 048 576
g, gb, gbps1 073 741 824
t, tb, tbps1 099 511 627 776

Числовая часть разбирается как float64, результат делится на 8 (в protobuf передаются байты в секунду, но единица в источнике названа bps).

Примеры

Исходящий:

json
{
  "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-маскировкой:

json
{
  "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)

Core Tutorial от Argsment