OshaVPN: VPN-клиент для Android, Windows 10/11 и Windows 7
собственное приложение на замену NekoBox, Hiddify и v2rayNG — на тестировании у пользователей
VPN-клиент под ключ для Android, Windows 10/11 и Windows 7: одна кнопка «Подключить», автовыбор входа гонкой, российские сайты напрямую, kill switch и самообновление по воздуху. Сменное ядро Xray или sing-box, подписки Marzban.

Задача
У заказчика есть собственный VPN-сервис на панели Marzban, а раздавать доступ приходилось через чужие клиенты: NekoBox, Hiddify, v2rayNG. Пользователю без технической подготовки нужно было разобраться в протоколах, вставить конфиг руками, выбрать вход из списка с техническими именами и при обрыве самому искать другой. Каждый такой шаг оборачивался вопросом в поддержку.
Вторая боль — парк техники. Часть пользователей работает на Windows 7, под которую современные клиенты не собираются, а на телефонах нужны раздача интернета на ноутбук и работа российских сервисов без переключения VPN туда-сюда.
Нужен был свой клиент с одной кнопкой «Подключить»: подписка вводится один раз или приходит ссылкой из бота, все настройки выставлены за пользователя, российские сайты и приложения работают напрямую, мимо туннеля.
Решение
Приложение OshaVPN для Android, Windows 10/11 и Windows 7. Что сделано по журналу выпусков:
- Одна кнопка с тремя состояниями: выключено, подключаемся, работает. На главном экране срок подписки и остаток трафика.
- Ввод подписки вставкой ссылки, QR-кодом или одним касанием по ссылке
oshavpn://из бота. До трёх подписок с переключением между ними. - Автообновление подписок при запуске и раз в час, без переподключения, если входы не изменились. Мёртвая подписка помечается «не отвечает» с предложением перейти на живую.
- Автовыбор входа «гонкой» и переключение при обрыве; память «что сработало в этой сети».
- Раздельная маршрутизация: Россия напрямую, переключатель «всё через VPN», каталог «Сервисы» с правилами «через VPN / напрямую», игры и торренты мимо туннеля.
- Kill switch: фильтры WFP на Windows, системная «постоянная VPN» на Android.
- Самообновление по воздуху с подписанным списком выпусков, каналами тестеров и обычным, откатом на Windows при сбое.
- Замер «до сервера» без VPN, поиск чужих VPN и обходчиков DPI с предложением их выключить, автозапуск и автоподключение после загрузки системы.
- Встроенный установщик на Windows, экран «Почти готово» с разрешениями на Android, раздел «Как пользоваться» и история версий для тестеров.
- «Разведка сети»: прогон по российским и зарубежным целям, который отличает обычный интернет от сильных ограничений и белых списков.
- Диагностика: журналы приложения и ядра в одном формате, отчёты на приёмник разработчика с маскированием секретов.
Чего в приложении нет и не будет: ручного редактирования конфигов, выбора протоколов и шифров, списков нод с техническими именами.
Как это устроено
Сменное ядро: sing-box и Xray за одним слоем
VPN-ядро — программа, которая шифрует трафик и гонит его через туннель. Собственный код клиента (интерфейс, подписка, маршрутизация, выбор входа) с ядром напрямую не работает: между ними узкий слой engine-api, а ядро подключается своей реализацией. Первым ядром был sing-box, вторым — Xray, и сейчас Xray основное: все входы стенда, включая Reality и XHTTP, подключаются с одной подписки. На Android оба ядра собраны в одну библиотеку через gomobile, на Windows работают отдельными процессами. Переключение — настройкой, без переустановки. Windows 7 остаётся на sing-box: Xray на новом Go под ней не запускается.
Автовыбор входа гонкой
При подключении входы из подписки пробуются одновременно, и ставится тот, который первым открыл интернет — на стенде гонка занимает 0,9–1,3 секунды. Вход без проходящего TLS-рукопожатия живым не считается и автоматикой не выбирается. После неудачной пробы та же гонка ищет другой рабочий вход. На Xray смена входа идёт через API маршрутизации за доли секунды, без перезапуска ядра. Если все входы разом отвечают ошибкой, а сеть жива, клиент спрашивает у сервера страницу состояния: когда упал путь за входом, приложение не перебирает входы, а спокойно ждёт с надписью «сервер временно недоступен».
Раздельная маршрутизация: Россия напрямую
Наборы правил geoip-ru, geosite-category-ru и geosite-yandex встроены в приложение и обновляются через туннель; для Xray те же списки собраны в geoip.dat и geosite.dat. Локальная сеть, российские домены, Яндекс, MAX и игры идут напрямую, торренты — мимо туннеля в любом режиме. На Windows игры и торрент-клиенты узнаются ещё и по имени процесса. Каталог «Сервисы» из общего файла позволяет выбрать, что идёт через VPN, а что напрямую, включая связку «лаунчер и античит следом за игрой».
Kill switch: WFP на Windows и always-on VPN на Android
WFP (Windows Filtering Platform) — системный механизм фильтрации сетевого трафика. В режиме TUN клиент ставит фильтры «защита от утечек»: исходящее мимо туннеля закрыто, DNS мимо туннеля закрыт всегда, локальная сеть открыта по настройке. При обрыве, обновлении и перезапуске ядра программы видят «нет интернета», а не настоящий адрес. На Android TUN живёт до нажатия «Отключить»; полную защиту до запуска приложения даёт системная «постоянная VPN» с блокировкой без VPN, и главный экран напоминает, если она выключена.
Самообновление с подписанным списком выпусков
Список выпусков подписан ключом ECDSA P-256, открытый ключ вшит в клиенты: подменённый список и чужой ключ отвергаются, что закреплено тестами. Android качает APK под свою архитектуру и ставит его сам при погасшем экране; Windows скачивает только изменившиеся файлы, а обновляльщик умеет откатывать замену при сбое. Проверка раз в час, установка при скрытом окне и без ввода пользователя. Есть каналы для тестеров и обычный, а в «Для разработчика» — отказ от обновлений.
Разведка сети для белых списков
В регионах с «белыми списками» открываются только российские сайты. «Разведка» прогоняет за несколько минут около двухсот целей мимо VPN: российские и зарубежные сайты, хостинги и CDN, подмену имени в TLS, голый HTTP, QUIC, DNS, данные после рукопожатия. Итог формулируется словами — обычный интернет, сильные ограничения или белые списки — и уходит разработчику отчётом; цели-кандидаты на новый вход приходят с сервера подписанным файлом, без выпуска приложения.
Диагностика без секретов
Журналы приложения и ядра пишутся в одном формате строки, ядро — в файл с ротацией. Отчёты о падениях, пробах входов и аномалиях уходят на приёмник разработчика через очередь на диске, а ссылки подписок, ключи, UUID, пароли и токены маскируются ещё при записи журнала. Подробно — в кейсе про приёмники отчётов.
Клиент для Windows 7
Отдельная сборка на .NET Framework 4.8 и WinForms, общая логика с основным клиентом. TUN на семёрке нет, поэтому работает системный прокси: браузеры и программы, уважающие прокси, идут через туннель. Ядро — sing-box в сборке под старую Windows, вход по WS+TLS.
Результат
- Три платформы одним продуктом: Android 0.15.13, Windows 10/11 и Windows 7 — 0.15.12.
- Все входы стенда (Reality, XHTTP, QUIC, WS+TLS) подключаются на Xray с одной подписки; протоколы VLESS, Trojan, Shadowsocks, а на sing-box ещё Hysteria2 и TUIC.
- Расчётный худший случай ухода на другой вход при обрыве — 14,5 секунды.
- Раздельная маршрутизация проверена заказчиком с телефона: Госуслуги, Сбер, Ozon, Wildberries.
- Самообновление проверено вживую: обновление при включённом VPN ставится за секунды, туннель поднимается сам.
- В отчётах на приёмнике нет ни одного UUID, ссылки подписки или ключа — проверено на настоящих отчётах.
Технологии: что и зачем
- Kotlin, Jetpack Compose (Material 3) — приложение для Android с адаптивной раскладкой и темой как в системе.
- C# / .NET 10, WPF — клиент для Windows 10/11; ядра запускаются отдельными процессами, TUN через wintun.
- .NET Framework 4.8, WinForms — отдельный клиент для Windows 7, общая логика из
OshaVpn.Core. - Xray — основное ядро: Reality, XHTTP, VLESS, Trojan, Shadowsocks.
- sing-box — второе ядро для сравнения и для Windows 7; Hysteria2 и TUIC.
- gomobile, Docker — сборка обоих ядер в одну библиотеку для Android.
- Marzban — серверная сторона: подписки и учёт пользователей; клиент читает подписки Marzban и Remnawave.
Статус
На тестировании у пользователей. Последний выпуск — 29 сентября 2026 года: Android 0.15.13, Windows 10/11 и Windows 7 — 0.15.12. Клиент для iPhone и iPad написан и собирается, но отложен до отдельного решения.
Известные ограничения по README: клиент работает только по IPv4; защита от утечек на Windows проверена самопроверкой и тестами, живой прогон на чистой машине с правами администратора ещё впереди; клиент для Windows 7 собран и запускался на Windows 11, на настоящей семёрке не проверялся. Режим тестера включён по умолчанию, потому что все сборки пока тестовые; в сборки вшита тестовая подписка — можно установить и посмотреть, как это работает, без регистрации.
Клиент — часть одного VPN-проекта вместе с биллингом Tech Poly VPN, трассой РФ → Европа и прошивкой для роутера, которая раздаёт VPN на весь офис без приложений.
Вопросы по проекту
Зачем нужен свой VPN-клиент, если есть NekoBox, Hiddify и v2rayNG?
На каких платформах работает приложение?
Как работает автовыбор входа при обрыве?
Весь ли трафик идёт через VPN?
Что защищает от утечки трафика при падении ядра?
Можно ли заказать такой клиент под свой VPN-сервис?
Ещё по этому направлению
OshaPlay: аудиофильский плеер для Android
bit-perfect вывод на USB-ЦАП и аудиокниги — собственный продукт, версия 0.10.0
Приёмник crash-отчётов для своих приложений
OshaPlay и VPN-клиент присылают падения и журналы на собственные серверы
Нужно похожее?
Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.