yukovsky.
Открыт к предложениям

Astrail VPN

Десктопный клиент моего собственного VPN для macOS и Windows: подключение одним переключателем, маршруты по приложениям и доменам и kill switch, который перекрывает трафик, если туннель упал.

Зачем

Мне нужен был 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 включён: если туннель упадёт, трафик остановится, а не пойдёт в обход.

Примеры адресов, без данных реального сервера.
  • Главный экран Astrail VPN с демо-данными: статус «Защищено», время сессии и задержка, кнопка «Отключить», планета назначения и три режима маршрутизацииГлавный экран Astrail VPN с демо-данными: статус «Защищено», время сессии и задержка, кнопка «Отключить», планета назначения и три режима маршрутизации

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

  • Вкладка «Диагностика» Astrail VPN: проверка example.org, напрямую отказ, через VPN открылся, наблюдение на 15 секунд и кнопки «Через VPN» и «Напрямую» для всего доменаВкладка «Диагностика» Astrail VPN: проверка example.org, напрямую отказ, через VPN открылся, наблюдение на 15 секунд и кнопки «Через VPN» и «Напрямую» для всего домена

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

  • Настройки Astrail VPN: подключение при запуске, запрет трафика до подключения, светлая и тёмная тема, обновление списков правил, профили сетей и варианты kill switchНастройки Astrail VPN: подключение при запуске, запрет трафика до подключения, светлая и тёмная тема, обновление списков правил, профили сетей и варианты kill switch

    Настройки: трафик не уходит мимо туннеля при запуске, тема оформления и выбор, что перекрывает kill switch, если VPN оборвётся.

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

Что это

Astrail: десктопный клиент VPN, который я держу для себя и ещё одного человека. Главная идея в том, что VPN-приложение должно не просто подключаться, а объяснять, что происходит: когда сайт не работает, оно измеряет проблему и может честно сказать «дело не в VPN».

Компьютер подключается одним переключателем. Пока идёт подключение, ракета летит от Земли к планете назначения, и анимация следует за настоящим состоянием соединения: если рукопожатие затянулось, ракета ждёт, а не делает вид, что прилетела. Счётчик показывает, сколько длится сессия, и учитывает только подтверждённое время, так что ночь в спящем режиме его не раздувает.

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

Если сайт ведёт себя странно, экран диагностики запускает короткую A/B-проверку, напрямую и через туннель одновременно, и отличает блокировку со стороны сайта от медленного туннеля. Журнал хранит историю без отдельного режима записи. Если закрыть окно, VPN продолжает работать из строки меню, а выход из приложения аккуратно его останавливает.

Что я сделал

Flutter-приложение для macOS и Windows поверх открытого ядра sing-box, платформенный слой, который запускает туннель с системными правами, и систему правил, общую с телефоном. Я сформулировал для него шесть принципов и держался их: пользователь решает, что нужно, а приложение решает, как; проверять, а не гадать; любое изменение обратимо; ручное решение важнее любого списка; приложение может сказать «это не я»; ничего не устаревает молча.

  • Главный экран Astrail VPN с демо-данными: статус «Защищено», время сессии и задержка, кнопка «Отключить», планета назначения и три режима маршрутизацииГлавный экран Astrail VPN с демо-данными: статус «Защищено», время сессии и задержка, кнопка «Отключить», планета назначения и три режима маршрутизации

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

  • Вкладка «Диагностика» Astrail VPN: проверка example.org, напрямую отказ, через VPN открылся, наблюдение на 15 секунд и кнопки «Через VPN» и «Напрямую» для всего доменаВкладка «Диагностика» Astrail VPN: проверка example.org, напрямую отказ, через VPN открылся, наблюдение на 15 секунд и кнопки «Через VPN» и «Напрямую» для всего домена

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

  • Настройки Astrail VPN: подключение при запуске, запрет трафика до подключения, светлая и тёмная тема, обновление списков правил, профили сетей и варианты kill switchНастройки Astrail VPN: подключение при запуске, запрет трафика до подключения, светлая и тёмная тема, обновление списков правил, профили сетей и варианты kill switch

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

CV.pdf