Sing‑box — это программа, которая знает много протоколов проксирования и умеет их очень гибко применять. Работает на разных устройствах (роутеры, телефоны, стационарные компьютеры) и операционных системах (Windows, Linux, iOS, Android и др.). Может быть клиентом (работать на конечном устройстве пользователя), сервером (принимать соединения от клиентов), клиентом и сервером одновременно (промежуточный узел для перенаправления трафика).

В этой статье я познакомлю вас с sing‑box и расскажу о его настройке. Покажу базовую конфигурацию sing‑box, с которой не нужно постоянно включать и выключать VPN для доступа то к одному, то к другому сайту или приложению. И это будет работать на разных устройствах с минимальными изменениями. Это вводная статья для тех, кто уже пользуется готовыми GUI‑клиентами, но хочет перейти на чистый sing‑box.

Почему sing‑box не на слуху? У него нет графического интерфейса, поэтому для обычных пользователей он неудобен. Но sing‑box в качестве «ядра» используют многие популярные VPN‑программы (правильнее было бы называть «прокси»), которые предоставляют понятный интерфейс (Nekobox, Throne, Hiddify, Karing и другие). Эти программы на основе выбора пользователя генерируют итоговый текстовый конфиг для sing‑box, скрыто запускают с этим конфигом ядро, которое выполняет всю работу.

Sing‑box и Xray

У sing‑box есть аналог‑конкурент — Xray. На первый взгляд их конфигурации в формате JSON похожи, но на деле они разные: нельзя просто взять кусок конфига из одной программы и вставить в другую. Многие протоколы поддерживаются обоими ядрами, но часть реализована только в одном из них, а общие протоколы могут отличаться по доступным опциям и поведению. Например, по‑разному может быть устроено мультиплексирование, когда несколько конечных соединений передаются через одно соединение с прокси. Использовать на клиенте sing‑box, а на сервере Xray можно, но не всегда удобно из‑за проблем совместимости.

Выбор между sing‑box и Xray — это в том числе выбор между протоколом VLESS и каким‑то другим (AnyTLS, NaiveProxy), потому что VLESS — детище Xray, а автор sing‑box относится к связке VLESS + Reality + Vision негативно (и даже планирует удалить этот протокол из своего ядра). В качестве современного решения автор sing‑box видит протокол NaiveProxy, который использует код сетевого стека Chromium, что хорошо маскирует трафик под обычный браузер.

Мне кажется, что конфигурация в sing‑box более продуманная, а поведение — более предсказуемое. Поэтому эта статья о sing‑box.

Везде переходим на sing‑box

Sing‑box — это мультиплатформенное решение. Но клиенты с удобными GUI часто привязаны к ОС. Например, на Windows используем Nekobox, а на телефоне Shadowrocket. А есть ещё телевизор на Android с условным Clash Meta. В итоге, вроде бы серверы одни, желаемое поведение одно, но настройки разные, итоговое поведение разное. Получается неудобный зоопарк, где каждый раз приходится заново разбираться в тонкостях настройки конкретного клиента. И даже если клиенты используют внутри sing‑box, то далеко не всё вынесено в интерфейс, что‑то разбросано по множеству окон, запутано, а ещё и ядро внутри не самое свежее. Какое решение? Везде использовать свежий sing‑box с похожим конфигом.

Да, изначально придётся долго изучать документацию. Искать примеры конфигов, что‑то заимствовать. Почти все мои знакомые постоянно включают и выключают VPN, десятки раз за день. Почему? Российские сайты блокируют иностранные IP, а условный Telegram заблокирован у нас (не работает то одно, то другое). Через sing‑box это всё легко решается. Например, российские домены ищем через местный незашифрованный DNS, иностранные домены через зашифрованный DNS от Google или Cloudflare. На КиноПоиск и в Парковки России заходим напрямую, а в YouTube через конкретный прокси. А ещё добавим удобный переключатель сервера для конкретных сайтов. Мессенджер Max всегда пускаем в обход VPN (чтобы он про него ничего не знал). Условий и вариантов много. Можно добавить условие на подключение к конкретной Wi‑Fi‑сети, на имя процесса, на диапазоны IP Google и так далее. Это всё настраивается один раз, после чего о ручном переключении VPN можно забыть.

Клиенты sing-box

К сожалению, оригинальные «графические» клиенты от автора sing‑box есть только для Android, iOS и macOS. На других ОС доступны только консольные версии.

Версию для Android можно скачать из F‑Droid (или напрямую с официального GitHub).

SFA
SFA

В App Store тоже есть версия, но она устаревшая (без поддержки NaiveProxy) — у автора какие‑то проблемы с аккаунтом разработчика (некому публиковать обновления). Актуальные версии для iOS и macOS доступны только для его спонсоров с GitHub (достаточно любого одноразового пожертвования) через TestFlight (система для внутреннего тестирования от Apple).

На Windows оригинального удобного клиента нет. Есть только консольная версия, которая при запуске открывает отдельное чёрное окошко, которое никуда не спрятать. Скачать exe можно из раздела релизов (выбирайте архив с windows в имени). Запуск выполняется такой командой: ./sing-box.exe run -c config.json.

Windows
Windows

Для удобного использования sing-box на Windows я написал свою программу sing-box-drover. Может, расскажу о ней в следующей статье.

sing-box-drover
sing-box-drover

Конфигурация

При запуске клиента у вас будет только возможность его включения и выключения. Все настройки находятся в большом текстовом файле в формате JSON, который нужно формировать вручную (а потом или загружать в клиент, или указывать параметром при запуске консольной версии). Добавлять прокси‑серверы нужно тоже текстом в этот конфиг (без быстрого импорта через ссылку).

Описать все поля и значения в рамках статьи невозможно, поэтому дам свою базовую конфигурацию с комментариями.

Что делает этот пример:

  • Российские сайты напрямую, все остальные через прокси

  • Отдельный DNS для российских сайтов (для работы при белых списках)

  • Ручной выбор прокси‑сервера из списка через интерфейс

  • Избранные приложения всегда только напрямую (только на Android)

{
  "log": {
    "level": "warn",
    "timestamp": true
  },
  "dns": {
    "strategy": "ipv4_only",
    "reverse_mapping": true,
    "servers": [
      {
        "type": "https",
        "tag": "dns-secure",
        "server": "8.8.8.8",
        "tls": {
          "server_name": "dns.google"
        },
        "detour": "proxy-select"
      },
      {
        "type": "https",
        "tag": "dns-direct",
        "server": "77.88.8.88",
        "tls": {
          "server_name": "safe.dot.dns.yandex.net"
        }
      }
    ],
    "rules": [
      {
        "rule_set": [
          "sites-direct"
        ],
        "server": "dns-direct"
      }
    ],
    "final": "dns-secure"
  },
  "inbounds": [
    {
      "type": "mixed",
      "tag": "mixed-in",
      "listen": "127.0.0.1",
      "listen_port": 1080
    },
    {
      "type": "tun",
      "tag": "tun-in",
      "address": [
        "172.19.0.1/30",
        "fdfe:dcba:9876::1/126"
      ],
      "auto_route": true,
      "stack": "mixed",
      "mtu": 1400,
      "route_exclude_address": [
        "192.168.0.0/16",
        "224.0.0.0/4",
        "255.255.255.255/32"
      ],
      "exclude_package": [
        "ru.oneme.app"
      ]
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "selector",
      "tag": "proxy-select",
      "outbounds": [
        "Proxy1",
        "Proxy2",
        "direct"
      ],
      "default": "Proxy1",
      "interrupt_exist_connections": true
    },
    {
      "type": "naive",
      "tag": "Proxy1",
      "server": "1.2.3.4",
      "server_port": 443,
      "username": "naive",
      "password": "change-me",
      "insecure_concurrency": 2,
      "udp_over_tcp": {
        "enabled": true
      },
      "quic": false,
      "tls": {
        "enabled": true,
        "server_name": "example.com"
      }
    },
    {
      "type": "anytls",
      "tag": "Proxy2",
      "server": "5.6.7.8",
      "server_port": 443,
      "password": "change-me",
      "idle_session_check_interval": "30s",
      "idle_session_timeout": "60s",
      "min_idle_session": 0,
      "tls": {
        "enabled": true,
        "server_name": "example.org",
        "utls": {
          "enabled": false
        }
      }
    }
  ],
  "route": {
    "final": "proxy-select",
    "auto_detect_interface": true,
    "default_domain_resolver": {
      "server": "dns-secure"
    },
    "rule_set": [
      {
        "tag": "sites-direct",
        "rules": [
          {
            "domain_suffix": [
              ".ru",
              ".su",
              ".xn--p1ai",
              "yandex.net",
              "yastatic.net",
              "vk.com",
              "vk-portal.net",
              "2gis.com"
            ]
          }
        ]
      }
    ],
    "rules": [
      {
        "action": "sniff",
        "sniffer": [
          "http",
          "tls",
          "dns",
          "quic"
        ],
        "timeout": "300ms"
      },
      {
        "protocol": "dns",
        "action": "hijack-dns"
      },
      {
        "action": "resolve"
      },
      {
        "ip_is_private": true,
        "action": "route",
        "outbound": "direct"
      },
      {
        "package_name": [
          "ru.oneme.app"
        ],
        "action": "route",
        "outbound": "direct"
      },
      {
        "rule_set": [
          "sites-direct"
        ],
        "action": "route",
        "outbound": "direct"
      }
    ],
    "override_android_vpn": true
  },
  "experimental": {
    "cache_file": {
      "enabled": true
    },
    "clash_api": {
      "external_controller": "127.0.0.1:9090",
      "secret": "change-me"
    }
  }
}

Основные секции в этом конфиге:

  • dns — DNS‑серверы и правила их использования (как имена доменов будут преобразовываться в IP).

  • inbounds — как sing‑box будет принимать входящие подключения.

  • outbounds — куда sing‑box всё будет отправлять (наши прокси‑серверы).

  • route — правила маршрутизации.

Значения в полях tag — это произвольные идентификаторы, их можно задавать самостоятельно.

DNS

Мы объявляем два DNS‑сервера:

  • dns-secure — это DNS от Google, к которому мы будем скрытно подключаться через наши прокси (из‑за detour proxy‑select).

  • dns-direct — это DNS от Яндекс, к которому мы будем подключаться напрямую (без прокси). Это позволит использовать белые сайты при включенных белых списках без выключения VPN.

По умолчанию все запросы будут идти через dns‑secure, который указан в final. Через dns‑direct (Яндекс) будут идти запросы, которые подпадают под условие sites-direct (об этом ниже).

inbounds

Сначала коротко разберём, что такое системный прокси и TUN. При запуске sing‑box начинает прослушивать локальный порт для приёма новых подключений (если настроен нужный inbound). Но сетевые программы сами к нему подключаться не будут, они по‑прежнему будут идти в интернет напрямую. В ОС есть механизм системного прокси, когда ОС объявляет программам, что пользователь хочет, чтобы для подключения к интернету использовали указанные IP и порт (программы могут уважительно отнестись к желанию пользователя, а могут проигнорировать). Активировали системный прокси — браузеры стали его использовать. Выключили системный прокси, но указали IP и порт прокси вручную в конкретной программе (которая это поддерживает, например, в Telegram) — эта программа всё равно использует прокси (без системной настройки). TUN (от tunnel) — это когда весь сетевой трафик процессов (хотят они того или нет) идёт принудительно через прокси.

В данном конфиге настроены два inbound:

  • mixed — это HTTP и SOCKS прокси, куда программы могут подключаться самостоятельно (если их настроить). Также его используют для настройки системного прокси. Этот inbound можно удалить из конфига для телефона (iOS, Android), он там чаще всего не нужен.

  • tun — sing‑box поднимет сетевой интерфейс, чтобы вся сетевая активность принудительно шла через sing‑box. Он делает это самостоятельно без сторонних DLL. При запуске на Windows потребуются права администратора, иначе программа завершится с ошибкой. Если TUN не нужен, просто удалите этот inbound. В route_exclude_address перечислены подсети, трафик к которым не нужно заворачивать в туннель (локальная сеть, мультикаст, широковещательный адрес); список неполный, при желании его можно расширить. Ещё я для примера указал ru.oneme.app в exclude_package, чтобы приложение Max на Android проходило мимо нашего VPN и никому о нём не рассказывало.

outbounds

Для примера указаны два прокси‑сервера (anytls и naive) и один селектор, который переключает выходной сервер (один из этих двух прокси). Адреса и учётные данные в конфиге ненастоящие — вам нужно подставить свои. Если у вас ещё нет прокси‑сервера, его можно поднять на VPS с помощью того же sing‑box (но уже в серверном режиме).

Селектор (selector) — это outbound (выходная точка) в конфиге, куда можно направлять трафик. Обычно outbound — это конкретный прокси‑сервер (IP, порт, протокол, параметры). Но если вы хотите иметь возможность переключать выходные серверы через меню (не трогая каждый раз текстовый конфиг), то вместо конкретного сервера указывается имя селектора, а уже в настройках селектора перечисляются серверы для выбора. Sing‑box, когда видит в конфиге селекторы, рисует их в графическом интерфейсе. Селекторов может быть много, они могут использоваться в разных правилах и, в свою очередь, ссылаться на другие селекторы.

route

Это правила маршрутизации. По умолчанию в этом конфиге всё идёт через прокси, а точнее через единственный селектор (final proxy‑select). Приложение Max на Android (ru.oneme.app) всегда идёт напрямую. Российские сайты тоже идут напрямую.

Первые три правила (sniff, hijack-dns, resolve) — это служебная цепочка, необходимая для нормальной работы sing‑box (извлечение доменов из соединений, перехват DNS‑запросов и разрешение имён).

В этом разделе объявлено правило sites-direct, где перечислены суффиксы и имена доменов, к которым мы будем подключаться напрямую. И IP этих доменов мы тоже будем получать без прокси через DNS от Яндекс, потому что это правило используется нами в секции DNS.

Условие package_name в правилах маршрутизации работает только на Android. На Windows для аналогичных целей используйте process_name с именем исполняемого файла.

Строка override_android_vpn нужна только на Android, для других ОС её нужно удалить.

Правил может быть много, и они могут быть сложными. Можно ссылаться на списки доменов и диапазонов IP, формируемые сообществом. Sing‑box умеет скачивать эти списки из интернета и кэшировать локально, благодаря опции cache_file. Примеры репозиториев:

Clash API

Sing‑box умеет принимать команды через Clash API (изначально появился в программе Clash, стал своеобразным стандартом, который реализуют многие «прокси‑платформы»). Это позволяет управлять ядром извне, отображать соединения, управлять соединениями, переключать селекторы, рисовать графики. Одна из популярных панелей управления: https://yacd.metacubex.one/. Вы просто открываете сайт в браузере и указываете параметры подключения к локальному Clash API.

Заключение

Sing‑box — очень мощный инструмент, но с его конфигурацией нужно долго разбираться, экспериментировать, кропотливо составлять конфиг под себя. По‑моему, оно того стоит. Базового примера должно хватить для старта. Удачи!

Sing‑box: https://github.com/SagerNet/sing‑box
Документация: https://sing‑box.sagernet.org/configuration/

P. S. Спасибо @0ka за приглашение и возможность опубликовать статью!