MAATRIX / Блог / Прошивка роутера OpenWrt под VPN-клиент: WireGuard и OpenVPN

Прошивка роутера OpenWrt под VPN-клиент: WireGuard и OpenVPN

MAATRIX

Стоковая прошивка большинства бытовых роутеров вообще не умеет WireGuard, а OpenVPN-клиент если и есть, то куцый — без гибкой маршрутизации и с редкими обновлениями. Третий путь, кроме покупки Mikrotik или Keenetic, — перепрошить уже имеющийся роутер в OpenWrt: это полноценный Linux, где WireGuard и OpenVPN ставятся одной командой и настраиваются через веб-интерфейс LuCI. Дальше — какие роутеры годятся, как поставить пакеты и довести туннель до реально работающего трафика, а не просто зелёного индикатора.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что получится в итоге

Когда всё настроено, роутер сам держит подключение к вашему VPS и заворачивает в него трафик всей домашней сети.

  • Ни на одном устройстве не нужен VPN-клиент. Телефоны, ноутбуки, приставки выходят наружу через сервер просто потому, что подключены к вашему Wi-Fi. Это единственный способ подружить с туннелем железо, где клиента не бывает в принципе — например, Smart TV без поддержки VPN.
  • Внешний IP всех устройств — это IP сервера, сайты видят его страну и провайдера.
  • Туннель поднимается сам после перезагрузки роутера и обрыва линии, а трафик можно разделять: одни устройства в туннель, другие напрямую.

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

Словарь: что здесь означают все эти слова

Половина инструкций по VPN на роутере написана «для своих». Ниже — расшифровка терминов, которые встретятся дальше и в интерфейсе LuCI.

ТерминЧто это простыми словами
OpenWrt / LuCIПрошивка-замена заводской (внутри обычный Linux) и её веб-панель в браузере
Интерфейсlan — домашняя сеть, wan — провайдер, wgvpn — ваш туннель
Зона firewallГруппа интерфейсов с общими правилами. Пока интерфейс не в зоне, его трафик режется
Forwarding между зонамиРазрешение «из зоны A можно в зону B». Без правила lan → vpn дом в туннель не попадёт
NAT / MasqueradingПодмена адреса отправителя на адрес роутера. Без него сервер получит пакет от 192.168.1.50 и не поймёт, куда отвечать
HandshakeОбмен ключами с сервером раз в пару минут. «Свежее» рукопожатие = живое соединение
Peer / EndpointВторая сторона туннеля (сервер) и адрес с портом, куда стучится роутер
Allowed IPsАдреса, которые разрешено гонять через туннель. 0.0.0.0/0 — «весь интернет»
Route Allowed IPsГалочка, превращающая Allowed IPs в маршруты. Без неё туннель есть, а трафик идёт мимо
Persistent KeepaliveПустой пакет раз в N секунд, чтобы NAT провайдера не забыл о соединении на простое
MTU и фрагментацияПредельный размер пакета целиком. Что больше — режется на части, а части часто теряются
MSS clampingРоутер сам подсказывает сторонам меньший размер сегмента. Лечит большинство проблем с MTU
dnsmasqПрограмма в OpenWrt, раздающая устройствам адреса (DHCP) и их DNS-запросы
Kill switchПравило «упал туннель — не выпускать трафик напрямую»
PBRМаршрутизация по правилам: не «весь дом», а «вот эти устройства и домены»

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Каким роутерам подходит OpenWrt

OpenWrt — не надстройка над заводской прошивкой, а её полная замена, поэтому первый вопрос не «как настроить», а «можно ли поставить». Проверяется это на странице Table of Hardware: вбиваете модель и ревизию платы (обычно на наклейке снизу, например v1.2). Ревизия важна — у одной модели разные ревизии нередко несут разное железо.

Минимум для связки WireGuard + OpenVPN + LuCI: флеш от 8 МБ, лучше 16 МБ+ (на 4 МБ помещается только урезанный образ без веб-панели); ОЗУ от 128 МБ; CPU с аппаратным ускорением шифрования — актуально прежде всего для OpenVPN.

Цифры мегабит «для роутера вообще» не существует: разброс между бюджетным MIPS и современным ARM огромный, и чужие таблицы замеров к вашему железу отношения не имеют — померяйте у себя по методике из статьи про измерение скорости через iperf3.

OpenWrtMikrotikKeenetic
Стоимость железаот бюджетных TP-Linkот ~40-60$от ~50-100$
WireGuard из коробкинет, ставится пакетомда, с RouterOS 7да
Гибкостьмаксимальная, это Linuxвысокая, свой синтаксисограничена интерфейсом
Риск установкиесть, окирпичиваниенет, штатная ОСнет, штатная ОС
Поддержкаcommunityофициальнаяофициальная

Обзор готовых альтернатив — в статье про проблемы WireGuard на Mikrotik и Keenetic, а сравнение подходов — в разборе VPN на роутере или на устройстве.

Устанавливаем пакеты через LuCI и opkg

Дальше предполагается, что OpenWrt уже установлен и LuCI открывается по адресу роутера (обычно 192.168.1.1). Через веб-интерфейс: System → Software → Update lists, найти пакет, Install. Через SSH то же самое одной командой:

opkg update
opkg install luci-proto-wireguard luci-app-wireguard wireguard-tools \
             luci-app-openvpn openvpn-openssl

luci-proto-wireguard добавляет протокол в список при создании интерфейса и тянет модуль ядра. luci-app-wireguard — отдельный пакет со страницей Status → WireGuard, где видно время последнего рукопожатия; без него статус смотрится только из консоли, и многие на этом спотыкаются. openvpn-openssl предпочтительнее openvpn-mbedtls: совместимость с готовыми конфигами выше. В свежих сборках вместо opkg используется apk — команды тогда apk update и apk add <пакет>.

На устройствах с малым флешем проверьте место: df -h /overlay. Если не хватает, удалите лишние пакеты, соберите образ на firmware-selector.openwrt.org сразу с нужными или разверните extroot на USB-флешке.

WireGuard-клиент: настройка через LuCI

Network → Interfaces → Add new interface, имя (например, wgvpn — латиницей, без пробелов, до 15 символов), протокол WireGuard VPN.

  • Private Key — приватный ключ клиента из конфига, который выдал сервер, либо кнопка генерации в LuCI.
  • Listen Port — локальный UDP-порт, например 51820; для клиента непринципиален.
  • IP Addresses — адрес роутера внутри туннеля, формата 10.10.10.2/32. Именно /32: маску /24 роутер поймёт как «вся эта сеть за туннелем» и может сломать маршрутизацию.

После сохранения появится публичный ключ клиента — скопируйте его и добавьте на сервере как peer, иначе сервер будет молча отбрасывать пакеты от неизвестного клиента, а вы будете смотреть на отсутствующее рукопожатие и гадать.

Вкладка Peers → Add peer: Public Key — публичный ключ сервера, не свой; Endpoint Host / Port — IP или домен сервера и его порт; Allowed IPs0.0.0.0/0 для полного туннеля или конкретная подсеть для частичного. Плюс два поля, которые решают всё:

  • Route Allowed IPs — обязательно включите: именно этот чекбокс превращает Allowed IPs в маршруты. Без него интерфейс поднимется, рукопожатие пройдёт, а трафик пойдёт мимо туннеля.
  • Persistent Keepalive25. Ставьте всегда, если роутер за NAT провайдера или за CGNAT: иначе соединение «засыпает» на простое и оживает только после того, как вы сами что-то откроете.

Сервер с нуля разворачивается по статье про установку WireGuard на VPS. И ещё тонкость про 0.0.0.0/0: этот маршрут конкурирует с маршрутом до самого сервера, который лежит через провайдера. Обычно netifd разруливает всё сам, но иногда получается петля — туннель поднимается и через несколько секунд отваливается. Лечение: указать вместо него две половины, 0.0.0.0/1 и 128.0.0.0/1.

OpenVPN-клиент: импорт готового .ovpn

Проще не собирать конфигурацию по полям, а импортировать файл .ovpn со встроенными сертификатами: VPN → OpenVPN (пункт появляется после установки luci-app-openvpn), в Template выбрать Start with import config, задать имя инстанса, Add instance, загрузить .ovpn целиком, включить Enabled, Save & Apply.

Проверка, что инстанс поднялся: logread -e openvpn, строка Initialization Sequence Completed. Если процесс падает сразу, виновато обычно одно из двух. Устаревший шифр: директива cipher BF-CBC в современных сборках больше не работает, надо согласовать с сервером data-ciphers AES-256-GCM:AES-128-GCM. Разошлись часы: TLS-рукопожатие ко времени чувствительно, а роутер без батарейки после перезагрузки стартует с «нулевой» датой — проверьте System → System → Time Synchronization.

Большинство .ovpn-конфигов содержат redirect-gateway def1 — она заворачивает весь трафик роутера в туннель. Для частичного туннеля строку перед импортом убирают и прописывают маршруты вручную в Network → Static Routes.

Сервер разворачивается по статье про установку OpenVPN на VPS, а выбор протокола разобран в материале WireGuard или OpenVPN. На слабом роутере разница ощутима: WireGuard живёт в ядре и стоит процессору дешевле.

Firewall-зона: без этого туннель поднимется, а трафика не будет

Здесь теряется больше всего времени: интерфейс включён, статус зелёный, интернета нет. Причина почти всегда одна — интерфейс не привязан ни к одной зоне межсетевого экрана, и его трафик режется правилами по умолчанию. Network → Firewall → Zones, два рабочих варианта:

  1. Добавить VPN-интерфейс в зону wan — проще для полного туннеля, зона уже настроена с NAT. Откройте wan, в Covered networks добавьте wgvpn.
  2. Отдельная зона vpn — чище логически и удобнее для kill switch. Add, имя vpn, Input: reject, Output: accept, Forward: reject, обязательно включить Masquerading и MSS clamping. В Inter-Zone Forwarding разрешить lan → vpn.

Без Masquerading сервер получит пакеты с адресом отправителя из локальной сети (192.168.1.x) и не будет знать, куда слать ответ — обратный трафик потеряется, хотя рукопожатие пройдёт успешно. Это и создаёт ложное ощущение «настроено, но не работает». Для маршрутизации отдельных устройств ставится пакет luci-app-pbr: правила привязываются к MAC- или IP-адресам, а не ко всей lan.

MTU: почему мелкие сайты открываются, а крупные висят

Узнаваемый симптом кривого MTU: ping идёт, лёгкие страницы и мессенджеры работают, а крупные сайты, загрузка файлов и видео виснут на середине. Домашняя сеть работает с пакетами до 1500 байт, VPN добавляет к каждому свои заголовки, и итоговый пакет уже не помещается: его либо режут на части, либо провайдер по дороге молча выбрасывает.

Первый ход — включить MSS clamping на зоне, куда входит VPN-интерфейс: роутер начинает сам подсказывать сторонам подходящий размер сегмента, и большинство проблем исчезает без подбора чисел.

Второй ход — занизить MTU интерфейса. Значение по умолчанию рассчитано на линию с MTU 1500; при PPPoE, мобильном операторе или двойной инкапсуляции полезного места меньше. Универсального числа нет, подбирается с компьютера в локальной сети:

ping -f -l 1400 1.1.1.1          # Windows: -f запрещает фрагментацию
ping -M do -s 1400 -c 3 1.1.1.1  # Linux (на macOS вместо -M do ключ -D)

Уменьшайте число, пока не пропадёт ошибка о необходимости фрагментации, затем прибавьте 28 (заголовки IP и ICMP) — получится рабочий MTU. Встроенный в OpenWrt busybox-ping запрет фрагментации может не поддерживать, поэтому меряйте именно с компьютера. Значение ставится в Advanced Settings → Override MTU. Разбор механики — в статье про фрагментацию и подбор MTU.

DNS: утечка, которую не видно глазами

Даже при работающем туннеле роутер может продолжать спрашивать имена сайтов у DNS-серверов провайдера. Внешний IP при этом честно показывается серверным, а список запрошенных доменов утекает мимо.

  1. Снимите «Use DNS servers advertised by peer» на интерфейсе wan (Advanced Settings). Иначе провайдерские адреса будут прилетать при каждом переподключении и вставать первыми в очереди.
  2. Пропишите нужный DNS в dnsmasq: Network → DHCP and DNS → General → DNS forwardings. Укажите адрес VPN-сервера внутри туннеля, если он раздаёт DNS, либо резолвер, до которого роутер ходит через туннель.
  3. Перехватывайте порт 53 принудительно. Телевизоры, приставки и часть телефонов игнорируют выданный по DHCP адрес и ходят к жёстко зашитым серверам. Правило в Network → Firewall → Port Forwards редиректит трафик на порт 53 из зоны lan на сам роутер.

Методика проверки — в статье про утечку DNS. Отдельно про IPv6: если провайдер выдаёт IPv6, а туннель только IPv4, часть трафика уйдёт в обход. Либо заворачивайте в туннель и ::/0, либо отключайте интерфейс wan6 целиком.

Как убедиться, что VPN реально работает

Зелёный статус в LuCI означает ровно одно: интерфейс поднят. Ни свежести рукопожатия, ни того, что трафик идёт через сервер, он не гарантирует. Проверяйте по уровням, переходя к следующему после предыдущего.

Уровень 1. Соединение установлено. wg show по SSH или страница Status → WireGuard: в latest handshake должны быть секунды-минуты, а не часы. Для OpenVPN — строка Initialization Sequence Completed в логе. Если рукопожатия нет, дальше идти бессмысленно: проблема в ключах, порте или времени.

Уровень 2. Трафик проходит внутри туннеля. Пингуйте с роутера адрес сервера внутри туннеля, обычно 10.10.10.1: ответ означает, что шифрование и маршрут до пира живы.

Уровень 3. Внешний IP сменился. Откройте на домашнем компьютере 2ip.ru или whoer.net: IP и страна должны совпадать с сервером. Проверять надо именно с устройства в LAN, а не с роутера — они ходят наружу по разным правилам, и бывает, что для роутера туннель работает, а для дома нет. Подробнее — в статье как проверить IP и страну после туннеля.

Уровень 4. Нет утечек. dnsleaktest.com в расширенном режиме: серверов домашнего провайдера в списке быть не должно, плюс проверьте строку про IPv6 на whoer.net. И если ip route get 1.1.1.1 показывает dev wan, а не dev wgvpn, маршруты не применились — вернитесь к галочке Route Allowed IPs.

Что происходит, когда туннель падает

Сценарий выясняется постфактум: сервер перезагрузился, туннель отвалился, а роутер спокойно продолжил выпускать дом напрямую через провайдера. Интернет работает — и только через неделю обнаруживается, что трафик всё это время шёл в обход. Так ведёт себя конфигурация по умолчанию, если VPN-интерфейс добавлен в зону wan.

  • Отдельная зона vpn вместо wan. Разрешите forwarding только lan → vpn и уберите lan → wan. Когда туннель падает, пакетам некуда идти — это и есть kill switch в чистом виде.
  • Strict enforcement в pbr. При недоступном интерфейсе правила не деградируют до прямого выхода, а блокируют трафик.
  • Сторожевой скрипт в System → Scheduled Tasks:
*/5 * * * * ping -c2 -W3 10.10.10.1 >/dev/null 2>&1 || (ifdown wgvpn; sleep 3; ifup wgvpn)

Отдельная причина «внезапной смерти» туннеля — смена IP у сервера, если в Endpoint указан домен. Имя резолвится один раз при поднятии интерфейса и дальше не перепроверяется: роутер будет стучаться по старому адресу, пока интерфейс не перезапустят. Тот же скрипт лечит и это.

Перезагрузка и обновления

Интерфейс с галочкой Enabled поднимается при старте сети сам, отдельный сервис включать не нужно, но два подвоха всё же есть.

Часы. Роутер стартует с неверной датой и синхронизирует её по NTP уже после старта сети, поэтому OpenVPN может не поднять TLS с первой попытки. Убедитесь, что NTP-сервер доступен напрямую, а не только через туннель, иначе получается замкнутый круг. Похожие сценарии — в статье почему WireGuard не работает после перезагрузки.

Обновление прошивки. sysupgrade сохраняет настройки из /etc, но не доустановленные пакеты: после обновления конфигурация VPN на месте, а wireguard-tools и luci-app-openvpn — нет, и туннель не поднимается. Лечится повторной установкой пакетов либо через Attended Sysupgrade (luci-app-attendedsysupgrade), собирающий образ уже с вашим набором. Бэкап делается командой sysupgrade -b; держите его вне роутера, помня, что приватный ключ WireGuard лежит в /etc/config/network открытым текстом и попадает в архив.

Приёмы, о которых редко пишут

  • Оставьте себе путь назад. Перед тем как заворачивать весь трафик, убедитесь, что роутер доступен по SSH из локальной сети: если с маршрутами что-то пойдёт не так, LuCI может стать недоступным, а консоль в LAN останется.
  • Маршрутизация по доменам, а не по устройствам. pbr работает вместе с dnsmasq и заворачивает в туннель не устройство целиком, а обращения к конкретным доменам: банковские приложения ходят напрямую.
  • Отдельная Wi-Fi-сеть «через VPN». Второй SSID со своим интерфейсом, завёрнутым в туннель: переключение сводится к выбору сети на телефоне.
  • Второй туннель как запасной. WireGuard-интерфейс и OpenVPN-инстанс на разные серверы существуют одновременно: первый рабочий, второй выключенный. Переключение — одна галочка.
  • Не выпускайте сам роутер в туннель без нужды. Обновления пакетов и NTP удобнее гонять напрямую: так они не создадут замкнутый круг при загрузке, когда часы ещё не синхронизированы.

Симптом, причина и что делать

СимптомВероятная причинаЧто делать
Рукопожатия нет вообщеНеверный ключ, закрыт порт, разошлись часыСверить ключи, проверить UDP-порт снаружи, включить NTP
Рукопожатие есть, интернета нетИнтерфейс не в зоне firewall или нет MasqueradingДобавить в зону, включить NAT, разрешить lan → vpn
На роутере работает, в LAN нетНет forwarding lan → vpnДобавить правило в Inter-Zone Forwarding
Лёгкие сайты открываются, тяжёлые виснутMTU и фрагментацияВключить MSS clamping, затем занизить MTU
IP серверный, но dnsleaktest показывает провайдераУтечка DNSСнять «Use DNS servers advertised by peer», задать DNS forwardings, редирект порта 53
Туннель поднимается и через секунды падаетПетля маршрутов из-за 0.0.0.0/0Заменить на 0.0.0.0/1 и 128.0.0.0/1
Работал, потом перестал сам по себеСменился IP сервера при доменном Endpoint или отпала сессия за NATПерезапустить интерфейс, Keepalive 25, сторожевой скрипт
После обновления прошивки VPN пропалsysupgrade не сохраняет пакетыПереустановить пакеты или использовать Attended Sysupgrade
OpenVPN: TLS handshake failedЧасы или несовпадение шифровПроверить NTP, привести data-ciphers к настройкам сервера

Шпаргалка команд

wg show                                   # ключи, рукопожатие, счётчики байт
logread -e openvpn                        # лог OpenVPN (-f — в реальном времени)
ubus call network.interface.wgvpn status  # что думает об интерфейсе netifd

ip route get 1.1.1.1                      # через какой интерфейс уйдёт пакет
nft list ruleset                          # действующие правила firewall

ifdown wgvpn && ifup wgvpn                # перезапустить туннель
/etc/init.d/network reload                # применить изменения сети
uci set network.wgvpn.mtu=1412            # задать MTU (затем uci commit network)

ping -c3 10.10.10.1                       # сервер внутри туннеля
uclient-fetch -qO- https://ipinfo.io/ip   # внешний IP глазами роутера
sysupgrade -b /tmp/backup.tar.gz          # архив настроек

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Какой роутер купить, если своего под OpenWrt ещё нет?

Смотрите Table of Hardware, берите модель с флешем от 16 МБ и ОЗУ от 128 МБ. Не хотите прошивать сами — устройства GL.iNet идут с похожей прошивкой из коробки.

Что лучше для VPN-клиента: OpenWrt, Mikrotik или Keenetic?

Фирменные прошивки надёжнее и без риска при установке, но требуют покупки железа. Если подходящий роутер уже есть — OpenWrt почти всегда выгоднее.

Можно ли держать WireGuard и OpenVPN одновременно?

Да. Включённым для всего трафика держат один, второй хранят запасным или разводят между устройствами через PBR.

Роутер стал заметно медленнее после включения VPN?

Это нормально: шифрование считает его процессор, а он слабее и сервера, и ноутбука. Насколько именно — зависит от железа, измеряйте iperf3.

Внешний IP сменился, а сайты всё равно определяют мою страну.

Дело в DNS или IPv6: имена спрашиваются у провайдера либо часть трафика идёт мимо туннеля. Проверьте оба пункта на whoer.net.

Что будет с домашним интернетом, если сервер выключится?

По умолчанию трафик молча пойдёт в обход. Чтобы этого не случилось, вынесите VPN в отдельную зону и уберите forwarding lan → wan.

Нужно ли пробрасывать порт на домашнем роутере?

Нет, роутер здесь клиент и сам инициирует соединение. Проброс нужен в обратной схеме, когда сервер поднимается дома.

Хватит ли роутера с 4 МБ флеша?

Для одного WireGuard на урезанном образе без LuCI теоретически да, но вместе с OpenVPN и веб-интерфейсом места не хватит.

Что делать, если после прошивки роутер не загружается?

Большинство устройств поддерживают recovery-режим (TFTP или reset при включении) — процедура описана на странице модели в Table of Hardware.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →