WireGuard VPN на MikroTik
WireGuard VPN на MikroTik — полное руководство
WireGuard — самый простой и быстрый VPN-протокол в RouterOS 7. В этом руководстве настроим site-to-site туннель между двумя офисами и remote access для мобильных клиентов.
WireGuard доступен начиная с RouterOS 7.x и установлен по умолчанию.
Как работает WireGuard
WireGuard использует UDP и работает по принципу peer-to-peer. Каждый участник имеет пару ключей (публичный и приватный). Для установки соединения достаточно обменяться публичными ключами.
Ключевые параметры:
- Listen Port — UDP-порт, на котором WireGuard принимает подключения
- Public Key — публичный ключ, передаётся противоположной стороне
- Allowed Address — подсети, трафик которых разрешён через этого peer
- Endpoint — IP-адрес и порт удалённой стороны (нужен только инициатору)
Site-to-Site: объединение двух офисов
Схема:
- Офис A: WAN 203.0.113.1, LAN 192.168.10.0/24, WireGuard 10.255.255.1/30
- Офис B: WAN 198.51.100.1, LAN 192.168.20.0/24, WireGuard 10.255.255.2/30
Настройка Офис A (сервер)
[admin@MikroTik] ># Создаём интерфейс WireGuard /interface wireguard add name=wg-tunnel listen-port=13231 # Смотрим сгенерированный публичный ключ /interface wireguard print # Запишите значение public-key — оно нужно для Офиса B # Назначаем IP-адрес туннелю /ip address add address=10.255.255.1/30 interface=wg-tunnel # Добавляем peer (Офис B) /interface wireguard peers add \ interface=wg-tunnel \ public-key="<ПУБЛИЧНЫЙ_КЛЮЧ_ОФИСА_B>" \ allowed-address=10.255.255.2/32,192.168.20.0/24 \ endpoint-address=198.51.100.1 \ endpoint-port=13231 # Маршрут в сеть Офиса B через туннель /ip route add dst-address=192.168.20.0/24 gateway=wg-tunnel # Firewall: разрешить WireGuard UDP /ip firewall filter add chain=input protocol=udp dst-port=13231 action=accept \ comment="Allow WireGuard" place-before=0 # Firewall: разрешить forward через туннель /ip firewall filter add chain=forward in-interface=wg-tunnel action=accept \ comment="Allow WG forward" place-before=0
Настройка Офис B (клиент)
[admin@MikroTik] >/interface wireguard add name=wg-tunnel listen-port=13231 /interface wireguard print # Запишите public-key для Офиса A /ip address add address=10.255.255.2/30 interface=wg-tunnel /interface wireguard peers add \ interface=wg-tunnel \ public-key="<ПУБЛИЧНЫЙ_КЛЮЧ_ОФИСА_A>" \ allowed-address=10.255.255.1/32,192.168.10.0/24 \ endpoint-address=203.0.113.1 \ endpoint-port=13231 /ip route add dst-address=192.168.10.0/24 gateway=wg-tunnel /ip firewall filter add chain=input protocol=udp dst-port=13231 action=accept \ place-before=0 /ip firewall filter add chain=forward in-interface=wg-tunnel action=accept \ place-before=0
Проверка туннеля
[admin@MikroTik] ># На Офисе A — пинг до Офиса B через туннель /ping 10.255.255.2 # Пинг до хоста в сети Офиса B /ping 192.168.20.1 # Статус handshake /interface wireguard peers print # last-handshake должен показывать время < 3 минут
Remote Access: подключение мобильных клиентов
Настроим MikroTik как WireGuard-сервер для подключения Windows, Android и iOS.
Сервер (MikroTik)
[admin@MikroTik] ># Интерфейс (если ещё не создан) /interface wireguard add name=wg-vpn listen-port=13231 # IP-адрес для VPN-сети /ip address add address=10.10.10.1/24 interface=wg-vpn # Peer для клиента #1 /interface wireguard peers add \ interface=wg-vpn \ public-key="<ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА>" \ allowed-address=10.10.10.2/32 # Peer для клиента #2 /interface wireguard peers add \ interface=wg-vpn \ public-key="<ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА_2>" \ allowed-address=10.10.10.3/32 # DNS для клиентов — через роутер # (клиенты получат DNS из конфига WireGuard) # Firewall /ip firewall filter add chain=input protocol=udp dst-port=13231 action=accept /ip firewall filter add chain=forward in-interface=wg-vpn action=accept # NAT для выхода VPN-клиентов в интернет (если нужно) /ip firewall nat add chain=srcnat src-address=10.10.10.0/24 \ out-interface=ether1 action=masquerade
Конфиг для Windows/Android/iOS клиента
Создайте файл client.conf:
ini[Interface] PrivateKey = <ПРИВАТНЫЙ_КЛЮЧ_КЛИЕНТА> Address = 10.10.10.2/32 DNS = 10.10.10.1 [Peer] PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_MIKROTIK> Endpoint = 203.0.113.1:13231 AllowedIPs = 0.0.0.0/0 PersistentKeepalive = 25
AllowedIPs = 0.0.0.0/0— весь трафик через VPN (full tunnel)AllowedIPs = 10.10.10.0/24,192.168.10.0/24— только трафик в указанные сети (split tunnel)PersistentKeepalive = 25— нужно для NAT traversal
Генерация ключей на клиенте
Windows/Linux:
bashwg genkey | tee privatekey | wg pubkey > publickey
Android/iOS: ключи генерируются автоматически при создании туннеля в приложении WireGuard.
NAT traversal и dynamic IP
Если MikroTik за NAT провайдера — пробросьте UDP-порт 13231 на роутере провайдера, или используйте MikroTik Cloud DDNS:
[admin@MikroTik] >/ip cloud set ddns-enabled=yes /ip cloud print # dns-name покажет ваш DDNS-адрес: xxxx.sn.mynetname.net
Используйте этот адрес как endpoint в конфигах клиентов.
Persistent Keepalive
Если один из peers за NAT — добавьте keepalive на стороне, которая за NAT:
[admin@MikroTik] >/interface wireguard peers set [find public-key="..."] \ persistent-keepalive=25s
Keepalive нужен только на стороне за NAT. На стороне с публичным IP — не нужен.
Типичные проблемы
- Нет handshake — проверьте что UDP-порт открыт в firewall, ключи правильные, endpoint доступен
- Handshake есть, но трафик не идёт — проверьте allowed-address (должны включать подсети обоих сторон) и маршруты
- allowed-address перекрываются — каждая подсеть может быть в allowed-address только одного peer на интерфейсе
- WebFig баг — сохранение peer без endpoint-address через WebFig устанавливает пустую строку вместо null. Используйте CLI
- Время не синхронизировано — WireGuard требует точных часов. Настройте NTP:
/system ntp client set enabled=yes
# Создаём интерфейс WireGuard /interface wireguard add name=wg-tunnel listen-port=13231 # Смотрим сгенерированный публичный ключ /interface wireguard print # Запишите значение public-key — оно нужно для Офиса B # Назначаем IP-адрес туннелю /ip address add address=10.255.255.1/30 interface=wg-tunnel # Добавляем peer (Офис B) /interface wireguard peers add \ interface=wg-tunnel \ public-key="<ПУБЛИЧНЫЙ_КЛЮЧ_ОФИСА_B>" \ allowed-address=10.255.255.2/32,192.168.20.0/24 \ endpoint-address=198.51.100.1 \ endpoint-port=13231 # Маршрут в сеть Офиса B через туннель /ip route add dst-address=192.168.20.0/24 gateway=wg-tunnel # Firewall: разрешить WireGuard UDP /ip firewall filter add chain=input protocol=udp dst-port=13231 action=accept \ comment="Allow WireGuard" place-before=0 # Firewall: разрешить forward через туннель /ip firewall filter add chain=forward in-interface=wg-tunnel action=accept \ comment="Allow WG forward" place-before=0 /interface wireguard add name=wg-tunnel listen-port=13231 /interface wireguard print # Запишите public-key для Офиса A /ip address add address=10.255.255.2/30 interface=wg-tunnel /interface wireguard peers add \ interface=wg-tunnel \ public-key="<ПУБЛИЧНЫЙ_КЛЮЧ_ОФИСА_A>" \ allowed-address=10.255.255.1/32,192.168.10.0/24 \ endpoint-address=203.0.113.1 \ endpoint-port=13231 /ip route add dst-address=192.168.10.0/24 gateway=wg-tunnel /ip firewall filter add chain=input protocol=udp dst-port=13231 action=accept \ place-before=0 /ip firewall filter add chain=forward in-interface=wg-tunnel action=accept \ place-before=0 # На Офисе A — пинг до Офиса B через туннель /ping 10.255.255.2 # Пинг до хоста в сети Офиса B /ping 192.168.20.1 # Статус handshake /interface wireguard peers print # last-handshake должен показывать время < 3 минут # Интерфейс (если ещё не создан) /interface wireguard add name=wg-vpn listen-port=13231 # IP-адрес для VPN-сети /ip address add address=10.10.10.1/24 interface=wg-vpn # Peer для клиента #1 /interface wireguard peers add \ interface=wg-vpn \ public-key="<ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА>" \ allowed-address=10.10.10.2/32 # Peer для клиента #2 /interface wireguard peers add \ interface=wg-vpn \ public-key="<ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА_2>" \ allowed-address=10.10.10.3/32 # DNS для клиентов — через роутер # (клиенты получат DNS из конфига WireGuard) # Firewall /ip firewall filter add chain=input protocol=udp dst-port=13231 action=accept /ip firewall filter add chain=forward in-interface=wg-vpn action=accept # NAT для выхода VPN-клиентов в интернет (если нужно) /ip firewall nat add chain=srcnat src-address=10.10.10.0/24 \ out-interface=ether1 action=masquerade - `AllowedIPs = 0.0.0.0/0` — весь трафик через VPN (full tunnel) - `AllowedIPs = 10.10.10.0/24,192.168.10.0/24` — только трафик в указанные сети (split tunnel) - `PersistentKeepalive = 25` — нужно для NAT traversal #### Генерация ключей на клиенте Windows/Linux: Android/iOS: ключи генерируются автоматически при создании туннеля в приложении WireGuard. ### NAT traversal и dynamic IP Если MikroTik за NAT провайдера — пробросьте UDP-порт 13231 на роутере провайдера, или используйте MikroTik Cloud DDNS: Используйте этот адрес как endpoint в конфигах клиентов. ### Persistent Keepalive Если один из peers за NAT — добавьте keepalive на стороне, которая за NAT: