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:79-84 · зафиксировано на v1.13.15 (3708fa1)

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-соединение после такого периода тишины. 0 отключает.
ping_timeoutbadoption.Duration0<duration>Тайм-аут ответа на пробный HTTP/2 PING. 0 отключает PING.

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

HTTP-транспорт по умолчанию работает поверх HTTP/2. С tls.alpn: ["h3"] в объемлющем TLS-блоке транспорт использует 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:88-94 · зафиксировано на v1.13.15 (3708fa1)

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:96-100 · зафиксировано на v1.13.15 (3708fa1)

Примеры

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/3 (HTTP-транспорт поверх h3):

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

Примечания

  • sing-box не содержит отдельного транспорта SplitHTTP / XHTTP. Ближайший эквивалент — type: "http" поверх HTTP/3 (задайте tls.alpn: ["h3"]), дающий большинство тех же свойств против DPI.
  • idle_timeout: 0 и ping_timeout: 0 вместе полностью отключают keepalive-пинги. Для долгоживущих соединений за 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:70-100 · v1.13.15 (3708fa1)

Core Tutorial от Argsment