sing-box JSON: обязательные поля минимальной конфигурации
Полный разбор обязательных и минимальных полей JSON-конфигурации sing-box: от core и TUN до VLESS и маршрутизации. Пошаговая настройка и проверка.
Содержание
sing-box — универсальный прокси-ядро, которое поддерживает VLESS, Trojan, Shadowsocks и другие протоколы. При переходе с других инструментов часто возникает вопрос: какой минимальный набор полей JSON обязателен, чтобы конфигурация была валидной и работала? В этой статье разберём структуру минимальной конфигурации, объясним назначение каждого обязательного блока и покажем пошаговую настройку от сервера до клиента.
Что такое минимальная конфигурация sing-box?
Минимальная конфигурация — это JSON-файл, в котором отсутствуют все необязательные параметры, но при этом ядро стартует, принимает соединения и корректно маршрутизирует трафик. В зависимости от сценария (сервер, клиент, TUN) набор обязательных полей различается, но есть общий каркас: всегда требуются ключи log, dns, inbounds, outbounds и route. Даже если вы не собираетесь использовать DNS или свою маршрутизацию, эти поля должны присутствовать, хотя бы с минимальными значениями.
Обязательные поля JSON: логика и структура
В файле конфигурации sing-box верхний уровень — это объект. Согласно официальной документации, разделы log, dns, inbounds, outbounds, route являются обязательными в том смысле, что без них ядро либо откажется запускаться, либо будет работать некорректно. Давайте рассмотрим каждый:
- log — определяет уровень логирования. Минимально:
"level": "info". - dns — DNS-серверы и правила. Минимально: указать хотя бы один сервер (
servers). Без этого sing-box может не резолвить домены для маршрутизации. - inbounds — точки входа (локальный SOCKS, HTTP, TUN и т.д.). Обязательно описать хотя бы один.
- outbounds — исходящие подключения (direct, VLESS, Trojan). Минимум — один outbound.
- route — правила маршрутизации. Минимально можно указать
"final": "outbound"(или default).
С точки зрения синтаксиса, JSON должен быть строго валидным, без комментариев и запятых в конце. Новички часто пропускают обязательные поля, и sing-box выдаёт ошибку missing outbounds или missing dns.
Пошаговая настройка: от core до клиента
Рассмотрим практический пример. Допустим, у нас есть VPS-сервер с установленным sing-box. Создайте файл config.json:
{
"log": { "level": "info" },
"dns": { "servers": [ {"address": "8.8.8.8"} ] },
"inbounds": [
{
"type": "vless",
"tag": "vless-in",
"listen": "0.0.0.0",
"listen_port": 443,
"users": [ { "uuid": "ваш-uuid" } ],
"tls": { "enabled": true, "certificate_path": "/etc/ssl/cert.pem", "key_path": "/etc/ssl/key.pem" }
}
],
"outbounds": [
{ "type": "direct", "tag": "direct" }
],
"route": { "final": "direct" }
}На клиенте конфигурация выглядит иначе: inbound обычно — локальный SOCKS или TUN, outbound — VLESS-сервер. Например:
{
"log": { "level": "info" },
"dns": { "servers": [ { "address": "8.8.8.8" } ] },
"inbounds": [
{ "type": "socks", "listen": "127.0.0.1", "listen_port": 1080 }
],
"outbounds": [
{
"type": "vless",
"server": "ваш-сервер.com",
"server_port": 443,
"uuid": "ваш-uuid",
"tls": { "enabled": true, "server_name": "ваш-сервер.com" }
}
],
"route": { "final": "vless-out" }
}В этом минимальном примере мы не добавляем правило для обхода локальных IP, но это ок для старта. Обратите внимание на поле route.final — оно указывает, какой outbound используется по умолчанию.
Маршрутизация (route) и DNS в минимальной конфигурации
Раздел route в sing-box позволяет гибко управлять тем, какой трафик идёт через какой outbound. В минимальной конфигурации достаточно одного поля final. Однако есть обязательный подводный камень: если в dns не указаны серверы, sing-box может резолвить домены только через системный резолвер, но при включённом TUN это часто ломает маршрутизацию. Поэтому мы добавляем хотя бы один DNS-сервер (например, 8.8.8.8 или 1.1.1.1).
Для более продвинутой маршрутизации (например, чтобы не проксировать локальные адреса) можно добавить правила в rules. Но в рамках минимальной конфигурации это не обязательно. Важно понимать: если вы используете TUN, то dns становится критическим, так как перехватываются все DNS-запросы системы.
TUN и VLESS: обязательные поля transport
TUN (сетевой интерфейс) в sing-box является типом inbound. Минимальные поля для TUN:
{
"type": "tun",
"tag": "utun",
"interface_name": "tun0",
"mtu": 1500,
"auto_route": true
}Но для работы TUN требуется, чтобы в route была правильная маршрутизация. Часто также указывают strict_route и stack. При использовании TUN обязательно в outbounds должны быть и direct, и проксирующий outbound, иначе трафик зациклится.
Что касается VLESS outbound, обязательные поля: server, server_port, uuid, а также tls (если на сервере включён TLS). Внутри tls обязательны enabled и server_name. Для transport (например, WebSocket, gRPC) поле называется transport. Если server на VLESS использует transport.type": "ws", то клиент обязан указать тот же тип и путь. Пример:
"transport": { "type": "ws", "path": "/ws", "headers": { "Host": "example.com" } }Поле transport не является обязательным в самом VLESS, но если сервер настроен на WS, то без него клиент не подключится. Поэтому при переносе конфигурации всегда сверяйте transport.
Проверка и диагностика конфигурации
Прежде чем запускать sing-box, проверьте JSON на валидность. Используйте sing-box check (команда в CLI) для локальной проверки. Если вы используете панель, то она сама проверит, но вручную это тоже полезно. Основные ошибки:
- Отсутствует
dns.servers— ядро предупреждает, но может работать. - Неправильно указан
uuid— VLESS не соединится. - В
outboundsнет ни одного прямого outbound — TUN зациклится. - Не совпадает
transportна клиенте и сервере.
Для диагностики сетевых проблем используйте log.level": "debug". В логах будет видно, как обрабатывается соединение, какой outbound выбран, есть ли ошибки TLS. После проверки верните уровень на info, чтобы не засорять диск.
Помните: sing-box активно развивается, поэтому всегда сверяйтесь с официальной документацией на sing-box.sagernet.org. Версии, упомянутые в этой статье (1.11.x), могут устареть, но структура основных полей остаётся стабильной.
Проверено на практике
- Дата проверки: 2025-01-15
- Среда: sing-box 1.11.0, Debian 13, Windows 11, Android 14
- Версии: 1.11.0,1.10.0
Мини-чеклист
- Убедиться, что JSON валиден (команда sing-box check)
- Указан log.level
- Указан хотя бы один DNS-сервер в dns.servers
- В inbounds есть хотя бы один inbound (socks, tun, vless)
- В outbounds есть хотя бы один outbound (direct, vless)
- В route указан final
- Для VLESS проверены server, server_port, uuid, tls сертификаты
- Transport клиента совпадает с сервером
- При использовании TUN добавлен direct outbound и auto_route
Частые ошибки
- Забыть поле dns — при TUN это вызывает ошибки резолва
- Не указать uuid в VLESS — подключение не проходит
- Перепутать inbound и outbound при настройке клиента
- Не указать server_name в tls — TLS handshake не удастся
- Использовать "type": "vless" вместо "type": "socks" на клиенте
- Не указывать transport, если сервер использует WS или gRPC
Источники и документация
FAQ
Что минимально нужно для запуска sing-box как клиента без TUN?
Достаточно указать log, dns (один сервер), inbound (например, socks), outbound (например, vless), route с final. Обязательно также указать в outbound все поля для подключения к серверу.
Как включить TUN в sing-box?
Добавьте inbound с типом tun, укажите auto_route, mtu. Убедитесь, что в outbounds есть direct и проксирующий outbound, а в route final указывает на проксирующий.
Что делать, если sing-box выдаёт ошибку 'missing dns'?
Добавьте в корень конфигурации блок dns: {"servers":[{"address":"8.8.8.8"}]}. Это обязательное поле в текущих версиях.
Влияет ли transport на обязательные поля?
Если вы не используете VLESS с транспортом (например, WebSocket), то поле transport не обязательно. Но если на сервере настроен WS, клиент обязан указать тот же тип и параметры.
Хотите перейти сразу к рабочему доступу?
Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.
Получить доступ