Skip to content

Hysteria2 — sing-box

Реализация Hysteria2 в sing-box — самая аккуратная из трёх ядер: один плоский блок с каждой стороны, полиморфная маскировка и явные поля перескока портов на исходящей стороне.

Входящий

Входящий type: "hysteria2":

ПолеТипПо умолчаниюДопустимые значенияОписание
up_mbpsint0<Mbps>Оценка пропускной способности исходящего канала в Мбит/с. Сервер использует её как подсказку для управления перегрузкой.
down_mbpsint0<Mbps>Оценка пропускной способности входящего канала в Мбит/с.
obfs*Hysteria2Obfs(disabled)Hysteria2ObfsБлок обфускации Salamander. Если задан, настройки обеих сторон должны совпадать.
users[]Hysteria2User[][Hysteria2User]Принимаемые пользователи.
ignore_client_bandwidthboolfalsetrue | falseИгнорировать заявленную клиентом пропускную способность и односторонне использовать настройки пропускной способности сервера.
masquerade*Hysteria2Masquerade(disabled)Hysteria2MasqueradeМаскировка HTTP-ответом для неаутентифицированного трафика. Принимает строку URL или типизированный объект.
brutal_debugboolfalsetrue | falseЖурналировать внутренности управления перегрузкой Brutal.

Исходный код: option/hysteria2.go:13-23 · зафиксировано на v1.13.15 (3708fa1)

Структура встраивает ListenOptions и InboundTLSOptionsContainer. Конфигурация TLS обязательна — Hysteria2 работает поверх QUIC, и режима без шифрования нет.

obfs

ПолеТипПо умолчаниюДопустимые значенияОписание
typestring(required)salamanderТип обфускации. Сейчас определён только `salamander`.
passwordstring(required)<string>Пароль обфускации (отдельный от пароля пользователя).

Исходный код: option/hysteria2.go:25-28 · зафиксировано на v1.13.15 (3708fa1)

users[]

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(unset)<string>Отображаемое имя, используемое в статистике и журналах.
passwordstring(required)<string>Пароль аутентификации пользователя.

Исходный код: option/hysteria2.go:30-33 · зафиксировано на v1.13.15 (3708fa1)

masquerade

Поле masquerade полиморфно (option/hysteria2.go:44-95):

  • Обычная строка URL. Схемы:
    • file:///var/www — эквивалент { "type": "file", "directory": "/var/www" }.
    • https://upstream.example.com — эквивалент { "type": "proxy", "url": "..." }.
  • Объект с полем type, выбирающим одну из трёх форм:
ПолеТипПо умолчаниюДопустимые значенияОписание
typestring(unset)file | proxy | stringВыбирает, какой из вложенных блоков активен.

Исходный код: option/hysteria2.go:35-40 · зафиксировано на v1.13.15 (3708fa1)

type: "file"

ПолеТипПо умолчаниюДопустимые значенияОписание
directorystring(required)<dir path>Локальный каталог, раздаваемый маскировочной конечной точкой.

Исходный код: option/hysteria2.go:97-99 · зафиксировано на v1.13.15 (3708fa1)

type: "proxy"

ПолеТипПо умолчаниюДопустимые значенияОписание
urlstring(required)<URL>Вышестоящий URL, на который маскировочная конечная точка выполняет обратное проксирование.
rewrite_hostboolfalsetrue | falseПереписывать заголовок Host в соответствии с вышестоящим URL.

Исходный код: option/hysteria2.go:101-104 · зафиксировано на v1.13.15 (3708fa1)

type: "string"

ПолеТипПо умолчаниюДопустимые значенияОписание
status_codeint200<int>Возвращаемый код состояния HTTP.
headersbadoption.HTTPHeader{}{<header>: <value>}Дополнительные заголовки ответа.
contentstring(required)<text>Тело ответа.

Исходный код: option/hysteria2.go:106-110 · зафиксировано на v1.13.15 (3708fa1)

Исходящий

Исходящий type: "hysteria2":

ПолеТипПо умолчаниюДопустимые значенияОписание
server_portsbadoption.Listable[string][]<range>Список для перескока портов. Каждый элемент — порт (например, `"20001"`) или диапазон через дефис (например, `"20001-20100"`).
hop_intervalbadoption.Duration30s<duration>Как часто переключаться на новый порт. Принимает длительности в стиле Go.
up_mbpsint0<Mbps>Оценка пропускной способности исходящего канала в Мбит/с.
down_mbpsint0<Mbps>Оценка пропускной способности входящего канала в Мбит/с.
obfs*Hysteria2Obfs(disabled)Hysteria2ObfsОбфускация Salamander; должна совпадать с настройками сервера.
passwordstring(required)<string>Пароль аутентификации пользователя.
networkNetworkList(tcp+udp)tcp | udp | Ограничение только TCP или только UDP.
brutal_debugboolfalsetrue | falseЖурналировать внутренности Brutal CC на стороне клиента.

Исходный код: option/hysteria2.go:112-124 · зафиксировано на v1.13.15 (3708fa1)

Встраивает DialerOptions, ServerOptions (server, server_port) и OutboundTLSOptionsContainer (tlsобязателен).

Примеры

Входящий без перескока портов (серверная сторона просто слушает один порт), с обфускацией Salamander и файловой маскировкой:

json
{
  "inbounds": [
    {
      "type": "hysteria2",
      "tag": "hy2-in",
      "listen": "::",
      "listen_port": 443,
      "users": [
        { "name": "alice", "password": "<password>" }
      ],
      "obfs": { "type": "salamander", "password": "<obfs>" },
      "tls": {
        "enabled": true,
        "alpn": ["h3"],
        "certificate_path": "/etc/ssl/cert.pem",
        "key_path": "/etc/ssl/key.pem"
      },
      "masquerade": "file:///var/www"
    }
  ]
}

Исходящий с перескоком портов (20000-20100, смена каждые 30 секунд):

json
{
  "outbounds": [
    {
      "type": "hysteria2",
      "tag": "hy2-out",
      "server": "example.com",
      "server_port": 443,
      "server_ports": ["20000-20100"],
      "hop_interval": "30s",
      "password": "<password>",
      "obfs": { "type": "salamander", "password": "<obfs>" },
      "up_mbps": 100,
      "down_mbps": 300,
      "tls": { "enabled": true, "server_name": "example.com" }
    }
  ]
}

Примечания

  • Значения пропускной способности здесь — обычные целые Мбит/с, без строк с единицами. Xray и mihomo принимают строки с суффиксами ("100mbps"), sing-box — нет.
  • У obfs.type сегодня определено только одно значение (salamander). Конфигурации без obfs используют путь без обфускации.
  • masquerade принимает как полиморфный типизированный объект, так и обычную строку URL — обе формы десериализуются в одно и то же внутреннее представление (option/hysteria2.go:59-78).
  • ignore_client_bandwidth: true — рекомендуемая настройка для серверов, чей администратор уже знает реальную пропускную способность: она не даёт злонамеренному клиенту занизить свою ёмкость, чтобы выжать из сервера больше.

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

  • Xray-core поддерживает Hysteria2, но делит конфигурацию между settings и streamSettings.hysteriaSettings. См. Hysteria2 — Xray-core.
  • mihomo использует исходящий одним блоком с up/down в виде строк (с суффиксами единиц, как в Xray). Перескок портов — это ports + hop-interval. Пользователи на входящей стороне — это map[string]string (имя пользователя → пароль), а не список объектов. См. Hysteria2 — mihomo.

Исходный код: option/hysteria2.go:13-124 · v1.13.15 (3708fa1)

Core Tutorial от Argsment