Быстрый старт Настройка Обновлено 5 Windows, macOS, Linux, Android, iOS

sing-box Selector и URLTest: как переключать и проверять узлы

Полное руководство по двум ключевым типам исходящих соединений sing-box: selector для ручного выбора узла и urltest для автоматической проверки и переключения на самый быстрый.

sing-boxselectorurltestпроксинастройка
Содержание
КороткоSelector и urltest — типы outbounds в sing-box для управления узлами. selector переключает вручную, urltest выбирает автоматически по задержке. Используйте их в route и DNS. Проверяйте теги и сеть при неисправностях.

Что такое 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.

Хотите перейти сразу к рабочему доступу?

Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.

Получить доступ

Дальше по теме

Связанные статьи