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":
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
version | string | 5 | 4 | 4a | 5 | Версия протокола SOCKS. v4 — голый SOCKS4; v4a добавляет удалённое разрешение имён хостов; v5 — современное значение по умолчанию. |
username | string | (unset) | <string> | Имя пользователя для аутентификации на вышестоящем прокси (только v5). |
password | string | (unset) | <string> | Пароль для аутентификации на вышестоящем прокси. |
network | NetworkList | (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_proxy | bool | false | true | false | Если true, при запуске sing-box настраивает системный прокси операционной системы на этот слушатель. При остановке настройка возвращается обратно. |
Исходный код: option/simple.go:14-20 · зафиксировано на v1.13.15 (3708fa1)
Встраивает ListenOptions и InboundTLSOptionsContainer (входящий может обслуживать HTTP поверх TLS — современный HTTPS-прокси в стиле Squid).
Исходящий
type: "http":
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
username | string | (unset) | <string> | Имя пользователя для аутентификации на вышестоящем прокси. |
password | string | (unset) | <string> | Пароль для аутентификации на вышестоящем прокси. |
path | string | (unset) | /<path> | Префикс пути, добавляемый к строке запроса CONNECT. Пустое значение использует ожидаемое апстримом значение по умолчанию. |
headers | badoption.HTTPHeader | {} | {<header>: <value or list>} | Дополнительные HTTP-заголовки, добавляемые к каждому запросу CONNECT. |
Исходный код: option/simple.go:32-40 · зафиксировано на v1.13.15 (3708fa1)
Встраивает DialerOptions, ServerOptions и OutboundTLSOptionsContainer (tls превращает это в исходящий к HTTPS-прокси).
Примеры
Входящий mixed с одним пользователем:
{
"inbounds": [
{
"type": "mixed",
"tag": "mixed-in",
"listen": "127.0.0.1",
"listen_port": 7890,
"users": [
{ "username": "alice", "password": "<password>" }
]
}
]
}Входящий HTTPS-прокси (HTTP поверх TLS):
{
"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:
{
"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)
