OshaVPN Router: своя прошивка для MikroTik — VPN на весь офис
прошили заказчику MikroTik с Авито: весь офис за VPN, российское напрямую, зарубежное через туннель, на устройствах ничего не нужно ставить
Своя прошивка на OpenWrt для MikroTik hAP ac²: весь офис получает VPN без приложений на устройствах, российские сайты идут напрямую, при сбое зарубежное закрывается, обновления приходят по воздуху с откатом. Своя правка ядра Xray подняла скорость через VPN с 10 до 48 Мбит/с. Роутер заказчик купил сам на Авито за 6 000 ₽, за прошивку, программу, приложение и подписку на год заплатил нам 12 000 ₽.
Задача
Руководитель небольшого офиса хотел VPN «на весь офис». Сотрудники и он сам ничего не ставят на свои устройства, российские сервисы — банки, Госуслуги, маркетплейсы — работают напрямую, а зарубежное идёт через серверы OshaVPN. Если что-то сломалось, офис не должен молча выйти в интернет мимо VPN. И роутер должен обновляться сам, без выезда специалиста.
Бюджет — как у обычного роутера, а не как у корпоративного шлюза. Роутер заказчик купил сам: MikroTik hAP ac² с рук на Авито за 6 000 ₽. От нас — прошивка, программа и подписка.
Решение
Своя прошивка OshaVPN Router на основе OpenWrt и программа на USB-флешке. Что получил заказчик:
- VPN на весь офис по Wi-Fi и кабелю, без приложений на устройствах.
- Россия напрямую. 8 691 подсеть России и российские домены идут мимо VPN, остальное — через туннель.
- Защита при отказе. Пока VPN не работает, зарубежное закрыто, российское работает. Защита живёт во внутренней памяти и включается, даже если вынуть флешку.
- Обновления по воздуху с проверкой подписи, подтверждением и автоматическим откатом.
- Страница OshaVPN в веб-интерфейсе роутера: состояние, срок подписки, смена подписки, проверка связи и журнал — без командной строки.
- Запасная подписка: если основные серверы недоступны, трафик сам уходит на запасные и возвращается, когда основные ожили.
- «Разведка» сети — около 65 проверок за 12 секунд: обычный интернет, сильные ограничения или белые списки.
- Журнал, пульс и автоотчёты: причина любого сбоя видна без выезда, а помочь можно удалённо через защищённый туннель.
Как это устроено
Почему OpenWrt, а не RouterOS
Родная система MikroTik закрыта: своё VPN-ядро в неё не поставить, контейнеры на этой модели не поддерживаются, а встроенные средства не умеют протокол VLESS. WireGuard заказчик отверг: внутри российских сетей его режут. Поэтому роутер переведён на OpenWrt 25.12 — открытую систему для роутеров. Прошивка собрана официальным Image Builder и весит 9,8 МБ.
Роутер прошивается загрузкой по сети, без пароля от RouterOS, а перед прошивкой снимается полная копия флеша: вернуть заводскую систему можно в любой момент.
Путь трафика
DNS-запросы устройств перехватывает роутер: российские имена он спрашивает напрямую, остальные — через VPN. Дальше пакет разбирает межсетевой экран nftables. Частные адреса и подсети России уходят напрямую силами ядра Linux, с аппаратным ускорением, — VPN-программа их даже не видит. Всё прочее через TPROXY передаётся ядру Xray: оно по имени сайта решает, пустить соединение напрямую или в туннель, и выбирает самый быстрый живой вход по замеру раз в минуту.
Утечки закрыты мелочами: IPv6 в локальной сети выключен, «зашитые» DNS-серверы на устройствах перехватываются, DNS поверх TLS отбивается, порты Xray снаружи недоступны.
Флешка и внутренняя память
Ядро Xray весит 32 МБ, а во внутренней памяти роутера после OpenWrt остаётся около 5 МБ. Поэтому внутри — загрузчик и защита, а программа, ядро, списки, статистика и две версии для отката — на флешке. Без флешки роутер остаётся роутером: интернет и российские сайты работают, зарубежное закрыто, пока флешку не вернут.
Логика написана на ucode — встроенном языке OpenWrt. Второй процесс на Go рядом с Xray съел бы 15–20 МБ памяти, которой и так мало, а скрипты запускаются раз в минуту и ничего не держат.
Обновления, которые нельзя сломать
Тот же сервер и тот же ключ подписи, что у приложения OshaVPN. Роутер качает только изменившиеся файлы: обновление занимает 15–20 секунд. Новая версия сама подтверждает, что VPN поднялся; не поднялся за 90 секунд — откат и метка «плохая». Если новая версия не запускается вовсе, через 5 минут её откатывает загрузчик во внутренней памяти. Обновления проверены на настоящем роутере пять раз подряд.
День второй: почему «сетка валится», и разгон слабого железа
Роутер поработал на домашнем канале 500 Мбит/с, и пришла жалоба: связь иногда отваливается, а когда работает — медленно. За день вышло восемь версий, и все правки — по замерам, а не по догадкам:
- Память. Профилировщик Go показал, что ядро тратит 70% процессора на сборку мусора: один из транспортов держал по 512 КБ буфера на каждое соединение. На роутере он переведён в другой режим — куча упала с 29 до 5–11 МБ.
- Шифр. У процессора нет аппаратного AES: на одном ядре AES-GCM даёт 25 Мбит/с, ChaCha20 — 75. Своя правка Xray ставит ChaCha20 первым на таких процессорах, как делает настоящий Chrome на слабых ARM. Через VPN стало 42–48 Мбит/с вместо 10.
- Кабель. «Медленно напрямую» оказалось битой парой в коннекторе WAN: порт падал до 100 Мбит/с. После переобжима — гигабит и до 350 Мбит/с.
- Проверки на отказ вживую: выдернули питание — VPN поднялся сам за 2 минуты; отключили WAN — связь вернулась сама; вынули флешку — зарубежное закрылось, российское работало, после вставки VPN поднялся за 11 секунд.
Подробная история разгона — в статье «Как мы сделали заказчику VPN на весь офис из MikroTik с Авито».
Результат
- Весь офис за одним роутером получает VPN без приложений на устройствах; российские сервисы работают напрямую.
- Через VPN около 48 Мбит/с загрузки и 38 отдачи, напрямую до 350 Мбит/с на канале 500 Мбит/с.
- Защита при отказе, обновления с откатом и восстановление после сбоев питания, WAN и флешки проверены на настоящем железе.
- Наша работа стоила заказчику 12 000 ₽: прошивка, программа, приложение OshaVPN и подписка на год. Роутер он купил сам на Авито за 6 000 ₽.
Технологии: что и зачем
- OpenWrt 25.12 — открытая система для роутеров вместо закрытой RouterOS; своя прошивка через Image Builder.
- ucode — встроенный язык OpenWrt: вся логика программы без лишнего процесса в памяти.
- Xray — VPN-ядро с протоколами VLESS, Reality и XHTTP, собранное из исходников со своей правкой выбора шифра.
- nftables, TPROXY, dnsmasq — раздельная маршрутизация: Россия напрямую ядром Linux, остальное в Xray.
- C и mbedTLS — маленькая программа проверки подписи обновлений: в OpenWrt нет openssl.
- Docker — проверки без железа: OpenWrt в контейнере с настоящей системой запуска, обновлением и откатом.
Статус
Роутер прошит и прошёл проверки на канале 500 Мбит/с, включая отказ питания, WAN и флешки; передаётся заказчику. Ограничение железа: hAP ac² упирается в процессор около 48 Мбит/с через VPN, поэтому для офисов на 10+ устройств следующим кандидатом стоит мини-ПК на Intel N100 — программа под x86_64 уже собирается.
Роутер — четвёртая часть VPN-проекта вместе с приложением OshaVPN, биллингом Tech Poly VPN и трассой РФ → Европа.
Вопросы по проекту
Зачем VPN на роутере, если есть приложение на телефон?
Какой роутер подходит и почему не родная система MikroTik?
Что будет, если VPN перестанет работать?
Какая скорость через VPN?
Сколько это стоит?
Как роутер обновляется и кто его чинит?
Ещё по этому направлению
Переговорка (ToshaStream): стрим-сервер и голосовая для команды
собственный продукт в продакшене, версия 1.50.0: голос, чаты и закрытый эфир
VPN-инфраструктура: входной узел в России, выход в Европе
собственный продукт: релей в России, постоянный туннель и узел в Нидерландах
Корпоративный шлюз на Xray и nginx для IT-команды
заказ IT-компании: рабочие инструменты снова доступны на своих серверах
Нужно похожее?
Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.