Перейти к содержанию
Обсудить задачу →
Статьи и инструкции

WireGuard-сервер на MikroTik: удалённый доступ в локальную сеть

Практическая настройка WireGuard на MikroTik для удалённого сотрудника: ключи, адреса, AllowedIPs, split tunnel, firewall, проверка и отзыв.
WireGuard-сервер на MikroTik: пошаговая настройка

WireGuard хорошо подходит для удалённого доступа к MikroTik, когда нужны простой клиент, высокая скорость и короткая конфигурация. В протоколе нет отдельной роли «сервер»: каждый участник является peer, имеет собственную пару ключей и список адресов, которые разрешено принимать от другой стороны. Сервером в бытовом смысле называют MikroTik с постоянным адресом и открытым UDP-портом, к которому первым обращается ноутбук или телефон.

В примере MikroTik слушает UDP 51820, туннельная сеть — 10.77.1.0/24, офисная сеть — 10.20.0.0/24, DNS — 10.20.0.53, а разрешённый сервер приложений — 10.20.0.25. Клиент получает 10.77.1.2/32. Команды рассчитаны на RouterOS 7; свойства автоматического клиентского экспорта client-allowed-address появились в 7.21, поэтому для более ранних версий профиль надо исправлять на клиенте вручную.

Понять три разных смысла AllowedIPs

Главная причина ошибок WireGuard — попытка читать allowed-address как обычный список маршрутов. На MikroTik это одновременно селектор исходящего peer и проверка допустимого адреса источника от этого peer. На клиенте AllowedIPs дополнительно определяет, какой трафик операционная система отправит в туннель.

Для road warrior peer на MikroTik указывают только уникальный адрес клиента 10.77.1.2/32. Если добавить каждому peer всю офисную сеть, адресные диапазоны на одном WireGuard-интерфейсе пересекутся, и RouterOS не сможет однозначно выбрать получателя. Офисная сеть 10.20.0.0/24 указывается на клиенте, потому что именно клиент должен направлять её к MikroTik.

Понять три разных смысла AllowedIPs
Место настройкиЗначение в примереСмысл
Peer на MikroTik10.77.1.2/32Этот peer имеет право присылать пакеты с таким source IP
Peer на клиенте10.20.0.0/24, 10.77.1.0/24Эти назначения отправлять через MikroTik
Адрес интерфейса клиента10.77.1.2/32Собственный адрес клиента в туннеле
Endpoint клиентаvpn.example.ru:51820Публичный адрес и UDP-порт MikroTik
Схема WireGuard-сервера на MikroTik
Схема поясняет связи между компонентами. Команды, условия применения и проверка результата приведены в тексте.

Проверить исходную сеть и сохранить конфигурацию

Проверьте RouterOS, внешний адрес, маршруты, firewall и отсутствие пересечения 10.77.1.0/24. Если домашняя сеть сотрудника тоже использует 10.20.0.0/24, split tunnel к офису работать не будет однозначно: локальный маршрут клиента может победить VPN. В таком случае меняют офисную адресацию, публикуют узкий translated-сегмент или используют отдельный jump host.

/system resource print
/system package print
/ip address print
/ip route print
/ip firewall filter print stats
/ip firewall nat print
/interface wireguard print detail
/export hide-sensitive file=before-wireguard
/system backup save name=before-wireguard password=<BACKUP_PASSWORD>

WireGuard использует только UDP. Публичное DNS-имя помогает пережить смену внешнего IP, но не устраняет CGNAT: если провайдер не пропускает входящие соединения, нужен белый адрес, port forwarding или промежуточный узел с доступным адресом.

Создать WireGuard-интерфейс и получить только публичный ключ

При добавлении интерфейса RouterOS генерирует ключевую пару. Закрытый ключ должен остаться на MikroTik. Для переноса клиенту нужен только public key, который безопасно выводится отдельной командой.

/interface wireguard add name=wg-roadwarrior \
    listen-port=51820 mtu=1420 \
    comment="Remote employees"
/ip address add address=10.77.1.1/24 interface=wg-roadwarrior \
    comment="WireGuard roadwarrior gateway"

:put [/interface wireguard get \
    [find where name=wg-roadwarrior] public-key]
/interface wireguard print where name=wg-roadwarrior
/ip address print where interface=wg-roadwarrior

Не публикуйте /interface wireguard export show-sensitive и не отправляйте полный экспорт в заявку: он может содержать private key интерфейса и preshared keys peers. Если закрытый ключ MikroTik утёк, его нельзя «сменить паролем» — создайте новую пару и обновите все клиенты.

MTU 1420 является распространённой отправной точкой при внешнем MTU 1500. Для PPPoE, LTE и вложенных туннелей может потребоваться меньшее значение. Меняйте его после измерения, а не по случайной рекомендации.

Создать ключи на клиенте и передать public key

В официальном клиенте WireGuard создайте пустой туннель. Приложение сгенерирует PrivateKey и PublicKey. Закрытый ключ остаётся на устройстве; в RouterOS передаётся только PublicKey. На Linux то же самое можно сделать локально с ограниченными правами:

umask 077
wg genkey | tee client-private.key | wg pubkey > client-public.key
cat client-public.key

Файл client-private.key является секретом. Не копируйте его в чат, документацию или RouterOS. Если нужно усилить защиту отдельным симметричным ключом, можно сгенерировать preshared key командой wg genpsk, но его придётся безопасно установить на обе стороны и учитывать в процедуре отзыва.

Добавить peer на MikroTik

Подставьте публичный ключ клиента и уникальный адрес 10.77.1.2/32. Свойство responder=yes соответствует роли постоянно доступной стороны: MikroTik отвечает на handshake клиента и не пытается самостоятельно инициировать обмен через случайный маршрут. Это особенно полезно при нескольких WAN.

/interface wireguard peers add \
    interface=wg-roadwarrior \
    public-key="<CLIENT_PUBLIC_KEY>" \
    allowed-address=10.77.1.2/32 \
    responder=yes \
    comment="Ivanov laptop; ticket <NUMBER>"

/interface wireguard peers print detail \
    where interface=wg-roadwarrior

Для второго клиента используйте другой ключ и 10.77.1.3/32. Не копируйте первый peer и не оставляйте тот же allowed address: пересечение адресов делает выбор peer неоднозначным и ломает учёт.

Открыть UDP-порт на WAN

Добавьте узкое правило input и расположите его до общего запрета входящего WAN-трафика. Если внешний IP известен только у одного интерфейса, можно указать in-interface=ether1; в типовой конфигурации удобнее in-interface-list=WAN.

/ip firewall filter add chain=input action=accept \
    in-interface-list=WAN protocol=udp dst-port=51820 \
    comment="WG: accept UDP 51820 from Internet"
/ip firewall filter print

После добавления переместите правило выше общего WAN drop в своей политике. Не удаляйте drop. Ограничить source IP полезно для филиала с постоянным адресом, но для ноутбука в мобильной сети это часто невозможно.

Разрешить только нужные сервисы из туннеля

Handshake показывает лишь криптографическую связность. Доступ в LAN контролирует forward, а доступ к самому MikroTik — input. В примере разрешены DNS на 10.20.0.53, HTTPS и RDP на 10.20.0.25, затем остальная офисная сеть запрещена.

/ip firewall filter add chain=forward action=accept \
    in-interface=wg-roadwarrior src-address=10.77.1.0/24 \
    dst-address=10.20.0.53 protocol=udp dst-port=53 \
    comment="WG: internal DNS UDP"
/ip firewall filter add chain=forward action=accept \
    in-interface=wg-roadwarrior src-address=10.77.1.0/24 \
    dst-address=10.20.0.53 protocol=tcp dst-port=53 \
    comment="WG: internal DNS TCP"
/ip firewall filter add chain=forward action=accept \
    in-interface=wg-roadwarrior src-address=10.77.1.0/24 \
    dst-address=10.20.0.25 protocol=tcp dst-port=443,3389 \
    comment="WG: approved applications"
/ip firewall filter add chain=forward action=drop \
    in-interface=wg-roadwarrior src-address=10.77.1.0/24 \
    dst-address=10.20.0.0/24 \
    comment="WG: deny other LAN access"
/ip firewall filter print stats where comment~"^WG:"

Правила ставят после разрешения established,related и до широкого drop. Если клиенту не нужен RDP, удалите 3389. Для управления самим MikroTik не добавляйте широкое input accept in-interface=wg-roadwarrior: разрешите конкретный source IP клиента, протокол и сервис, а /ip service ограничьте списком адресов.

Настроить обратный маршрут без лишнего NAT

Если MikroTik — основной шлюз 10.20.0.0/24, ответ серверов вернётся через него. При другом шлюзе добавьте на нём маршрут 10.77.1.0/24 via <LAN-IP-MikroTik>. Тогда внутренние журналы сохранят реальный адрес VPN-клиента.

Fallback NAT допустим, когда основной маршрутизатор изменить нельзя:

/ip firewall nat add chain=srcnat action=masquerade \
    src-address=10.77.1.0/24 dst-address=10.20.0.0/24 \
    comment="WG fallback NAT to LAN"

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

Собрать split-tunnel конфигурацию клиента

Подставьте private key клиента, public key MikroTik и реальное публичное имя. В AllowedIPs перечислены только туннельная и офисная сети, поэтому обычный интернет продолжит идти через локальный провайдер клиента.

[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 10.77.1.2/32
DNS = 10.20.0.53

[Peer]
PublicKey = <MIKROTIK_PUBLIC_KEY>
Endpoint = vpn.example.ru:51820
AllowedIPs = 10.77.1.0/24, 10.20.0.0/24
PersistentKeepalive = 25

PersistentKeepalive = 25 полезен для клиента за NAT: он поддерживает отображение UDP. На стороне MikroTik responder этот параметр не нужен. Готовый шаблон конфигурации не содержит ключей и не должен использоваться без заполнения.

Для full tunnel клиент указывает 0.0.0.0/0, ::/0, но тогда на MikroTik нужны политика выхода в интернет, DNS, IPv6 и NAT. Не превращайте split tunnel в full tunnel только изменением одной строки: иначе часть трафика уйдёт в чёрную дыру или IPv6 обойдёт политику.

Автоматический экспорт и QR-код в RouterOS 7.21+

RouterOS умеет формировать клиентский профиль из свойств peer. Начиная с 7.21, client-allowed-address позволяет задать split tunnel; раньше экспорт жёстко подставлял 0.0.0.0/0, ::/0, что неожиданно превращало профиль в full tunnel.

/interface wireguard peers set \
    [find where comment="Ivanov laptop; ticket <NUMBER>"] \
    client-address=10.77.1.2/32 \
    client-dns=10.20.0.53 \
    client-endpoint=vpn.example.ru \
    client-allowed-address=10.77.1.0/24,10.20.0.0/24

/interface wireguard peers show-client-config \
    [find where comment="Ivanov laptop; ticket <NUMBER>"] \
    qr

QR-код содержит private key и фактически является готовым доступом. Показывайте его только владельцу устройства, не делайте скриншот и не прикладывайте к тикету. После импорта закройте окно. На RouterOS до 7.21 обязательно исправьте AllowedIPs в клиенте вручную.

Проверить handshake, маршруты и ограничения

Подключите клиент из внешней сети и наблюдайте peer. Поле last-handshake должно обновиться, а rx/tx — расти. Нулевой handshake означает проблему endpoint, UDP firewall или ключей; живой handshake при отсутствии доступа указывает на маршруты и filter.

/interface wireguard peers print detail \
    where interface=wg-roadwarrior
/ip firewall filter print stats where comment~"^WG:"
/ip firewall connection print where protocol=udp and dst-port=51820
/tool sniffer quick interface=wg-roadwarrior

На Windows:

Get-NetIPConfiguration
Get-NetRoute -AddressFamily IPv4 | Sort-Object DestinationPrefix
Resolve-DnsName internal.example.ru -Server 10.20.0.53
Test-NetConnection 10.20.0.25 -Port 443
Test-NetConnection 10.20.0.30 -Port 445

На Linux:

sudo wg show
ip address show
ip route get 10.20.0.25
resolvectl query internal.example.ru
curl -vk --connect-timeout 5 https://10.20.0.25/

Ожидается свежий handshake, маршрут к 10.20.0.25 через WireGuard, работа DNS и разрешённого HTTPS. Проверка несогласованного SMB должна завершиться отказом. Дополнительно отключите VPN и убедитесь, что офисный адрес больше недоступен.

Найти ошибку по симптому

Если handshake отсутствует, проверьте DNS endpoint, внешний port forwarding, UDP 51820 и правильность public keys. Если handshake появляется только после активации клиента и затем пропадает за NAT, включите PersistentKeepalive = 25 у клиента. Если handshake есть, но счётчик receive равен нулю, проверьте AllowedIPs и адрес интерфейса клиента.

Если открывается MikroTik, но не LAN, почти всегда нет forward-правила или обратного маршрута. Если доступна LAN по IP, но не по имени, проверьте маршрут до DNS, разрешение UDP и TCP 53, а также настройку DNS клиента. Если часть сайтов или файлов зависает, измерьте Path MTU и уменьшите MTU с обеих сторон небольшими шагами.

Отозвать один клиент и заменить ключи

WireGuard не использует логин и пароль. Отзыв выполняется удалением или отключением peer. Активное соединение перестанет проходить сразу после изменения.

/interface wireguard peers disable \
    [find where comment="Ivanov laptop; ticket <NUMBER>"]
/interface wireguard peers print detail \
    where interface=wg-roadwarrior

Для нового устройства создайте новую пару ключей и новый peer. Не переносите private key со старого ноутбука. Если скомпрометирован ключ самого MikroTik, требуется сменить интерфейсную пару и public key во всех клиентских профилях.

Откатить конфигурацию

Откат выполняйте по комментариям и именам объектов. Сначала отключите интерфейс, затем удалите firewall и NAT, адрес и сам WireGuard-интерфейс.

/interface wireguard disable [find where name=wg-roadwarrior]
/ip firewall filter remove [find where comment~"^WG:"]
/ip firewall nat remove [find where comment="WG fallback NAT to LAN"]
/ip address remove [find where interface=wg-roadwarrior]
/interface wireguard remove [find where name=wg-roadwarrior]

Перед удалением проверьте find, чтобы комментарий не совпал с чужим правилом. После отката внешний UDP 51820 должен быть закрыт, а маршрута 10.77.1.0/24 не должно остаться.

Результат рабочей настройки

После приёмки каждый клиент имеет уникальный ключ и /32, MikroTik принимает WireGuard только на одном UDP-порту, firewall разрешает конкретные внутренние сервисы, а LAN знает обратный маршрут. Администратор видит время последнего handshake и счётчики, может отключить один peer без влияния на остальных и не хранит private keys в тикетах.

Сохраните заполненный протокол приёмки WireGuard: public keys/fingerprints без private key, адреса, AllowedIPs, тесты split tunnel, DNS, разрешённые и запрещённые сервисы, MTU, смену сети, отзыв и откат.

Команды и поведение сверены с руководством WireGuard для RouterOS 7.26 и CLI-справочником WireGuard peers.