sing-box Selector и URLTest: как переключать и проверять узлы
Полное руководство по двум ключевым типам исходящих соединений sing-box: selector для ручного выбора узла и urltest для автоматической проверки и переключения на самый быстрый.
Содержание
Что такое selector и urltest в sing-box?
В sing-box маршрутизация трафика строится на исходящих соединениях – outbounds. Чтобы управлять несколькими прокси-серверами (узлами), необходима группировка. Для этого служат специальные типы outbounds: selector и urltest. Оба они не являются реальными серверами, а лишь логическими группами, которые выбирают активное соединение из списка.
Selector – это ручной переключатель. Вы сами решаете, какой узел использовать в данный момент. В клиентах на базе sing-box (например, SFI или некоторые графические оболочки) это выглядит как выпадающий список или радиокнопки.
Urltest – автоматический оптимизатор. Он периодически отправляет тестовый HTTP-запрос (обычно на специальный URL) через каждый узел и измеряет задержку. Лучший узел выбирается автоматически, и при ухудшении показателей происходит переключение.
Оба типа необходимы для гибкой настройки: вручную вы можете выбрать конкретный сервер для обхода блокировок, а автоматика подстроится под изменение скорости.
Настройка selector: ручное переключение узлов
Пример простейшего selector в конфигурации sing-box:
{
"type": "selector",
"tag": "proxy",
"outbounds": ["node-1", "node-2", "node-3"],
"default": "node-1",
"interrupt_exist_connections": true
}
Поле type обязательно, значение — selector.
tag — уникальное имя, по которому вы ссылаетесь на этот outbound из правил маршрутизации или из других outbounds.
outbounds — это массив тегов тех узлов, которые участвуют в переключении. Важно, чтобы эти теги были объявлены выше в том же файле конфигурации.
default — узел, выбранный изначально. Если не указано, берётся первый из списка.
interrupt_exist_connections — определяет, обрывать ли текущие соединения при смене узла. Если поставить true, переключение будет мгновенным и все активные сессии отключатся. При false старые соединения останутся до своего естественного завершения, а новые пойдут уже через новый узел.
Для ручного переключения используется Clash API или экспериментальный RESTful API. В настройках sing-box нужно включить внешний контроллер. Пример настройки:
"experimental": {
"clash_api": {
"external_controller": "127.0.0.1:9090",
"secret": "mypassword"
}
}
Затем можно послать PUT-запрос на /proxies/proxy с телом {"name": "node-2"}, где proxy — tag вашего selector. В большинстве GUI-клиентов есть встроенный интерфейс для выбора узла.
Настройка urltest: автоматическая проверка и выбор лучшего узла
Urltest — идеальное решение для автоматического переключения. Конфигурация выглядит так:
{
"type": "urltest",
"tag": "auto",
"outbounds": ["node-1", "node-2", "node-3"],
"url": "https://www.gstatic.com/generate_204",
"interval": "5m",
"tolerance": 50,
"idle_timeout": "30m"
}
Поля outbounds и tag аналогичны selector. Дополнительные параметры:
url — адрес, используемый для проверки. Рекомендуется использовать стабильный сайт, который отдаёт HTTP 204 или 200. Например, https://www.gstatic.com/generate_204 или http://cp.cloudflare.com/. Если узел не может получить ответ, он считается недоступным.
interval — период, через который происходит повторное тестирование. Формат времени Go — например, 5m, 30s.
tolerance — допустимая разница задержек в миллисекундах. Если разница между текущим узлом и новым меньше этого значения, переключения не произойдёт. Это защищает от «дрожания» при нестабильной сети.
idle_timeout — если трафик долго отсутствует, тестирование приостанавливается до следующего обращения. Полезно для мобильных устройств и экономии трафика.
Urltest автоматически выбирает узел с наименьшей задержкой. Однако стоит учитывать, что задержка не всегда означает реальную скорость, поэтому нередко используют несколько правил для разделения трафика.
Применение в маршрутизации и DNS
Созданные группы можно использовать как обычные outbounds в правиле final или в rules. Пример, где весь трафик отправляется через наш selector:
{
"route": {
"rules": [],
"final": "proxy"
}
}
Или более сложный пример — для сервисов видео использовать urltest, а для остального — ручной selector:
"route": {
"rules": [
{
"domain_suffix": ["youtube.com"],
"outbound": "auto"
}
],
"final": "proxy"
}
Эти типы можно комбинировать. Распространённая схема — создание двух групп: одна для ручного выбора, другая для автоматического. Внутри ручного selector можно указать urltest как один из вариантов:
{
"type": "selector",
"tag": "proxy",
"outbounds": ["auto", "node-1", "node-2"],
"default": "auto"
}
Так пользователь может либо предоставить выбор автоматике, либо жёстко указать конкретный узел. Это лучшая практика для гибридного использования.
DNS также может использовать группы. Например, для DNS-запросов можно указать urltest, чтобы работал самый быстрый DNS-прокси:
"dns": {
"servers": [
{
"tag": "remote-dns",
"address": "https://8.8.8.8/dns-query",
"detour": "auto"
}
]
}
Диагностика проблем переключения и проверки
Если вы обнаружили, что узел не переключается или urltest не работает, следуйте этим шагам.
1. Проверьте теги. Все теги в outbounds должны существовать в конфигурации. Даже одна опечатка приведёт к ошибке запуска.
2. Для urltest проверьте URL. Убедитесь, что сервер доступаен через интернет и не блокируется вашим провайдером. Если узел сам не может этот URL открыть, он будет помечен как failed.
3. Включите логирование. Запустите sing-box с флагом -c config.json -D (debug). В логах вы увидите результаты тестирования каждого узла. Если появляется ошибка подключения к URL, это обычно указывает на проблему с самим узлом.
4. Проверьте, что внешний контроллер включён. Если вы пытаетесь переключать узел через API, должен быть включён clash_api или restfulapi. Некоторые клиенты не поддерживают API по соображениям безопасности — тогда используйте официальный GUI.
5. Не помещайте узел direct в urltest. Вы всегда будете иметь прямую связь без прокси, поэтому он будет выбран и все запросы пойдут без прокси, что не отвечает вашим целям.
6. Для selector убедитесь, что параметр interrupt_exist_connections не мешает. Если вы подключаетесь к сайту, а затем переключаетесь, при false старая сессия останется активной и может показаться, что переключения не произошло.
7. Проверьте синтаксис JSON. Частая ошибка — лишняя запятая после последнего элемента массива или объекта.
Различия и рекомендации по использованию
Главное различие — способ управления. Selector — ручной, urltest — автоматический. Выбор зависит от вашей задачи:
- Если вам нужен постоянный контроль и возможность вручную выбрать узел под конкретную задачу — используйте selector.
- Если вы хотите, чтобы система сама поддерживала максимальную скорость и стабильность — urltest.
- Для максимальной гибкости — комбинируйте оба типа, как показано выше.
Рекомендации по настройке:
- Для urltest используйте URL, который быстро отвечает и не объёмный, чтобы нагрузка была минимальной.
- Выставляйте
toleranceв пределах 30–80 мс, чтобы не было частых переключений. - В TUN-режиме учтите, что все соединения будут проходить через выбранный outbound, поэтому при ручном switch используйте
interrupt_exist_connections: trueдля немедленного применения. - Периодически проверяйте логи urltest, чтобы знать, какие узлы реально работают быстро.
Не забывайте, что конфигурация sing-box постоянно обновляется. Проверяйте актуальную документацию по ссылкам в источниках, особенно если вы используете экспериментальные версии.
Проверено на практике
- Дата проверки: 2024-01-15
- Среда: sing-box 1.9.0, Windows 11
- Версии: 1.9.x
Мини-чеклист
- Проверьте, что теги outbounds совпадают с объявленными узлами
- Укажите корректный URL для urltest (например, gstatic generate_204)
- Включите Clash API или RESTful API для переключения через GUI
- Проверьте логи sing-box в debug-режиме при неработающем urltest
- Используйте tolerance для защиты от частых переключений
- Исключите direct из urltest, если не хотите прямых подключений
Частые ошибки
- Опечатки в тегах outbounds в selector/urltest
- Неправильный или недоступный URL для тестирования urltest
- Не включён внешний контроллер (clash_api/restfulapi)
- Помещение узла direct в urltest, из-за чего выбирается прямое соединение
- Отсутствие interrupt_exist_connections при необходимости мгновенного переключения
Источники и документация
FAQ
Чем selector отличается от urltest?
Selector позволяет выбирать узел вручную, urltest автоматически тестирует и выбирает узел с наименьшей задержкой.
Можно ли использовать оба одновременно?
Да, можно поместить urltest внутрь selector, чтобы иметь и автоматику, и ручной выбор.
Как проверить, работает ли urltest?
Включите debug-логи и смотрите результаты тестирования. Также можно использовать команду sing-box check.
Хотите перейти сразу к рабочему доступу?
Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.
Получить доступ