Три ели по росту и изба с тёплым окном на холме в тайге, над ними северное сияние. Сгенерированная иллюстрация
Тот же холм перед рассветом, янтарная полоса у горизонта
Тот же холм в густом тумане, окно избы светится
Тот же холм ночью, месяц и звёзды, окно избы тёмное
Тот же холм ночью, красный отсвет у горизонта

UPN

Личный VPN для Windows на своих серверах. Погода над лесом показывает то, что обычно скрыто: что сейчас со связью.

Защищеновесь компьютер
0:00вернётся сама

Вы под защитой

Весь компьютер идёт через туннель. Сайты видят адрес сервера, а не ваш.

Настоящий адрес наружу0

Обрыв не видно. Связь пропала, а трафик уже незаметно пошёл напрямую, с настоящим адресом.

Было

Сессию рвала одна неудачная проверка. При смене маршрута сайты успевали увидеть настоящий адрес.

Стало

При обрыве интернет встаёт на паузу, связь возвращается сама, а маршрут меняется без снятия защиты. И пауза называется паузой, а не «ошибкой соединения».

Главный блок приложения в паузе: интернет на паузе, ваш IP скрыт, таймер 0:41 и кнопка «Повторить сейчас»
Главный блок приложения в паузе: интернет на паузе, ваш IP скрыт, таймер 0:41 и кнопка «Повторить сейчас»
Тёплое окно бревенчатой избы в ночном тумане, сгенерированная иллюстрация
Тайга здесь значит укрытие. Окно читается как спокойная сводка о связи, а не как пульт тревоги.

Окно и лес из одной системы

Хвойный сайдбар, туманно-мятные панели и сцена, погода которой показывает состояние. Экран собран из компонентов дизайн-системы «UPN Тайга», поэтому одинаковые элементы на всех экранах совпадают.

Главная UPN: состояние «Вы под защитой», сцена с северным сиянием, сессия, скорость, журнал
Главная UPN: подключение, шаг 2 из 5, сияние разгорается
Главная UPN: интернет на паузе, настоящий адрес скрыт, таймер и кнопка «Повторить сейчас»
Главная UPN: выключено, ночная сцена и кнопка «Подключить»
Главная UPN: защита не включилась, сказано что случилось и что сделать
Главная UPN: состояние «Вы под защитой», сцена с северным сиянием, сессия, скорость, журнал
Главная UPN: подключение, шаг 2 из 5, сияние разгорается
Главная UPN: интернет на паузе, настоящий адрес скрыт, таймер и кнопка «Повторить сейчас»
Главная UPN: выключено, ночная сцена и кнопка «Подключить»
Главная UPN: защита не включилась, сказано что случилось и что сделать

Экраны отрисованы из дизайн-системы приложения на вымышленных данных: серверы названы буквами, цифры условные. Окно на WPF собрано по этим макетам.

Пять погод вместо значка в трее

Из шести вариантов главного окна выбрана «Тайга». «Атлас» и «Северное сияние» остались запасными. Геометрия леса в приложении неизменна, меняется только погода. Здесь тот же приём снят крупно: один кадр, пять погод, а внизу настоящий блок окна в этом состоянии.

  • Тот же лес, погода: ясно. Сгенерированная иллюстрация
    ЯсноЗащищеноСияние горит мятой и лавандой, в избе свет.
    Главный блок приложения в состоянии «Защищено» на той же погоде
  • Тот же лес, погода: рассвет. Сгенерированная иллюстрация
    РассветПодключениеСветает, пока идут пять шагов: защита, канал, маршруты, сеть, проверка.
    Главный блок приложения в состоянии «Подключение» на той же погоде
  • Тот же лес, погода: туман. Сгенерированная иллюстрация
    ТуманПауза под защитойНичего не видно снаружи, но свет в окне горит.
    Главный блок приложения в состоянии «Пауза под защитой» на той же погоде
  • Тот же лес, погода: ночь. Сгенерированная иллюстрация
    НочьВыключеноМесяц, сияния нет, окно тёмное.
    Главный блок приложения в состоянии «Выключено» на той же погоде
  • Тот же лес, погода: красный отсвет. Сгенерированная иллюстрация
    Красный отсветОшибкаТревожная полоса у горизонта и сразу слова, что делать.
    Главный блок приложения в состоянии «Ошибка» на той же погоде
Три ели по росту на холме в тумане перед рассветом, сгенерированная иллюстрация

Сигнал‑лес

Три ели по росту: это и лес-укрытие, и индикатор сигнала. Высокая мятная ель означает выход. Знак читается до 16 пикселей в трее.

Прежний значок: лавандовая плитка с буквой UЛавандовую плитку с «U» я отверг. Лаванда осталась только в сиянии сцены.

Ели, которые вышли сломанными

При переносе в WPF сцена выглядела порванной. SVG заливает пути по правилу nonzero, а WPF по умолчанию берёт even‑odd, и перекрытия ярусов вырезались. Нашлось сравнением с эталоном: SVG дизайн-системы, отрисованным в Edge.

even‑odd, как было
nonzero, как в макете

Три слоя, и ни один не верит другому

  1. Окно

    C#, .NET 10, WPF

    Просит: подключи, смени маршрут, отключи. Прав у него нет, и падение окна ничего не ломает.

    Запуск без окна UAC: задача Windows стартует только файлы с хешами, закреплёнными при установке.

  2. Координатор

    служба с правами

    Держит туннель, следит за связью, сама возвращает её после обрыва.

    «Подключено» в окне появляется только по свежему отчёту: DNS, HTTPS, адрес выхода и защита.

  3. Запрет Windows

    Windows Filtering Platform

    Правило на уровне системы: трафик не выходит мимо туннеля, даже если упал движок.

    Новая версия проверяется в откатываемой транзакции до установки: в такой проверке прошло 95 фильтров.

Смена маршрута без единого окна

Новый запрет встаёт вместо удержанного одной транзакцией WFP. Сессия та же, приложение продолжает её вести.

Отключить и подключитьотвергнуто
настоящий адрес виден
Снять старый запрет, поставить новыйотвергнуто
Замена одной транзакциейв работе
между ними ни мгновения без запрета
26 с
обрыв канала, живая проверка
28 с
обновление при подключении
без переподключения
перезапуск окна: сессия подхвачена

Экраны, на которых живут

Журнал обычным языком

События строятся из записей координатора: паузы, переходы, сбои. Около 75 событий за двое суток совпали с тем, что происходило. Кнопка «Скопировать для разбора» отдаёт описание и код для поддержки.

Журнал: события по дням обычным языком, паузы, подключения, смены маршрута
Журнал: события по дням обычным языком, паузы, подключения, смены маршрута

Настройки без терминов

Каждая строка говорит, что произойдёт, а не как это устроено. Отправка данных тут же названа: нет, ни аналитики, ни отчётов об ошибках. Ключи зашифрованы Windows и на экран не выводятся.

Настройки: запуск с Windows, подключение при запуске, трей, восстановление связи, резерв
Настройки: запуск с Windows, подключение при запуске, трей, восстановление связи, резерв

Маршрут как выбор, а не ссылка

Выход, протокол и путь. Быстрый выбор по Ctrl+K откуда угодно, из меню трея тоже. Выбранный и активный маршрут это разные состояния, и окно их различает.

Карточка маршрута: путь этот ПК, Сервер A, Сервер B, что видят сайты, где хранятся ключи
Карточка маршрута: путь этот ПК, Сервер A, Сервер B, что видят сайты, где хранятся ключи
Список маршрутов со статусами: работает, готов, проверяем, замеров нет
Список маршрутов со статусами: работает, готов, проверяем, замеров нет

Приложение это папка, а не exe

Выбор программ мимо туннеля идёт глазами, по списку с иконками. Правило держит папку программы, поэтому переживает обновление версии и ловит вспомогательные процессы. Принтер в той же Wi‑Fi при этом остаётся видно.

Правила: приложения напрямую, строка «Отменить» сразу после добавления
Правила: приложения напрямую, строка «Отменить» сразу после добавления
Подтверждение: вернуть обычную сеть, сайты увидят ваш настоящий IP, кнопка «Остаться на паузе»
Подтверждение: вернуть обычную сеть, сайты увидят ваш настоящий IP

Опасное с последствием

«Вернуть обычную сеть» всегда вторая кнопка. Под ней строка о том, что будет, а потом ещё подтверждение. Попытки восстановления идут с паузой 5, 15 и 30 секунд без ограничения, пока стоит запрет.

Шкала качества 92 из 100 из первого макета

Оценка 92 из 100 в приложение не прошла

Красивая шкала была в макете, но UPN такого не измеряет. Чего нет в данных, того нет и на экране: вместо пустого места честное пустое состояние, а неизвестное значение показывается как прочерк.

Нативное окно Windows

Три темы: светлая, тёмная, контрастная. Jost и Manrope встроены статичными начертаниями: вариативный шрифт WPF рисует только в базовом весе. Окно сжимается под свой монитор, на низком экране сводка прокручивается, а не обрезается. Анимации короче 300 мс и выключаются вместе с анимациями Windows.

  • CtrlKвыбор маршрута
  • CtrlAltUподключить из любого окна
  • Ctrl1…5страницы
  • CtrlFпоиск маршрута
Главная UPN в тёмной теме: защищено, скорость, журнал
Главный блок приложения: вы под защитой, путь Этот ПК, Сервер A, Сервер B

Что стало быстрее

Один постоянный процесс PowerShell на подключение вместо нового на каждую команду: модули сети грузятся один раз.

  • Переподключение27–28 с 17–18 с
  • Подъём сессии22 с 15–16 с
  • Снимок сети2,7 с 0,8 с
  • Проверка адаптера0,83 с 0,03 с

Скорость за один день

Каскад через два сервера
73–76 Мбит/с
Прямой путь
4–34 Мбит/с

Замер одного дня на моём канале, а не обещание для всех сетей. Важнее ширины полосы здесь её ровность.

Самое трудное

«Отключить» отказал 6 раз за ночь

Жёсткий сброс пришёлся между двумя записями: фильтры в Windows уже стояли, а файл состояния о них не знал. Кнопка снимала только точно записанную политику, поэтому отказывала. За тот день случилось 12 аварийных перезагрузок: шла отладка железа. UPN их не вызывал, но они вскрыли дефект.

Теперь «Отключить» снимает всё в любом состоянии, а запрет живёт до перезагрузки. У решения есть цена: около минуты от загрузки до подключения программы выходят напрямую. Я её принял осознанно и записал.

  1. 01:52Две аварийные перезагрузки подряд. Сессия в этот момент переподключалась.
  2. 01:56Шесть нажатий «Отключить» за 12 минут. Все шесть отказали, компьютер без сети.
  3. 06:12Ещё пять перезагрузок и 21 попытка восстановления с той же ошибкой.
  4. 10:00Сеть вернул только спасательный скрипт: сброс служб и настроек вручную.
  5. 15:51Установлено исправление: «Отключить» снимает запрет в любом состоянии.

Честно об ограничениях

  • Личный инструмент на экспериментальной стадии, не коммерческий продукт. Пользовательских метрик нет
  • Утечек не нашлось в проверенных сценариях: обрыв, переподключение, обновление, смена маршрута, перезапуск. Для всех возможных отказов это не гарантия
  • Если живых маршрутов нет, связи тоже нет: так задумано
  • Новая схема «Отключить» прошла тесты и установлена, живая перезагрузка с ней ещё не проверена

Что дальше

  • Подробный журнал канала

C#, .NET 10, WPF, Rust, Windows Filtering Platform, TUN

Следующий кейсЛучНажал кнопку на приборе, и замер лёг на нужную стену. Из замеров сами собираются план, 3D и чертёж. Без интернета и аккаунта.