Astrail VPN
Десктопный клиент моего собственного VPN для macOS и Windows: подключение одним переключателем, маршруты по приложениям и доменам и kill switch, который перекрывает трафик, если туннель упал.
Закрытый код
git clone astrail-vpnДоступ запрещён: репозиторий приватный.Попросите у меня демоЗачем
Мне нужен был VPN-клиент, который не просто подключается: когда сайт ломается, он должен объяснить почему и уметь сказать, что дело не в VPN. Astrail и есть такой клиент для VPN, который я держу для себя и ещё одного человека.
Как это работает
Компьютер подключается одним переключателем. Через туннель можно пускать всё, кроме исключений, или только выбранные приложения и сайты, а проверка маршрута показывает, куда пойдёт домен. Kill switch перекрывает трафик, если туннель упал, а диагностика отличает блокировку со стороны сайта от медленного туннеля.
Что сделал я
Единственный автор приложения, платформенного слоя, который запускает туннель с системными правами, движка правил и сервера, к которому подключается клиент. Писал вместе с AI-агентами, а продуктовые принципы и архитектуру задавал сам.
Статус
Каждый день работает на моих компьютерах и не распространяется. Репозиторий закрыт, потому что в нём настройки подключения к моему серверу.
- Роль
- Единственный автор
- Период
- сентябрь – октябрь 2026
- Статус
- В разработке
- Стек
- Flutter Desktop, Dart, flutter_bloc, sing-box, Swift, launchd, macOS Packet Filter, Wintun, Windows Firewall, фрагментные шейдеры
Главное
- Подключение одним переключателем, таймер сессии и ракета, которая летит не быстрее настоящего подключения
- Два режима: всё, кроме исключений, или только выбранные приложения и сайты
- Правила по приложениям и доменам и проверка, куда пойдёт конкретный домен
- Kill switch в три уровня: перекрывает трафик на уровне системы, если туннель упал
- Диагностика отличает блокировку со стороны сайта от медленного туннеля
- Правила общие с телефоном, ноутбук и телефон направляют трафик одинаково
Не защищено00:00:00
Проверка маршрута
- youtube.comНапрямую
- github.comНапрямую
- *.byНапрямую
- Telegram (app)Напрямую
Kill switch включён: если туннель упадёт, трафик остановится, а не пойдёт в обход.


Главный экран: статус подключения, время сессии и задержка, режим маршрутизации в один клик (демо-данные).


Диагностика: проверка домена напрямую и через VPN или наблюдение на 15 секунд, пока открываешь сайт; потом весь домен можно направить через VPN или напрямую.


Настройки: трафик не уходит мимо туннеля при запуске, тема оформления и выбор, что перекрывает kill switch, если VPN оборвётся.
1 / 3 Главный экран: статус подключения, время сессии и задержка, режим маршрутизации в один клик (демо-данные).
Что это
Astrail: десктопный клиент VPN, который я держу для себя и ещё одного человека. Главная идея в том, что VPN-приложение должно не просто подключаться, а объяснять, что происходит: когда сайт не работает, оно измеряет проблему и может честно сказать «дело не в VPN».
Компьютер подключается одним переключателем. Пока идёт подключение, ракета летит от Земли к планете назначения, и анимация следует за настоящим состоянием соединения: если рукопожатие затянулось, ракета ждёт, а не делает вид, что прилетела. Счётчик показывает, сколько длится сессия, и учитывает только подтверждённое время, так что ночь в спящем режиме его не раздувает.
Два режима решают, что идёт через туннель: всё, кроме выбранных исключений, или только те приложения и сайты, которые я отметил. Приложения выбираются из нативного списка macOS с иконками, а домен одной галочкой захватывает и поддомены. Для каждого домена можно выбрать: автоматически, всегда через VPN, никогда через VPN или заблокировать. Перед тем как менять правило, можно проверить, куда пойдёт конкретный домен.
Если сайт ведёт себя странно, экран диагностики запускает короткую A/B-проверку, напрямую и через туннель одновременно, и отличает блокировку со стороны сайта от медленного туннеля. Журнал хранит историю без отдельного режима записи. Если закрыть окно, VPN продолжает работать из строки меню, а выход из приложения аккуратно его останавливает.
Что я сделал
Flutter-приложение для macOS и Windows поверх открытого ядра sing-box, платформенный слой, который запускает туннель с системными правами, и систему правил, общую с телефоном. Я сформулировал для него шесть принципов и держался их: пользователь решает, что нужно, а приложение решает, как; проверять, а не гадать; любое изменение обратимо; ручное решение важнее любого списка; приложение может сказать «это не я»; ничего не устаревает молча.


Главный экран: статус подключения, время сессии и задержка, режим маршрутизации в один клик (демо-данные).


Диагностика: проверка домена напрямую и через VPN или наблюдение на 15 секунд, пока открываешь сайт; потом весь домен можно направить через VPN или напрямую.


Настройки: трафик не уходит мимо туннеля при запуске, тема оформления и выбор, что перекрывает kill switch, если VPN оборвётся.
1 / 3 Главный экран: статус подключения, время сессии и задержка, режим маршрутизации в один клик (демо-данные).
Технические решения
- Туннель с системными правами. На macOS ядро работает как демон launchd за системным TUN-интерфейсом, а узкое правило sudoers разрешает только те команды, которые нужны приложению. На Windows это системная служба с Wintun. Единый
CoreServiceскрывает разницу от остального приложения. - Kill switch. Три уровня: выключен, блокировать только защищённый трафик или блокировать всё. Если ядро упало, якорь Packet Filter на macOS или правила Windows Firewall не дают трафику пойти в обход туннеля. При выходе из приложения блокировка снимается, и компьютер не остаётся без сети.
- Движок правил. Правила собираются слоями в конфигурацию ядра, с пробным прогоном перед применением и поиском конфликтов. Ручные решения всегда главнее списков, а системный слой для локальной сети и captive-порталов нельзя случайно выключить. Режимы переключаются через локальный API ядра, поэтому ядро не перезапускается и открытые соединения не рвутся.
- Честный статус. «Подключено» значит, что прошла настоящая проверка сетевого пути, а не просто что процесс жив.
- Классификатор сбоев. Отличает гео-блокировку со стороны сайта (HTTP 403) от таймаута туннеля и других типов сбоев, и диагностика указывает на настоящую причину.
- Синхронизация правил. Доменные правила уходят в клиент Karing на телефоне через небольшой сервис синхронизации с ревизиями, и оба устройства маршрутизируют одинаково.
- Планета на шейдере. Планета на главном экране это плоский рисунок, который фрагментный шейдер натягивает на сферу, с вращением, наклоном и освещением.
- Структура. Clean Architecture с BLoC и Cubit, тип
Result<T>для ошибок и юнит-тесты для маршрутизации, жизненного цикла ядра и движка правил, включая строгие тесты, которые фиксируют инварианты маршрутизации.
Результат
Каждый день работает на моих компьютерах и не распространяется. Репозиторий закрыт, потому что в нём настройки подключения к моему серверу, поэтому здесь нет ни ссылки, ни кода, а на скриншотах нет адресов и ключей.
Моя роль
Единственный автор: приложение, платформенный слой, система правил и сервер, к которому оно подключается. Писал вместе с AI-агентами для программирования, как и другие свои проекты, а продуктовые принципы и архитектуру определял сам.