MAATRIX / Блог / Настройка VPN-клиента WireGuard на Mikrotik

Настройка VPN-клиента WireGuard на Mikrotik

MAATRIX

Mikrotik держит WireGuard прямо в ядре RouterOS — без отдельного пакета, без потери производительности на шифровании, и один раз настроенный туннель разом закрывает VPN для всех устройств дома: смарт-ТВ, консоли, гостевого Wi-Fi. Расплата — настройка честная, роутерная: подключение к серверу собирается из пяти отдельных кусочков (интерфейс, ключи, peer, адрес, маршрут), и если забыть один — получите зелёный индикатор и туннель, через который не идёт ни байта. Ниже — вся цепочка по порядку, с командами RouterOS 7 и точками, где чаще всего расходится «выглядит настроенным» и «реально работает».

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

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

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

Что нужно подготовить до начала

Дальше всё написано в предположении, что WireGuard-сервер уже поднят — если его ещё нет, сначала разверните его, например на VPS: как это сделать с нуля, разобрано в статье про установку WireGuard на VPS. Общую логику «весь дом через один туннель» и зачем это вообще нужно смотрите в статье про VPN на роутере для всего дома — здесь сразу к конкретике по Mikrotik.

Перед началом настройки под рукой должно быть:

  • Публичный ключ сервера — генерируется при установке WireGuard на сервере, хранится в конфиге интерфейса.
  • Адрес и порт сервера — публичный IP и UDP-порт, на котором слушает WireGuard (по умолчанию 51820).
  • Диапазон VPN-сети — например, 10.10.10.0/24, и свободный адрес в нём для роутера.
  • Доступ к самому Mikrotik — через Winbox, WebFig (веб-интерфейс) или SSH-терминал, с правами администратора.
  • RouterOS версии 7.x — нативная поддержка WireGuard появилась именно в седьмой ветке. Проверить версию: /system resource print, строка version. Если стоит 6.x, нужен апгрейд через /system package update check-for-updates — в шестой ветке WireGuard шёл отдельным экспериментальным пакетом с другим синтаксисом команд, эта статья описывает именно седьмую.

Все команды ниже вводятся в терминале RouterOS — открыть его можно в Winbox кнопкой New Terminal, в WebFig разделом Terminal, либо просто по SSH на IP роутера.

Создаём интерфейс WireGuard

Первый шаг — сам интерфейс. В RouterOS 7 он создаётся одной командой, ключевая пара генерируется автоматически, если не указать приватный ключ вручную:

/interface wireguard add name=wg-home listen-port=13231 comment="VPN client to home server"

listen-port — локальный UDP-порт, на котором Mikrotik слушает входящие пакеты этого интерфейса; для клиентского подключения его значение не принципиально, но зафиксируйте его — пригодится, если позже будете открывать порт на firewall явно. Название wg-home — произвольное, но дальше оно понадобится во всех остальных командах, так что выбирайте короткое и понятное.

Публичный ключ, который нужно передать на сервер (добавить туда как peer), смотрите командой:

/interface wireguard print

В выводе будет колонка public-key — именно её копируете и добавляете в конфигурацию сервера как разрешённого клиента. Если сервер уже настроен на приём нескольких клиентов, там же на сервере укажите, какой VPN-адрес будет закреплён за этим роутером.

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

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

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

Peer: подключаем роутер к серверу

Peer описывает, к кому подключается сам интерфейс — то есть параметры сервера с точки зрения Mikrotik:

/interface wireguard peers add interface=wg-home public-key="ПУБЛИЧНЫЙ_КЛЮЧ_СЕРВЕРА" \
  endpoint-address=203.0.113.10 endpoint-port=51820 allowed-address=0.0.0.0/0 persistent-keepalive=25s

По каждому полю:

  • public-key — публичный ключ сервера (не путать с ключом роутера из предыдущего шага — это два разных ключа, каждая сторона знает публичный ключ другой).
  • endpoint-address / endpoint-port — куда роутер отправляет пакеты: IP сервера и его UDP-порт.
  • allowed-address — не просто «разрешённый» диапазон, а фактическое указание, какой трафик заворачивать в туннель. 0.0.0.0/0 означает «весь трафик, идущий на любой адрес назначения, отправлять через wg-home». Если нужен не полный, а частичный туннель — сюда вписывается конкретная подсеть вместо 0.0.0.0/0, и остальной трафик пойдёт как обычно, мимо VPN.
  • persistent-keepalive=25s — роутер каждые 25 секунд шлёт серверу пустой пакет, чтобы NAT провайдера не «забыл» о соединении на простое. Без этой опции туннель может проседать в пинге после нескольких минут без активного трафика — переподключение занимает время.

Адрес интерфейса и проверка подключения

Ключи и peer настроены, но у самого интерфейса пока нет адреса в VPN-сети — без него роутер не сможет ни принимать, ни отправлять пакеты внутри туннеля:

/ip address add address=10.10.10.2/24 interface=wg-home

Адрес и маска должны соответствовать тому, что выделено этому клиенту на сервере — обычно сервер сам сообщает или фиксирует в своей конфигурации, какой адрес закреплён за каждым peer.

Проверка, что криптографическое рукопожатие прошло:

/interface wireguard peers print

Смотрите на колонку current-handshake: если там дата и время в пределах последних двух минут — рукопожатие свежее, всё в порядке. Если стоит бесконечно растущий 0s или прочерк — сервер не отвечает. Частая, но неочевидная причина именно на Mikrotik — рассинхронизация системного времени: WireGuard использует временные метки в протоколе рукопожатия, и если часы роутера сильно уехали (а без NTP это случается после перезагрузки), рукопожатие может не проходить, хотя сеть в остальном исправна. Проверьте /system clock print и включите NTP-клиент: /system ntp client set enabled=yes. Более широкий разбор ситуации «рукопожатие идёт, а трафика нет» — в статье про WireGuard с рукопожатием, но без трафика.

Маршрутизация всего трафика дома через VPN

Рукопожатие прошло, но интернета через туннель ещё нет — интерфейс сам по себе не меняет маршрутизацию, это отдельный шаг, и именно на нём чаще всего спотыкаются. Если добавить маршрут по умолчанию через wg-home в лоб, легко получить замкнутый круг: пакеты к самому серверу (на endpoint-address) тоже попытаются пойти через ещё не поднятый туннель, потому что для них теперь тоже действует маршрут 0.0.0.0/0.

Решение — сначала явно закрепить маршрут до IP сервера через обычный WAN-шлюз, и только потом добавить общий маршрут через туннель:

/ip route add dst-address=203.0.113.10/32 gateway=<IP_ШЛЮЗА_ПРОВАЙДЕРА> distance=1 comment="server IP, bypass tunnel"
/ip route add dst-address=0.0.0.0/0 gateway=wg-home distance=1 comment="all traffic via VPN"

Маршрут /32 более специфичен, чем 0.0.0.0/0 — RouterOS всегда выбирает наиболее точное совпадение по длине префикса, независимо от distance, поэтому пакеты к самому серверу гарантированно уходят через провайдера, а не в петлю через VPN. Второй командой становится основным маршрут по умолчанию через туннель — весь остальной трафик дома пойдёт через сервер.

Если хочется сохранить исходный интернет как запасной вариант на случай падения туннеля (а не полное отключение интернета — своего рода анти-killswitch), не удаляйте исходный маршрут провайдера, а просто повысьте ему значение distance (например, 254), оставив маршрут через wg-home с distance=1 — он будет приоритетным, пока туннель жив, а при обрыве роутер автоматически переключится обратно на WAN. Обратный вариант — жёсткий killswitch, когда при падении VPN интернета не остаётся вовсе — обеспечивается тем, что запасного маршрута попросту нет: тогда при обрыве туннеля устройства дома останутся без сети до восстановления соединения, зато утечки трафика мимо VPN гарантированно не будет.

NAT, firewall и типичные ошибки

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

/ip firewall nat add chain=srcnat out-interface=wg-home action=masquerade comment="NAT for VPN tunnel"

Ещё три места, где стоит проверить настройки, если после маршрута и NAT трафик всё равно не идёт:

ПроблемаГде искатьЧто сделать
FastTrack перехватывает пакеты мимо туннеляIP → Firewall → Filter Rules, правило с действием fasttrack-connectionВременно отключить или исключить из него интерфейс wg-home
Firewall режет форвардинг через новый интерфейсIP → Firewall → Filter Rules, цепочка forwardДобавить разрешающее правило для in-interface=wg-home и обратно
Сайты не открываются по имени, хотя пинг по IP проходитDNSWireGuard не раздаёт DNS-сервер автоматически (в отличие от некоторых других протоколов) — пропишите DNS вручную: /ip dns set servers=1.1.1.1,8.8.8.8

Если рукопожатие есть, маршрут и NAT настроены, а трафик всё равно теряется где-то по пути — стоит сверить весь чек-лист причин ещё раз: часть из них специфична именно для роутеров и уже разобрана в статье про типичные проблемы WireGuard на Mikrotik и Keenetic, включая более редкие случаи вроде конфликта MTU на нестабильных мобильных каналах провайдера.

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

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

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

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

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

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

Как узнать, поддерживает ли мой Mikrotik WireGuard нативно?

Нативная поддержка есть в RouterOS 7.x на любом оборудовании, которое вообще способно обновиться до седьмой ветки — архитектура (ARM, MIPS, x86) значения не имеет. Проверьте версию через /system resource print и при необходимости обновитесь через /system package update check-for-updates.

Можно ли пускать через VPN не весь дом, а только отдельные устройства?

Да, через policy-based routing: вместо общего маршрута 0.0.0.0/0 создаётся правило в /ip firewall mangle с action=mark-routing, которое метит трафик от конкретных адресов или подсетей, и отдельная таблица маршрутизации с этой меткой ведёт только их через wg-home. Остальные устройства продолжают выходить в интернет напрямую через провайдера.

Почему после полного заворачивания трафика через VPN снизилась скорость?

Это ожидаемо: пакет теперь идёт лишний участок сети до сервера и обратно, плюс шифрование грузит процессор роутера — на бюджетных моделях с слабым CPU это может быть заметно на канале от 100 Мбит/с и выше. Конкретные цифры сильно зависят от модели роутера и удалённости сервера — универсального ориентира здесь нет, стоит измерить на своём оборудовании.

Нужно ли открывать порт WireGuard на firewall со стороны input?

Для клиентского подключения — обычно нет: роутер сам инициирует соединение к серверу, и ответные пакеты проходят по established/related, если такое правило уже есть в стандартной конфигурации firewall. Отдельно открывать listen-port на вход нужно только если сервер, наоборот, должен сам подключаться к роутеру (нетипичная схема для домашнего клиента).

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

Убедитесь, что конфигурация сохранена (/interface wireguard print должен показывать интерфейс и после /system reboot) и что включён NTP-клиент — без верного системного времени рукопожатие может не проходить именно в первые секунды после старта, пока время ещё не синхронизировалось с сервером NTP.

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

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

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