golang

Sing-Box Launcher: как собрать VPN + WireGuard + split-tunneling без JSON-конфигов

  • воскресенье, 8 марта 2026 г. в 00:00:13
https://habr.com/ru/articles/1007568/

Рассказываю про развитие своего проекта — мультиплатформенного десктопного клиента 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

  • и в конце соберём конфигурацию, где разные типы сервисов идут через разные каналы

Level 1: простые задачи

В самом простом случае нам нужен просто доступ к интернету через VPN. Например, находясь где-нибудь в кафе посмотреть привычный [р]ютуб :)

Ставим клиент, запускаем его и добавляем ссылку на подключение. Если своей подписки нет, можно воспользоваться и бесплатными серверами — прямо из интерфейса:

Справа вверху у меня как раз есть несколько таких вариантов. Сразу оговорюсь — это решение больше для теста. Пользоваться такими соединениями на постоянке я бы не советовал, как и любыми непроверенными публичными серверами.

А откуда они берутся?
Есть такой замечательный проект и вот благодаря ему нам доступен такой функционал всем и каждому и пусть никто не останется обделенным.

Итак, задача минимум решена — подключение работает.

Дальше уже начинаются приятные мелочи. Клиент можно запускать прямо из tray, а под macOS дополнительно реализовано скрытие из Dock, чтобы всё выглядело аккуратно и не мешало в системе, сам интерфейс ест большинство найденных видов ссылок и подписок, а если в подписке несколько серве��ов прям позволяет между ними переключаться (все как у всех тут).

Короче просто VPN понятно дело мы запустили — это слишком простая задача. Давайте сделаем чуть интереснее.

Level 2: разделение трафика

Например, хотим сделать так, чтобы российские сайты открывались напрямую, а весь остальной трафик шел через 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 проверили
Диагностику увидели

Level 3: VPN + корпоративная сеть через WireGuard

Но в реальной жизни кроме развлечений есть еще и работа. Поэтому, например, хочется сделать так:

  • российский трафик идет напрямую

  • заблокированные сервисы открываются через публичный 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 выбором серверов

И всё это работает одновременно, без переключения профилей и перезапуска клиента.
Класс! посмотрите какие там есть еще правила и про локальную сеть и про торренты, многие найдут там решения своих типичных задач.

Level 4: динамическо�� управление подписками и routing-policy sing-box

Представим такую задачу:

  • российские сайты должны открываться напрямую

  • заблокированные сервисы — через публичный 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, мягко и приятно.

SingBox Launcher это GUI-оркестратор конфигураций sing-box

К чему я пришел на данный момент: 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

Всем кто потратил свое время на знакомство с моим творчеством огромная благодарность, мне приятно делать что-то что вам заходит!