Skip to content

Транспорт — sing-box ​

Параметры транспорта sing-box располагаются в блоке transport, встроенном в каждый входящий и исходящий с поддержкой TLS. Блок полиморфный: поле type выбирает один из пяти вариантов транспорта, и применяется соответствующее подмножество полей.

json
"transport": { "type": "<ws|http|grpc|quic|httpupgrade>", ...variant fields }

type: "ws" ​

ПолеТипПо умолчаниюДопустимые значенияОписание
pathstring//<path>Путь WebSocket.
headersbadoption.HTTPHeader{}{<header>: <value or list>}Дополнительные заголовки запроса upgrade.
max_early_datauint320<bytes>Максимум байт ранних данных 0-RTT, буферизуемых до завершения WS-рукопожатия. 0 отключает.
early_data_header_namestringSec-WebSocket-Protocol<header name>HTTP-заголовок, несущий ранние данные в base64, когда сервер ожидает их под нестандартным именем.

Исходный код: option/v2ray_transport.go:94-99 · зафиксировано на v1.14.2 (af6e64c)

type: "http" (HTTP/2) ​

ПолеТипПо умолчаниюДопустимые значенияОписание
hostbadoption.Listable[string][][<hostname>]Список значений заголовка Host. Сервер использует список для сопоставления SNI; клиент выбирает одно случайно на каждый запрос.
pathstring//<path>HTTP-путь.
methodstringPUT<HTTP method>HTTP-метод. Стандартный транспорт использует PUT, чтобы препятствовать кэшированию.
headersbadoption.HTTPHeader{}{<header>: <value or list>}Дополнительные заголовки запроса.
idle_timeoutbadoption.Duration0<duration>Сервер: закрывать HTTP/2-клиентов, простаивающих столько времени (GOAWAY). Клиент: отправлять PING для проверки соединения, если за это время не получено ни одного кадра. 0 отключает оба механизма.
ping_timeoutbadoption.Duration15s<duration>HTTP/2-клиент: сколько ждать ответа на PING перед закрытием соединения. 0 означает умолчание 15s; PING отправляются, только если задан idle_timeout.

Исходный код: option/v2ray_transport.go:85-92 · зафиксировано на v1.14.2 (af6e64c)

При включённом объемлющем блоке TLS HTTP-транспорт использует HTTP/2; TLS не обязателен, и без него транспорт откатывается на обычный HTTP/1.1. Режима HTTP/3 нет.

type: "grpc" ​

ПолеТипПо умолчаниюДопустимые значенияОписание
service_namestring(required)<service path>Имя gRPC-сервиса.
idle_timeoutbadoption.Duration0<duration>Тайм-аут простоя. 0 отключает.
ping_timeoutbadoption.Duration0<duration>Тайм-аут keepalive-пингов. 0 отключает PING.
permit_without_streamboolfalsetrue | falseРазрешить PING без активного потока.

Исходный код: option/v2ray_transport.go:103-109 · зафиксировано на v1.14.2 (af6e64c)

type: "quic" ​

Структура QUIC-транспорта не имеет пользовательских полей — это просто { "type": "quic" }. Вся настройка QUIC происходит на уровне протокола (у Hysteria2 / TUIC собственные нативные QUIC-стеки).

type: "httpupgrade" ​

ПолеТипПо умолчаниюДопустимые значенияОписание
hoststring(server address)<hostname>Заголовок HTTP Host.
pathstring//<path>HTTP-путь.
headersbadoption.HTTPHeader{}{<header>: <value or list>}Дополнительные заголовки запроса.

Исходный код: option/v2ray_transport.go:111-115 · зафиксировано на v1.14.2 (af6e64c)

Примеры ​

WebSocket + TLS:

json
{
  "outbounds": [{
    "type": "vless",
    "server": "example.com",
    "server_port": 443,
    "uuid": "...",
    "tls": {
      "enabled": true,
      "server_name": "example.com"
    },
    "transport": {
      "type": "ws",
      "path": "/vl",
      "headers": { "Host": "example.com" }
    }
  }]
}

gRPC + REALITY:

json
{
  "outbounds": [{
    "type": "vless",
    "server": "example.com",
    "server_port": 443,
    "uuid": "...",
    "tls": {
      "enabled": true,
      "server_name": "www.cloudflare.com",
      "utls": { "enabled": true, "fingerprint": "chrome" },
      "reality": { "enabled": true, "public_key": "...", "short_id": "..." }
    },
    "transport": {
      "type": "grpc",
      "service_name": "GunService",
      "idle_timeout": "60s",
      "ping_timeout": "20s",
      "permit_without_stream": true
    }
  }]
}

HTTP/2 (HTTP-транспорт поверх TLS):

json
{
  "outbounds": [{
    "type": "vless",
    "server": "example.com",
    "server_port": 443,
    "uuid": "...",
    "tls": {
      "enabled": true,
      "server_name": "example.com",
      "alpn": ["h2"]
    },
    "transport": {
      "type": "http",
      "host": ["example.com"],
      "path": "/h2",
      "method": "PUT"
    }
  }]
}

Примечания ​

  • sing-box не содержит отдельного транспорта SplitHTTP / XHTTP. Ближайший эквивалент — type: "http" (HTTP/2 поверх TLS); режима HTTP/3 у HTTP-транспорта нет.
  • Keepalive-пинги управляются только idle_timeout: при 0 (по умолчанию) они не отправляются, а ping_timeout: 0 лишь означает умолчание 15s. Для долгоживущих соединений за NAT задайте idle_timeout вроде "30s", чтобы нижележащее TCP-соединение видело периодическую активность.
  • Поле host у type: "http" — это список. Сервер использует его для сопоставления SNI (подходит любое значение); клиент выбирает одно случайно на каждый запрос — полезно, когда вышестоящий балансировщик нагрузки маршрутизирует по заголовку Host.
  • early_data_header_name у WebSocket по умолчанию — Sec-WebSocket-Protocol, тот же заголовок, что и у V2Ray. Переопределяйте, только если вышестоящий прокси вырезает этот заголовок.

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

  • Xray-core использует streamSettings.network + блок *Settings для каждого транспорта, с вариантами TCP, mKCP и SplitHTTP/XHTTP, которых нет в sing-box. См. Транспорт — Xray-core.
  • mihomo распределяет настройки транспорта по блокам *-opts для каждого протокола в каждой записи прокси. См. Транспорт — mihomo.

Исходный код: option/v2ray_transport.go:85-115 · v1.14.2 (af6e64c)

Core Tutorial от Argsment