Современный, высокопроизводительный графический клиент для Sing-box на Linux, написанный на Rust с использованием GTK4 и Libadwaita.
Приложение совмещает:
- нативный GNOME-интерфейс для управления VPN-подключениями;
- привилегированный системный демон с REST API для управления ядром и сетевым стеком;
- генерацию JSON-конфигурации под ядро Sing-box (спецификация 1.13.18+);
- продвинутую маршрутизацию с региональными пресетами (RU, CN, IR, Antifilter);
- живую статистику трафика через Clash API и потоковые логи через SSE;
- автоматическое обнаружение, валидацию и локальное кэширование ядра Sing-box.
README описывает фактическое состояние проекта на текущий момент, включая реализованные возможности и известные ограничения.
- Назначение проекта
- Скриншоты
- Текущий статус
- Технологический стек
- Зависимости и версии
- Требования к окружению
- Установка и запуск
- Скрипты
- CI/CD
- Поддерживаемые протоколы
- REST API демона
- Данные и хранилища
- Структура проекта
- Диагностика и логи
- Локализация
- Документация
- Разработка и вклад в проект
- Лицензия
VRXX предназначен для удобного управления VPN-подключениями на Linux-десктопах и включает следующие сценарии использования:
- импорт VPN-ключей из буфера обмена или URL (VLESS, VMess, Trojan, Shadowsocks, Hysteria2, TUIC, WireGuard);
- подключение к VPN-серверу через Sing-box с поддержкой TUN-режима (прозрачное проксирование);
- мониторинг трафика, пинга, времени подключения и геолокации сервера в реальном времени;
- гибкая маршрутизация: обход LAN, региональные правила (RU, CN, IR), блокировка рекламы;
- режим стримера: скрытие IP-адресов и SNI при демонстрации экрана;
- поставка с готовым ядром Sing-box 1.13.18 в релизных бандлах и поддержка системного ядра;
- фоновое обновление баз GeoIP/GeoSite каждые 24 часа;
- полная поддержка русского и английского языков интерфейса.
📸 Скриншоты интерфейса
Проект активно развивается. Ниже — честная картина по состоянию на текущий момент.
Управление подключениями:
- Импорт VPN-ключей из буфера обмена и URL-строки
- Поддержка протоколов VLESS (Reality, TLS, uTLS), VMess (Base64 JSON), Trojan
- Подключение/отключение через привилегированный демон
- Живая статистика: трафик (↓/↑), время подключения, пинг
- Автоматическое определение геолокации и часового пояса сервера
- Режим стримера: скрытие IP-адресов и SNI в интерфейсе
Сетевой стек:
- TUN-режим с автоматической настройкой маршрутов (gVisor стек,
auto_route,strict_route) - SOCKS5 и HTTP прокси с настраиваемыми портами
- Настройка системного прокси GNOME через GSettings
- DNS через systemd-resolved (D-Bus API)
- Региональная маршрутизация: RU, CN, IR, Antifilter (через удалённые SRS-наборы правил)
- Блокировка рекламы через удалённые rule sets
- Блокировка IPv6, обход LAN, пользовательские правила маршрутизации (домены, IP, SRS URL)
Конфигурация ядра:
- Генерация конфигурации Sing-box спецификации 1.13.18+ (DNS hijack, route sniff, endpoints)
- TLS + Reality + uTLS fingerprinting (Chrome по умолчанию)
- Транспорт: gRPC, WebSocket, HTTPUpgrade
- DNS: удалённый (Cloudflare HTTPS через прокси) + локальный
- Мультиплексирование (h2mux)
- Clash API для мониторинга статистики (127.0.0.1:9090)
Пользовательский интерфейс:
- Нативный GNOME-дизайн (Libadwaita 1.5+, соответствие HIG)
- 4 основных страницы: VPN, Прокси, Белый список, Настройки
- Переключение тем: светлая, тёмная, системная
- Масштабирование интерфейса (Ctrl+/Ctrl-/Ctrl+0)
- Отдельное окно логов с потоковым отображением (SSE + чтение файлов)
- Автоматическое обнаружение и проверка версии ядра Sing-box в системе
- Импорт и экспорт настроек через JSON-файлы
- Сброс настроек к значениям по умолчанию
- Сочетания клавиш: Ctrl+Q (выход), Ctrl+D (отключение)
Инфраструктура:
- Привилегированный демон с REST API (Axum, 127.0.0.1:13337)
- SSE-стриминг событий (статус, логи) от демона к GUI
- SSD-friendly асинхронное логирование с разделением на потоки (
tracing+tracing-appender) - Конфигурация ядра передаётся через stdin (никогда не записывается на диск)
- Безопасное хранение настроек (permissions 0o600)
- Фоновое обновление баз GeoIP/GeoSite (автоматически каждые 24 часа)
- D-Bus конфигурация и PolicyKit для авторизации привилегированных операций
- CI/CD:
cargo check+cargo test+cargo clippyпри каждом пуше - GitHub Actions Release: автоматическая сборка бинарника и публикация при создании тега
- Локализация через gettext (русский, английский)
- Скрипты установки, обновления и удаления
- Поддержка Shadowsocks: парсинг ключей работает, генерация конфигурации частичная
- Поддержка WireGuard, SOCKS и HTTP: типы определены в
protocol.rs, интеграция с ядром не завершена - Flatpak: манифест (
ru.mark.vrxx.json) присутствует, но сборка не автоматизирована в CI - AppStream метаданные (
metainfo.xml.in): содержат placeholder-значения - Фрагментация пакетов (
enable_fragment): настройка в UI есть, реализация в конфигурации ядра не завершена
Rust(edition 2021) — основной языкGTK44.14+ сLibadwaita1.5+ — нативный GNOME-интерфейсTokio— асинхронный runtime для демона и сетевых операцийAxum— REST API сервер привилегированного демонаreqwest— HTTP-клиент для загрузки ядра и геобаз; SSE-подписки черезreqwest-eventsourcetun-rs+rtnetlink— управление TUN-интерфейсом и маршрутами на уровне ядра Linuxzbus— D-Bus клиент для взаимодействия сsystemd-resolved(DNS)serde+serde_json— сериализация настроек и генерация JSON-конфигурации Sing-boxtracing+tracing-subscriber+tracing-appender— структурированное асинхронное логированиеanyhow+thiserror— обработка ошибокgettext-rs— интернационализация (i18n)GResource+glib-compile-resources— компиляция UI-файлов в бинарникMeson— альтернативная система сборки для Flatpak и системной установки
| Крейт | Версия | Назначение |
|---|---|---|
gtk4 |
0.9 (features: v4_14) |
GTK4 UI toolkit |
libadwaita |
0.7 (features: v1_5) |
GNOME Libadwaita виджеты |
gdk4 |
0.9 | GDK4 backend |
tokio |
1 (features: full) |
Асинхронный runtime |
axum |
0.8.9 | REST API сервер демона |
axum-extra |
0.12.6 | Расширения Axum |
reqwest |
0.12 (features: socks, json, rustls-tls-native-roots) |
HTTP-клиент |
reqwest-eventsource |
0.6.0 | SSE-клиент для подписки на события |
ureq |
2.9 (features: socks-proxy, json) |
Синхронный HTTP-клиент |
serde |
1.0.228 (features: derive) |
Сериализация/десериализация |
serde_json |
1.0.149 | Работа с JSON |
anyhow |
1.0 | Удобная обработка ошибок |
thiserror |
1.0 | Пользовательские типы ошибок |
tracing |
0.1.44 | Структурированное логирование |
tracing-subscriber |
0.3.23 | Подписчик логов |
tracing-appender |
0.2.4 | Неблокирующая запись логов в файлы |
tun-rs |
2.8.2 (features: async) |
Создание TUN-интерфейса |
rtnetlink |
0.20.0 | Управление маршрутами через Netlink |
zbus |
5.15.0 (features: tokio) |
D-Bus клиент (systemd-resolved) |
ipnet |
2.12.0 | Типы IP-сетей |
async-channel |
2.3 | Асинхронные каналы (GUI ↔ демон) |
futures-util |
0.3 | Комбинаторы для Future |
tokio-stream |
0.1.18 (features: sync) |
Потоки данных Tokio |
gettext-rs |
0.7 (features: gettext-system) |
Интернационализация |
nix |
0.31.2 (features: signal) |
Unix-сигналы (SIGTERM/SIGKILL) |
base64 |
0.22.1 | Кодирование/декодирование VMess ключей |
chrono |
0.4.44 | Дата и время |
dirs |
6.0.0 | Стандартные директории платформы |
percent-encoding |
2.3.2 | URL-кодирование |
regex |
1.12.3 | Регулярные выражения |
tempfile |
3.27.0 | Временные файлы |
url |
2.5.8 | Парсинг URL |
| Инструмент | Версия | Обязательность |
|---|---|---|
| Rust (rustup) | 1.80+ | Обязательно |
| GTK4 | 4.16+ | Обязательно |
| Libadwaita | 1.6+ | Обязательно |
| libssl (OpenSSL) | — | Обязательно |
| pkg-config | — | Обязательно |
| gettext | — | Обязательно |
| Meson | 1.0+ | Опционально (для системной установки) |
Приложение использует ядро Sing-box. Официальные релизные архивы VRXX (vrxx-linux-x86_64.tar.gz) уже содержат протестированный бинарник ядра нужной версии. При самостоятельной сборке ядро может быть установлено в систему стандартным пакетным менеджером или помещено в ~/.local/share/vrxx/bin/sing-box.
| Ядро | Целевая версия | Совместимость |
|---|---|---|
| Sing-box | 1.13.18+ | Полная поддержка (актуальный DNS-стек, endpoints WireGuard, hijack-dns, sniff) |
Примечание: VRXX генерирует конфигурации по актуальной спецификации Sing-box 1.13.18+. Программа автоматически обнаруживает бинарник в системном
$PATH, стандартных директориях (/usr/bin,/usr/local/bin,/opt/vrxx/bin) или рядом с исполняемым файломvrxx, и кэширует его в~/.local/share/vrxx/bin/sing-box.
Ubuntu / Debian:
sudo apt install libgtk-4-dev libadwaita-1-dev libssl-dev pkg-config gettextArch / Manjaro:
sudo pacman -S gtk4 libadwaita openssl pkg-config gettextFedora:
sudo dnf install gtk4-devel libadwaita-devel openssl-devel pkg-config gettextgit clone https://github.com/Mark-TinZ/vrxx
cd vrxx
cargo build --releaseПриложение работает в двухпроцессной модели: привилегированный демон + GUI.
# Запуск демона (требует root для TUN и управления сетью)
sudo ./target/release/vrxx --daemon &
# Запуск графического интерфейса
./target/release/vrxx# Автоматическая установка (бинарник, иконка, .desktop файл)
./scripts/install.shПосле установки VRXX появится в меню приложений GNOME.
| Скрипт | Назначение |
|---|---|
scripts/install.sh |
Сборка + установка в /usr/local/bin/, иконка, .desktop файл, обновление кэшей |
scripts/update.sh |
Пересборка + обновление системных файлов |
scripts/uninstall.sh |
Удаление бинарника, иконки и .desktop файла (настройки в ~/.config/vrxx/ сохраняются) |
Репозиторий содержит два GitHub Actions workflow:
cargo check— проверка компиляцииcargo test— запуск тестов (черезxvfb-runдля GTK)cargo clippy -- -D warnings— линтинг без предупреждений
cargo build --release— сборка релизного бинарникаvrxx- Загрузка официального ядра
sing-box v1.13.18(linux-amd64) - Формирование полного дистрибутивного архива
vrxx-linux-x86_64.tar.gz(бинарникиvrxx+sing-box, иконка,.desktop, скриптыinstall.sh/uninstall.sh) - Формирование отдельного исполняемого файла
vrxx-linux-x86_64 - Генерация SHA-256 контрольных сумм и публикация релиза в GitHub Releases
| Протокол | Схема URI | Парсинг | Генерация конфигурации |
|---|---|---|---|
| VLESS | vless:// |
✅ полный | ✅ полный (TLS, Reality, uTLS, Flow) |
| VMess | vmess:// (Base64 JSON) |
✅ полный | ✅ полный (XUDP, auto security) |
| Trojan | trojan:// |
✅ полный | ✅ полный |
| Shadowsocks | ss:// |
✅ базовый | 🚧 частичный |
| WireGuard | — | 📋 тип определён | ❌ не реализовано |
| SOCKS | — | 📋 тип определён | ❌ не реализовано |
| HTTP | — | 📋 тип определён | ❌ не реализовано |
Демон запускается на 127.0.0.1:13337 (только localhost) и предоставляет следующие эндпоинты:
| Метод | Маршрут | Описание |
|---|---|---|
GET |
/api/ping |
Health check, возвращает "pong" |
GET |
/api/status |
Текущий статус: Disconnected, Connecting, Connected, Disconnecting, Error |
GET |
/api/is_running |
Проверка, запущен ли процесс ядра (JSON boolean) |
POST |
/api/proxy/start |
Запуск прокси. Тело: { core_type, config_json, tun_mode } |
POST |
/api/proxy/stop |
Остановка прокси (SIGTERM → 5с таймаут → SIGKILL) |
GET |
/api/events |
SSE-поток событий: StatusChanged, Log { level, message } |
GET |
/api/history |
Последние N лог-событий из кольцевого буфера |
| Путь | Назначение | Права |
|---|---|---|
~/.config/vrxx/settings.json |
Открытые настройки приложения, правила маршрутизации, белые списки | 0o600 |
~/.config/vrxx/data.dat |
Защищенное зашифрованное хранилище VPN-ключей (AES-256-GCM) | 0o600 |
~/.local/share/vrxx/logs/app.log |
Логи GUI | 0o600 |
~/.local/share/vrxx/logs/daemon.log |
Логи демона | 0o600 |
~/.local/share/vrxx/logs/all.log |
Объединённый поток логов | 0o600 |
~/.config/vrxx/geosite.dat |
База GeoSite (Loyalsoldier) | 0o600 |
~/.config/vrxx/geoip.dat |
База GeoIP (Loyalsoldier) | 0o600 |
~/.config/vrxx/geosite_ru.dat |
База GeoSite для RU (runet-geodata) | 0o600 |
~/.config/vrxx/geoip_ru.dat |
База GeoIP для RU (runet-geodata) | 0o600 |
~/.config/vrxx/geosite_antifilter.dat |
База GeoSite Antifilter | 0o600 |
~/.local/share/vrxx/bin/sing-box |
Бинарник ядра Sing-box (локальный/кэшированный) | 0o755 |
| Путь | Назначение |
|---|---|
/usr/local/bin/vrxx |
Бинарный файл приложения |
/usr/share/icons/hicolor/scalable/apps/ru.mark.vrxx.svg |
Иконка приложения |
/usr/share/applications/ru.mark.vrxx.desktop |
Ярлык в меню приложений |
.
├─ .github/
│ └─ workflows/
│ ├─ rust.yml # CI: check + test + clippy
│ └─ release.yml # Релизная сборка + GitHub Release
├─ data/
│ ├─ icons/ # SVG-иконки приложения (hicolor)
│ ├─ meson.build # Meson: установка данных
│ ├─ ru.mark.vrxx.daemon.conf # D-Bus конфигурация демона
│ ├─ ru.mark.vrxx.daemon.service.in # Systemd unit для D-Bus активации
│ ├─ ru.mark.vrxx.desktop.in # Шаблон .desktop файла (для Meson)
│ ├─ ru.mark.vrxx.gschema.xml # GSettings схема
│ ├─ ru.mark.vrxx.metainfo.xml.in # AppStream метаданные
│ ├─ ru.mark.vrxx.policy # PolicyKit политика (start/stop proxy)
│ └─ ru.mark.vrxx.service.in # Systemd unit для D-Bus активации GUI
├─ docs/
│ ├─ 01-setup.md # Установка и запуск
│ ├─ 02-architecture.md # Архитектура проекта
│ ├─ 03-daemon.md # Привилегированный демон
│ ├─ 04-ui.md # Пользовательский интерфейс
│ ├─ 05-domain.md # Протоколы и конфигурация ядра
│ ├─ 06-settings.md # Настройки приложения
│ ├─ 07-logging.md # Система логирования
│ ├─ 08-localization.md # Локализация
│ └─ screenshot/ # Скриншоты интерфейса (Dark / Light темы)
├─ locale/ # Скомпилированные .mo файлы (генерируются при сборке)
├─ po/
│ ├─ LINGUAS # Список поддерживаемых языков
│ ├─ POTFILES.in # Исходные файлы с переводимыми строками (33 файла)
│ ├─ vrxx.pot # Шаблон переводов
│ ├─ ru.po # Русский перевод
│ └─ en.po # Английский перевод
├─ scripts/
│ ├─ install.sh # Сборка + установка в систему
│ ├─ update.sh # Пересборка + обновление
│ └─ uninstall.sh # Удаление из системы
├─ src/
│ ├─ main.rs # Точка входа: аргументы, логирование, gettext, GResource, запуск
│ ├─ application.rs # VrxxApplication: GActions, меню, about dialog, импорт/экспорт
│ ├─ window.rs # VrxxWindow: навигация по страницам, статус-бар, поллинг
│ ├─ backend.rs # CoreBackend: высокоуровневый интерфейс к демону (VpnCore trait)
│ ├─ ipc.rs # DaemonClient: HTTP/SSE клиент к демону (REST API + SSE подписки)
│ ├─ protocol.rs # ProtocolSettings: определение типов протоколов
│ ├─ settings.rs # AppSettings + SettingsManager: настройки, VPN-ключи, маршрутизация
│ ├─ config.rs # Константы сборки (VERSION, GETTEXT_PACKAGE, LOCALEDIR)
│ ├─ daemon/
│ │ ├─ mod.rs # Точка входа демона: run(), run_with_manager()
│ │ ├─ api.rs # Axum роутер: REST API эндпоинты демона
│ │ ├─ core.rs # ProxyManager: жизненный цикл процесса Sing-box
│ │ ├─ events.rs # EventManager + SseTracingLayer: SSE стриминг и кольцевой буфер
│ │ ├─ network.rs # TunManager: создание TUN, маршруты, ip rule
│ │ ├─ dns.rs # DnsManager: systemd-resolved через D-Bus (zbus)
│ │ ├─ updater.rs # Поиск, валидация и локальное кэширование Sing-box
│ │ └─ tests.rs # Тесты демона
│ ├─ domain/
│ │ ├─ mod.rs # Реэкспорт модулей
│ │ ├─ key_parser.rs # Парсинг VPN-ключей (VLESS, VMess, Trojan, SS) + реконструкция URL
│ │ └─ singbox_config.rs # Генерация JSON-конфигурации Sing-box (спецификация 1.13.18+)
│ ├─ services/
│ │ ├─ mod.rs # Реэкспорт модулей
│ │ └─ geo_updater.rs # Фоновое обновление GeoIP/GeoSite баз (каждые 24ч)
│ └─ ui/
│ ├─ mod.rs # Реэкспорт страниц и компонентов
│ ├─ models.rs # GLib Object Model: VpnKeyObject, DomainObject, RoutingRuleObject
│ ├─ tests.rs # UI тесты
│ ├─ proxy_tests.rs # Тесты прокси-логики
│ ├─ menus.ui # Определение главного меню (XML)
│ ├─ pages/
│ │ ├─ mod.rs # Реэкспорт страниц
│ │ ├─ vpn_page.rs / .ui # Страница VPN: список ключей, подключение, статистика
│ │ ├─ proxy_page.rs / .ui # Страница настроек прокси
│ │ ├─ whitelist_page.rs / .ui # Страница белого списка и правил маршрутизации
│ │ └─ settings_page.rs / .ui # Страница настроек приложения
│ └─ components/
│ ├─ mod.rs # Реэкспорт компонентов
│ ├─ vpn_key_row.rs / .ui # Виджет строки VPN-ключа
│ ├─ theme_switcher.rs / .ui # Виджет переключения темы
│ └─ log_window.rs / .ui # Окно просмотра логов (SSE + файлы)
├─ build.rs # Компиляция GResource, PO-файлов, config fallback
├─ Cargo.toml # Манифест Rust-проекта
├─ Cargo.lock # Заблокированные версии зависимостей
├─ meson.build # Корневой Meson build (для системной установки / Flatpak)
├─ ru.mark.vrxx.desktop # Ярлык приложения для GNOME
├─ ru.mark.vrxx.json # Flatpak манифест (GNOME SDK 50)
├─ CONTRIBUTING.md # Руководство по разработке
├─ COPYING # Лицензия MPL-2.0
└─ README.md # Этот файл
Логи разделены по категориям и хранятся в ~/.config/vrxx/logs/:
| Файл | Содержимое |
|---|---|
app.log |
Логи графического интерфейса |
daemon.log |
Логи системного демона (создаётся при запуске с --daemon) |
all.log |
Объединённый поток всех событий |
Для просмотра логов можно использовать:
- Встроенное окно логов: меню
☰→Логиили действиеapp.view_logs - Открыть директорию логов: меню
☰→Открыть папку логов - Терминал:
tail -f ~/.config/vrxx/logs/all.log
Для увеличения детализации измените log_level в настройках на debug или trace.
Приложение поддерживает интернационализацию через gettext:
| Язык | Код | Статус |
|---|---|---|
| Русский | ru |
✅ полный перевод |
| Английский | en |
✅ полный перевод |
Язык выбирается в настройках приложения. Значение system автоматически определяет язык по системным переменным окружения (LANGUAGE, LC_ALL, LANG).
Подробнее о добавлении новых языков — в docs/08-localization.md.
Подробная документация находится в директории docs/:
| Файл | Содержание |
|---|---|
| 01-setup.md | Установка, запуск, конфигурация |
| 02-architecture.md | Архитектура: GUI ↔ Демон ↔ Ядро |
| 03-daemon.md | REST API демона, TUN, DNS, SSE |
| 04-ui.md | Страницы, компоненты, GLib модели |
| 05-domain.md | Парсинг ключей, генерация конфигурации |
| 06-settings.md | Настройки приложения, безопасность |
| 07-logging.md | Система логирования, tracing, SSE |
| 08-localization.md | Gettext, PO-файлы, добавление языков |
Правила командной работы описаны в CONTRIBUTING.md. Ключевые моменты:
- перед началом работы синхронизируйтесь с
main; - используйте отдельную ветку под каждую задачу;
- обязательно запускайте
cargo fmtиcargo clippy -- -D warningsперед коммитом; - запрещено использовать
.unwrap()и.expect()вне тестов; - главный поток GTK не должен блокироваться I/O-операциями.
Перед созданием Pull Request:
cargo fmt
cargo clippy -- -D warnings
cargo test# 1. Установка зависимостей (Ubuntu)
sudo apt install libgtk-4-dev libadwaita-1-dev libssl-dev pkg-config gettext
# 2. Сборка
git clone https://github.com/Mark-TinZ/vrxx && cd vrxx
cargo build --release
# 3. Запуск
sudo ./target/release/vrxx --daemon &
./target/release/vrxx
# 4. Импортируйте VPN-ключ из буфера обмена и нажмите «Подключить»Этот проект лицензирован на условиях Mozilla Public License 2.0.












