Skip to content

HTTP & SOCKS — sing-box

sing-box объединяет HTTP, SOCKS и комбинированный входящий «mixed» (HTTP+SOCKS на одном порту) в одном исходном файле. Исходящий HTTP может опционально оборачивать поток CONNECT в TLS, а исходящий SOCKS поддерживает v4, v4a и v5 с необязательным кадрированием udp_over_tcp.

SOCKS

Входящий

type: "socks":

ПолеТипПо умолчаниюДопустимые значенияОписание
users[]auth.User[][{username, password}]Список пользователей. Пустой список отключает аутентификацию.
domain_resolver*DomainResolveOptions(default)DomainResolveOptionsПереопределяет, как разрешаются имена хостов назначения для этого входящего.

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

Структура также встраивает ListenOptions (адрес прослушивания, порт, сниффинг, …).

Исходящий

type: "socks":

ПолеТипПо умолчаниюДопустимые значенияОписание
versionstring54 | 4a | 5Версия протокола SOCKS. v4 — голый SOCKS4; v4a добавляет удалённое разрешение имён хостов; v5 — современное значение по умолчанию.
usernamestring(unset)<string>Имя пользователя для аутентификации на вышестоящем прокси (только v5).
passwordstring(unset)<string>Пароль для аутентификации на вышестоящем прокси.
networkNetworkList(tcp+udp)tcp | udp | Ограничение только TCP или только UDP.
udp_over_tcp*UDPOverTCPOptions(disabled)UDPOverTCPOptionsОборачивает UDP-пакеты внутри управляющего TCP-канала. Полезно, когда вышестоящий прокси не поддерживает UDP-associate.

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

Встраивает DialerOptions и ServerOptions (server, server_port).

HTTP / Mixed

Типы входящих http и mixed используют одну Go-структуру (HTTPMixedInboundOptions). Когда поле type равно mixed, входящий принимает и запросы HTTP CONNECT, и рукопожатия SOCKS5 на одном порту — первый байт клиентского запроса определяет, какой протокол используется.

Входящий (type: "http" или type: "mixed")

ПолеТипПо умолчаниюДопустимые значенияОписание
users[]auth.User[][{username, password}]Список пользователей.
domain_resolver*DomainResolveOptions(default)DomainResolveOptionsПереопределение резолвера доменов для конкретного входящего.
set_system_proxyboolfalsetrue | falseЕсли true, при запуске sing-box настраивает системный прокси операционной системы на этот слушатель. При остановке настройка возвращается обратно.

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

Встраивает ListenOptions и InboundTLSOptionsContainer (входящий может обслуживать HTTP поверх TLS — современный HTTPS-прокси в стиле Squid).

Исходящий

type: "http":

ПолеТипПо умолчаниюДопустимые значенияОписание
usernamestring(unset)<string>Имя пользователя для аутентификации на вышестоящем прокси.
passwordstring(unset)<string>Пароль для аутентификации на вышестоящем прокси.
pathstring(unset)/<path>Префикс пути, добавляемый к строке запроса CONNECT. Пустое значение использует ожидаемое апстримом значение по умолчанию.
headersbadoption.HTTPHeader{}{<header>: <value or list>}Дополнительные HTTP-заголовки, добавляемые к каждому запросу CONNECT.

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

Встраивает DialerOptions, ServerOptions и OutboundTLSOptionsContainer (tls превращает это в исходящий к HTTPS-прокси).

Примеры

Входящий mixed с одним пользователем:

json
{
  "inbounds": [
    {
      "type": "mixed",
      "tag": "mixed-in",
      "listen": "127.0.0.1",
      "listen_port": 7890,
      "users": [
        { "username": "alice", "password": "<password>" }
      ]
    }
  ]
}

Входящий HTTPS-прокси (HTTP поверх TLS):

json
{
  "inbounds": [
    {
      "type": "http",
      "tag": "https-proxy-in",
      "listen": "0.0.0.0",
      "listen_port": 8443,
      "users": [{ "username": "alice", "password": "<password>" }],
      "tls": {
        "enabled": true,
        "certificate_path": "/etc/ssl/cert.pem",
        "key_path": "/etc/ssl/key.pem"
      }
    }
  ]
}

Исходящий SOCKS5 с UoT:

json
{
  "outbounds": [
    {
      "type": "socks",
      "tag": "via-socks",
      "server": "upstream.example.com",
      "server_port": 1080,
      "version": "5",
      "username": "alice",
      "password": "<password>",
      "udp_over_tcp": { "enabled": true, "version": 2 }
    }
  ]
}

Примечания

  • Определение протокола по первому байту у входящего mixed означает, что некорректный клиент, не говорящий ни на HTTP, ни на SOCKS, будет немедленно отключён, а не заблокирует слушатель.
  • set_system_proxy работает только на платформах, где у sing-box есть API системного прокси (Windows, macOS, GNOME). На других системах он молча игнорируется.
  • version: "4a" — единственный способ передавать имена хостов SOCKS4-серверу (обычный SOCKS4 переносит только IPv4-адреса назначения).
  • Поле path у исходящего HTTP существует потому, что некоторые вышестоящие CONNECT-прокси требуют явный префикс пути (PUT /forward HTTP/1.1) для маршрутизации — большинству он не нужен, и тогда поле оставляют пустым.

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

  • Xray-core держит HTTP и SOCKS в отдельных файлах, использует accounts[] (а не users[]) и user/pass (а не username/password), а входящего «mixed» у него нет — запускайте два отдельных входящих на разных портах. См. HTTP & SOCKS — Xray-core.
  • mihomo делит входящие на три типа слушателей (http, socks, mixed) и использует имена полей в kebab-case (skip-cert-verify и т. п.). См. HTTP & SOCKS — mihomo.

Исходный код: option/simple.go:8-40 · v1.13.15 (3708fa1)

Core Tutorial от Argsment