Sing-Box Launcher: как собрать VPN + WireGuard + split-tunneling без JSON-конфигов
- воскресенье, 8 марта 2026 г. в 00:00:13
Рассказываю про развитие своего проекта — мультиплатформенного десктопного клиента Sing-Box Launcher.
GitHub проекта: https://github.com/Leadaxe/singbox-launcher

Думаю многие хотели сделать конфигурацию, где:
рабочие сайты открываются через корпоративную сеть
госуслуги работают даже из аэропорта Стамбула
локальная домашняя сеть доступна
YouTube тоже не ломается
И желательно всё это настроить без танцев с JSON-конфигами, стабильно и прозрачно. Покажу по шагам, как это можно собрать и как именно это реализовано в моём проекте.
Ранее я уже писал про начало разработки тут и тут, но сейчас расскажу всё заново — с текущего состояния проекта, так что читать мое старое творчество нет необходимости.
Это open source кроссплатформенный десктопный VPN-клиент, который работает на базе ядра sing-box и поддерживает большинство современных протоколов:
��� VLESS (включая Reality)
✅ VMess
✅ Trojan
✅ Shadowsocks
✅ Hysteria2
✅ SSH
✅ WireGuard
Он позволяет гибко маршрутизировать трафик между разными каналами и протоколами.
Я начал его писать, как видимо, и авторы большинства VPN-клиентов, чтобы он решал только одну задачу — «включить туннель», дать кнопку запуска. Я думал так: сделаю удобный GUI для запуска Sing-Box, а уже Sing-Box сам является «швейцарским ножом» в мире машрутизации и VPN. Первые версии такими и были: простой запуск и иконка в трее. И первая же сотня пользователей, которая потратила время на установку моего софта показала мне, что этого чертовски мало и надо систему дорабатывать.
Пользователям нужно:
отправлять часть трафика напрямую
часть — через VPN
рабочие сервисы — через WireGuard
а заблокированные ресурсы — через публичные серверы
Ниже мы пройдемся по этим типовым сценариям, которые, обычно, требовали ручной сборки JSON-конфига или скачивания его из каких либо пресетов, которые сложно было кастомизировать или согласовать межу собой.
Конечно нет. В основе проекта лежит готовое и очень мощное ядро sing-box — это, по сути, универсальный движок маршрутизации и VPN.
А вот всё остальное — это уже Sing-Box Launcher.
Я написал GUI и систему управления конфигурацией, которая позволяет собирать сложные схемы маршрутизации через интерфейс, без ручной правки JSON.
Технологически проект выглядит примерно так:
Sing-Box Launcher (GUI)
↓
генерация конфигурации
↓
sing-box core
↓
TUN интерфейс системы
���Динамическое переключение в GUI ↓sing-box API ↓
маршрутизация трафика
GUI написан на Go + Fyne, а под разные платформы используются нативные компоненты — от Objective-C до Python-утилит.
При этом лаунчер умеет динамически управлять соединениями через sing-box API, поэтому переключение серверов, правил и маршрутов может происходить прямо из GUI без перезапуска.
Все бинарники собираются через GitHub CI/CD, поэтому любой желающий может проверить, что собранные релизы соответствуют открытому коду проекта.
Да еще и сам sing-box это очень мощный проект, который крайне активно развивается. Форматы конфигурации регулярно меняются, появляются новые типы inbound/outbound/endpoint, обновляются правила маршрутизации и поведение отдельных компонентов, tun еще по-разному работает на разных платформах.
При этом сама конфигурация может быть достаточно сложной и по-разному вести себя на разных платформах, в разных режимах работы и комбинациях протоколов — это все надо было тестировать и согласовывать.
Поэтому значительная часть работы над Sing-Box Launcher была связана не только с написанием GUI, но и с исследованием поведения sing-box.
Пришлось систематизировать логику построения конфигураций, разбирать реальные сценарии использования, а местами даже делать небольшой реверс-инжиниринг, чтобы понять поведение некоторых недокументированных особенностей.
Цель была простая — добиться того, чтобы пользователь мог собирать сложные схемы маршрутизации через интерфейс, а система при этом генерировала конфигурацию, которая работает гладко и предсказуемо.
В итоге GUI превратился из простого интерфейса запуска фактически в экспертную систему, которая согласует между собой разные режимы работы sing-box.
Она помогает корректно комбинировать:
inbound
outbound
endpoint
правила маршрутизации
разные режимы работы туннеля
На практике это означает, что пользователь собирает схему через интерфейс, а лаунчер автоматически формирует согласованную конфигурацию sing-box, которая учитывает особенности разных платформ, протоколов и режимов работы.
Чтобы было проще показать возможности системы, покажу несколько типовых сценариев — от самого простого к более сложным.
Начну с базовой задачи: просто подключиться к серверу и получить доступ к интернету через VPN.
А дальше постепенно будем усложнять схему:
добавим разделение трафика
подключим корпоративную сеть через WireGuard
и в конце соберём конфигурацию, где разные типы сервисов идут через разные каналы
В самом простом случае нам нужен просто доступ к интернету через VPN. Например, находясь где-нибудь в кафе посмотреть привычный [р]ютуб :)
Ставим клиент, запускаем его и добавляем ссылку на подключение. Если своей подписки нет, можно воспользоваться и бесплатными серверами — прямо из интерфейса:

Справа вверху у меня как раз есть несколько таких вариантов. Сразу оговорюсь — это решение больше для теста. Пользоваться такими соединениями на постоянке я бы не советовал, как и любыми непроверенными публичными серверами.
А откуда они берутся?
Есть такой замечательный проект и вот благодаря ему нам доступен такой функционал всем и каждому и пусть никто не останется обделенным.
Итак, задача минимум решена — подключение работает.
Дальше уже начинаются приятные мелочи. Клиент можно запускать прямо из tray, а под macOS дополнительно реализовано скрытие из Dock, чтобы всё выглядело аккуратно и не мешало в системе, сам интерфейс ест большинство найденных видов ссылок и подписок, а если в подписке несколько серве��ов прям позволяет между ними переключаться (все как у всех тут).
Короче просто VPN понятно дело мы запустили — это слишком простая задача. Давайте сделаем чуть интереснее.
Например, хотим сделать так, чтобы российские сайты открывались напрямую, а весь остальной трафик шел через VPN. Это и быстрее работает, и многие сервисы не любят, когда к ним приходят из зарубежных дата-центров и для систем провайдера полезнее видеть многообразие прямых соединений. В Sing-Box Launcher такие сценарии можно собрать буквально в пару кликов.

Заодно можно включить и блокировку рекламы — для этого используется интеграция с ещё одним open source проектом. Кстати, на Хабре у его автора есть отличная статья, пользуясь случаем передаю ему благодарность и поздравляю с всеобщим признанием после написания его последней статьи!

Теперь независимо от того, какой сервер выбран, весь российский трафик будет идти напрямую, а остальной — через VPN.
Получается простая, но уже очень полезная схема:
RU сайты → напрямую остальной интернет → VPN
Раз уж я показал окно выбора серверов из подписки, скажу пару слов и про сам интерфейс.
Здесь есть несколько полезных вещей:
параллельный пинг серверов (до 20 потоков)
возможность выбирать что именно пинговать
сортировка серверов по задержке
встроенное debug-окно, где можно посмотреть работу API и состояние соединений
То есть список серверов — это не просто список. Клиент может быстро проверить доступность узлов, оценить задержку и выбрать оптимальный сервер. Старались сделать всё максимально удобно, чтобы нужный сервер можно было найти буквально за пару секунд.
А если хочется понять, что именно происходит с соединением, для этого есть отдельный раздел диагностики:

Здесь можно проверить внешний IP через разные сервисы, посмотреть логи работы клиента и убедиться, что соединение действительно работает так, как ожидается.
В диагностике есть возможность проверить внешний IP через Google STUN (UDP). Это позволяет понять, какой адрес реально видят внешние сервисы при работе через VPN или прокси. В отличие от обычных HTTP-проверок, STUN работает на уровне UDP-соединений, поэтому иногда позволяет увидеть более точную картину того, как проходит сетевой трафик и какой NAT используется. Короче это бывает очень полезно при отладке подключения, серверов, особенно когда используются разные протоколы и туннели, голосовой и видео трафик, а еще игровой, ну думаю понятно.
Значит чего мы уже тут смогли?
VPN включили Сервер выбрали split routing есть: RU сайты → напрямую, остальной интернет → VPN Разные каналы потестировали UDP проверили Диагностику увидели
Но в реальной жизни кроме развлечений есть еще и работа. Поэтому, например, хочется сделать так:
российский трафик идет напрямую
заблокированные сервисы открываются через публичный VPN
а рабочие ресурсы идут через корпоративную сеть
Для этого на работе можно поднять, например, обычный WireGuard сервер. И собрать строку подключения по типу такой:
wireguard://privatekey-base64@10.0.0.1:51820?publickey=server-pubkey-base64&address=10.10.10.2/32&allowedips=0.0.0.0/0,::/0&keepalive=25&mtu=1420#My WG
После этого можно собрать нужную схему.
Сначала создаем управляемый outbound, который будет использовать наше WireGuard соединение.

Важно, что этот outbound можно ограничить по видимости, чтобы в него не попадал лишние соединения, для этого ставим его в локальную видимость, чтобы он видел только наше WG соединение, у меня оно названо «Source 4» и выбрается в поле «Scope»
Дальше добавляем пользовательское правило маршрутизации на вкладке Rules (внизу списка «add rule»):

Получается такая схема:
RU сайты → напрямую рабочая сеть → WireGuard остальной интернет → VPN c выбором серверов
И всё это работает одновременно, без переключения профилей и перезапуска клиента.
Класс! посмотрите какие там есть еще правила и про локальную сеть и про торренты, многие найдут там решения своих типичных задач.
Представим такую задачу:
российские сайты должны открываться напрямую
заблокированные сервисы — через публичный VPN
рабочие сервисы — через корпоративный WireGuard
а сервисы, доступные только из России, должны открываться через российские прокси
И всё это должно работать одновременно.
Звучит как конфигурация, которую обычно собирают руками в JSON, а потом боятся трогать. Потому что на правктике подписки дают множество серверов, у многих пользователей несколько подписок в каждой по сотне серверов, сервера в них меняются, креды и метки меняются. Как итог: конфиги, собранные руками умирают.
Здесь мы попробуем сделать это через интерфейс и так чтобы этим хозяйсвом можно было удобненько управлять
Конечно можно сделать как я ранее показал готовый outbound и их даже в пресетах пара штук идет именно для этого:

вот они есть: vpn 1 и vpn 2, можно на них прям правило повесить, но придется каждый раз выбирать из всего множества серверов, а их может быть уже ни одна сотня из разных мест
Так что настало время вас познакомить с расширенным функционалам и сделать префильтрацию серверов из общего списка.
В Sing-Box Launcher есть система управления подписками — ParserConfig.
Она позволяет:
фильтровать серверы из подписки
группировать их
автоматически формировать outbound-группы
использовать их в правилах маршрут��зации
Документация по парсеру подписок есть в репозитории проекта:
https://github.com/Leadaxe/singbox-launcher/blob/main/docs/ParserConfig.md
Посмотрим как устроен outbound «ruVPN 🇷🇺» из готовых пресетов чтобы понять как вы можете создать свои:

Часто серверы в подписках уже помечены флагами стран, поэтому можно просто использовать регулярное выражение по emoji флага. В таком случае лаунчер сам отфильтрует все узлы с флагом 🇷🇺 в теге и сформирует из них отдельную группу.
Для совсем требовательных пользователей, которые готовы читать документацию и хотят максимум гибкости можно перейти в режим raw и править json напрямую.

Далее, выбрав правило ✅ Russia-only services мы указывем ему в качестве выхода наш «ruVPN 🇷🇺» outbound

Так мы смогли в интерфейсе собрать довольно интересную схему:
┌───────────────┐ RU сайты ───► DIRECT │ а еще мы сюда отправляем игры и например torrent └───────────────┘ ┌───────────────┐ и в этой группе отфильтрованы не РФ сервера Blocked ────► Public VPN │ их можно переключать дизамически └───────────────┘ ┌───────────────┐ Work ───────► WireGuard │ └───────────────┘ ┌───────────────┐ в котром отфильтрованы только РФ сервера RU-only ────► ruVPN │ их можно переключать дизамически └───────────────┘ а можно выбрать direct
Все эти каналы работают одновременно. Никаких переключений профилей. Никаких перезапусков клиента. А если российские прокси временно не нужны — достаточно переключить группу ruVPN на direct прямо в интерфейсе.

никаких перезапусков, работы с конфигами и прочего — все делается из GUI, мягко и приятно.
К чему я пришел на данный момент: Sing-box сам по себе — мощный и гибкий инструмент, но работать с ним обычно приходится через довольно сложные JSON-конфиги. Особенно если речь идет о сочетании нескольких протоколов, правил маршрутизации и разных типов соединений.
Эту работу я положил Sing-Box Launcher. Теперь пользователь собирает схему через интерфейс, а лаунчер:
управляет подписками серверов
фильтрует их через ParserConfig
формирует группы outbounds
строит routing policy
и генерирует согласованный конфиг для sing-box
Если упростить, получается примерно такая архитектура решения:
subscription ↓ ParserConfig ↓ server groups ↓ routing rules ↓ sing-box config
При этом конфигурация может динамически изменяться из интерфейса — без ручного редактирования JSON и без постоянных перезапусков, а управление выбором серверов и сбора статистики сделано через API.
Получилось сделать так, что GUI берет на себя роль оркестратора, который согласует между собой подписки, серверы и правила маршрутизации.
И мне очень нравится метафора, что Sing-box — это швейцарский нож сетевой маршрутизации. поэтому я делаю Sing-Box Launcher — просто ручку, за которую этот нож наконец-то удобно держать.
Далее Расскажу о некоторых приемах, которые используются внутри.
Внимательные читатели, наверное, заметили, что некоторые правила загружаются с GitHub. Но GitHub доступен не везде, и иногда такие загрузки могут не работать. Для этого используются SRS-файлы. Если правила доступны напрямую — лаунчер просто скачивает их. А если нет, можно временно включить один из встроенных бесплатных серверов и через него получить нужные пресеты.
Я показывал работу клиента на macOS. Там используются некоторые системные механизмы для запуска TUN-интерфейса, поэтому при запуске и остановке соединения система будет запрашивать пароль.

Аналогично и под Windows — проект собирается с использованием UAC, поэтому система может запросить подтверждение прав администратора.
Все бинарники собираются исключительно через CI/CD на GitHub.
Это означает, что опубликованные релизы соответствуют коду открытого проекта, который уже инспектируется большим количеством участников, не все распространяемые решения соответствуют этому правилу.
При этом лаунчер принципиально ничего не отправляет наружу и не собирает телеметрию. Из доступной статистики — только то, что предоставляет сам GitHub: количество скачиваний релизов и число звёзд.
Так что если понравилось, то поддерживайте проект — лайк, подписка, колокольчик… тьфу, не то. В общем: звёздочка ⭐, форк ↑↓ и коммит </>.
Отдельно расскажу пару слов о том, как развивается сам проект.
Сейчас разработка ведётся в формате Spec Driven Development.
Каждая новая возможность сначала описывается в виде спецификации, после чего разбивается на задачи и только потом реализуется, так начинающие vibecoder'ы могут перенимать опыт разработки. Посмотреть текущие и уже реализованные задачи можно прямо в репозитории:
https://github.com/Leadaxe/singbox-launcher/tree/develop/todo/complete
Для меня это ещё и демонстрация подхода к разработке.
Я открыт к сотрудничеству:
с VPN-провайдерами
с авторами rule-сеттов
с разработчиками, которые хотят добавить новые возможности
Если у вас есть интересные правила маршрутизации, идеи интеграций или просто желание улучшить интерфейс — буду рад pull request'ам.
А еще очень нужны люди которые запустят все на Linux и помогут от тестировать, у нас есть telegram сообщество ссылка на которое доступно прямо из программы.
GitHub проекта: https://github.com/Leadaxe/singbox-launcher
Всем кто потратил свое время на знакомство с моим творчеством огромная благодарность, мне приятно делать что-то что вам заходит!