Как устроено приложение

Раздел для разработчиков, которые будут поддерживать и дорабатывать клиент. Здесь по порядку: как трафик проходит через приложение, что происходит при подключении и кто за что отвечает.

1 Путь трафика 2 Последовательность подключения 3 Компоненты и зоны ответственности 4 Маршрутизация
Шаг 1 · Путь трафика

Как трафик проходит через приложение

Каждая платформа использует свой набор компонентов. Трафик идёт по цепочке сверху вниз — от приложения пользователя до интернета.

Windows

WPF · .NET 8
WPF (.NET 8)sing-boxxray-core WinTun
VPN ClientWPF UI
sing-boxмаршрутизация
WinTunTUN-адаптер
Интернет
Когда добавляется xray. Транспорт XHTTP sing-box нативно не поддерживает. В этом случае xray-core поднимается как локальный мост, и цепочка становится такой:
sing-box → SOCKS5 → xray-core → XHTTP
Для остальных протоколов xray не запускается — sing-box работает напрямую.

Android

Kotlin · Jetpack Compose
KotlinComposexray-core libXraytun2socks
VPN ServiceAndroid VpnService
xray-corelibXray
tun2socksTUN → SOCKS
Интернет
Один нативный модуль. xray-core и tun2socks собраны вместе в единый gomobile-биндинг (один Go-рантайм). Поэтому лишних процессов нет, а трафик не зацикливается через TUN.
Шаг 2 · Последовательность подключения

Что происходит, когда нажимают «Подключить»

Порядок операций важен: защита от утечек включается только после того, как туннель и маршруты готовы. Если шаг падает — соединение не открывается (fail-closed).

Windows

  1. 1
    UI → служба

    Интерфейс отправляет команду connect фоновой службе по именованному каналу (named pipe).

  2. 2
    Запуск движка

    Служба запускает sing-box. Если профиль использует XHTTP — дополнительно поднимает xray-core как локальный мост.

  3. 3
    TUN и маршруты

    sing-box создаёт виртуальный адаптер WinTun и прописывает маршруты согласно выбранному режиму.

  4. 4
    Kill Switch

    Включается блокировка на уровне системы (WFP) — только сейчас, когда туннель уже поднят.

  5. 5
    Готово

    Трафик идёт через VPN. Смена сервера — перезапуск движка «на месте», без остановки службы.

Android

  1. 1
    Запуск VpnService

    Пользователь подтверждает разрешение VPN, запускается foreground-сервис Android.

  2. 2
    Создание TUN

    Сервис создаёт TUN-интерфейс и исключает из туннеля приложения по правилам split tunnel.

  3. 3
    Запуск xray-core

    Через libXray поднимается xray с конфигом выбранного сервера.

  4. 4
    Связка tun2socks

    tun2socks направляет пакеты из TUN в локальный SOCKS-вход xray.

  5. 5
    Готово

    Трафик идёт через VPN. Смена сервера — перезапуск «на месте» внутри того же сервиса.

Шаг 3 · Компоненты

Кто за что отвечает

Чтобы быстро сориентироваться в коде: основные части клиента и их зона ответственности.

Windows

КомпонентРоль
UI WPFинтерфейс, команды службе по named pipe
Служба Serviceуправляет VPN в фоне с правами системы
sing-boxмаршрутизация, сетевой стек, владеет TUN
xray-coreмост только для транспорта XHTTP
WinTunвиртуальный сетевой адаптер
Kill Switch WFPблокировка трафика при обрыве

Android

КомпонентРоль
UI Composeинтерфейс на Kotlin + Jetpack Compose
VpnServiceсистемный VPN Android, владеет TUN
xray-core libXrayпротоколы и шифрование
tun2socksсвязывает TUN с локальным входом xray

Подробнее об авторизации, подписках и форматах — в разделе Разработчикам.

Шаг 4 · Маршрутизация

Какой трафик идёт через VPN

Режимы совпадают по смыслу на обеих платформах, но реализованы по-разному — нативными средствами каждой ОС.

All VPN

all

Весь трафик идёт через VPN.

Bypass RU

bypass-ru

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

Whitelist VPN

whitelist

Локальные ресурсы — напрямую, остальное — через VPN.

Split tunnel

Отдельные приложения можно исключить из туннеля по имени или пути процесса (process name / process path) — это правила маршрутизации sing-box.

Full Tunnel

full

Весь трафик идёт через VPN.

Bypass RU

bypass-ru

Российские сервисы — напрямую, зарубежные — через VPN.

Whitelist Only

whitelist

Напрямую — только выбранный список (РФ и локальные), всё остальное идёт через VPN.

Split tunnel

Отдельные приложения исключаются из туннеля через Android VPN API — per-app маршрутизация на уровне системы.

Для режимов Bypass RU и Whitelist Android по запросу скачивает базы geoip/geosite (~1 МБ) — кнопкой в разделе «Маршрутизация». Без них режим работает как Full Tunnel.