WireGuard между MikroTik: VPN между филиалами
В этой статье настроим защищённое соединение WireGuard между двумя роутерами MikroTik и объединим локальные сети двух филиалов.
WireGuard встроен в RouterOS начиная с версии 7. Он работает через UDP, не требует сертификатов и подходит для постоянного соединения между площадками.
Инструкция проверялась на RouterOS v7.
Что получится
После настройки будут работать:
- защищённое соединение между двумя MikroTik;
- маршрутизация между локальными сетями филиалов;
- доступ к устройствам удалённой сети;
- автоматическое восстановление соединения после временного обрыва связи.
1. Подготавливаем схему
В примере используются две разные локальные сети:
MikroTik-1
Локальная сеть: 192.168.10.0/24
MikroTik-2
Локальная сеть: 192.168.20.0/24
Для адресов WireGuard выделяем отдельную сеть:
Сеть WireGuard: 10.0.0.0/30
MikroTik-1: 10.0.0.1
MikroTik-2: 10.0.0.2
Для такого соединения обычно достаточно сети /30.
Перед настройкой необходимо проверить:
- на обоих роутерах установлена RouterOS v7;
- локальные сети филиалов не пересекаются;
- хотя бы один роутер доступен из интернета по UDP;
- выбранный порт WireGuard разрешён на вход;
- при размещении роутера за другим маршрутизатором настроено перенаправление порта.
Warning
Одинаковые локальные сети на двух площадках использовать нельзя. Например, сеть 192.168.1.0/24 не должна одновременно находиться с обеих сторон соединения.
Если оба роутера находятся за CGNAT и ни один из них нельзя сделать доступным из интернета, прямое соединение WireGuard между ними не установится.
2. Создаём интерфейсы WireGuard
На первом роутере:
/interface wireguard
add name=wg-mikrotik-2 listen-port=51820 mtu=1420
На втором роутере:
/interface wireguard
add name=wg-mikrotik-1 listen-port=51820 mtu=1420
В примере используется порт 51820/udp.
Значение mtu=1420 обычно подходит для обычного подключения к интернету, NAT и PPPoE. Если соединение работает нестабильно или часть пакетов теряется, MTU можно уменьшить.
3. Назначаем адреса WireGuard
На первом роутере:
/ip address
add address=10.0.0.1/30 interface=wg-mikrotik-2
На втором роутере:
/ip address
add address=10.0.0.2/30 interface=wg-mikrotik-1
После этого каждый роутер получает собственный адрес внутри соединения WireGuard.
4. Получаем открытые ключи
При создании интерфейса WireGuard RouterOS автоматически создаёт закрытый и открытый ключи.
Посмотреть их можно командой:
/interface wireguard print detail
Для настройки противоположного роутера нужен параметр:
public-key
Открытый ключ первого роутера указывается на втором роутере, а открытый ключ второго — на первом.
Закрытый ключ передавать на другой роутер не нужно.
Warning
Не используйте один закрытый ключ на нескольких роутерах.
После замены ключей соединение перестанет работать, пока открытый ключ не будет обновлён на противоположной стороне.
5. Добавляем удалённые узлы
Параметр allowed-address определяет, какие адреса находятся за удалённым роутером.
В этой схеме на каждом роутере необходимо указать:
- адрес WireGuard противоположной стороны;
- локальную сеть противоположного филиала.
На первом роутере:
/interface wireguard peers
add interface=wg-mikrotik-2 public-key="MIKROTIK_2_PUBLIC_KEY" endpoint-address=MIKROTIK_2_IP endpoint-port=51820 allowed-address=10.0.0.2/32,192.168.20.0/24 persistent-keepalive=25s
На втором роутере:
/interface wireguard peers
add interface=wg-mikrotik-1 public-key="MIKROTIK_1_PUBLIC_KEY" endpoint-address=MIKROTIK_1_IP endpoint-port=51820 allowed-address=10.0.0.1/32,192.168.10.0/24 persistent-keepalive=25s
Замените:
MIKROTIK_1_PUBLIC_KEY— на открытый ключ первого роутера;MIKROTIK_2_PUBLIC_KEY— на открытый ключ второго роутера;MIKROTIK_1_IP— на внешний адрес первого роутера;MIKROTIK_2_IP— на внешний адрес второго роутера.
Основные параметры:
interface— интерфейс WireGuard, через который работает удалённый узел;public-key— открытый ключ противоположного роутера;endpoint-address— внешний IP-адрес или DNS-имя противоположного роутера;endpoint-port— порт WireGuard на противоположном роутере;allowed-address— адрес WireGuard и сети, находящиеся за противоположным роутером;persistent-keepalive=25s— периодическая отправка служебных пакетов для сохранения соединения через NAT.
Если у роутера постоянный внешний IP-адрес и он не находится за NAT, persistent-keepalive обычно не требуется.
Warning
Сети в allowed-address не должны пересекаться между несколькими удалёнными узлами одного интерфейса WireGuard.
Значение 0.0.0.0/0 в этой схеме использовать не нужно. Оно направляет через удалённый узел весь IPv4-трафик и применяется для других вариантов настройки.
6. Используем DNS-имя при динамическом адресе
Если внешний IP-адрес MikroTik меняется, можно включить встроенное DNS-имя MikroTik:
/ip cloud set ddns-enabled=yes
Проверяем выданное имя:
/ip cloud print
Полученное значение dns-name можно указать в endpoint-address вместо IP-адреса.
Например:
endpoint-address=xxxxxxxxxxxx.sn.mynetname.net
После изменения внешнего адреса RouterOS обновит DNS-запись автоматически.
7. Разрешаем WireGuard в межсетевом экране
На роутере, который принимает входящее соединение, необходимо разрешить порт WireGuard.
Добавляем внешний адрес противоположного роутера в список:
/ip firewall address-list
add list=WG_PEERS address=X.X.X.X
Разрешаем входящие подключения WireGuard:
/ip firewall filter
add chain=input action=accept protocol=udp dst-port=51820 src-address-list=WG_PEERS comment="WireGuard"
Замените X.X.X.X на внешний IP-адрес противоположного роутера.
Правило должно находиться выше общего запрещающего правила в цепочке input.
Если внешний адрес противоположного роутера меняется, ограничение по src-address-list применять неудобно. В таком случае можно разрешить порт без ограничения по адресу:
/ip firewall filter
add chain=input action=accept protocol=udp dst-port=51820 comment="WireGuard"
Открывать порт без ограничения по адресу следует только при необходимости.
8. Разрешаем обмен между филиалами
Разрешаем передачу пакетов между локальными сетями.
/ip firewall filter
add chain=forward action=accept src-address=192.168.10.0/24 dst-address=192.168.20.0/24 comment="WireGuard between sites"
add chain=forward action=accept src-address=192.168.20.0/24 dst-address=192.168.10.0/24 comment="WireGuard between sites"
Эти правила должны находиться выше запрещающих правил и выше FastTrack.
На каждом роутере достаточно правила для направления, которое проходит через него. В примере приведены оба направления, чтобы команды можно было использовать в общей конфигурации.
9. Исключаем сети филиалов из подмены адресов
Если на роутере используется общее правило masquerade, соединения между филиалами необходимо исключить из подмены адресов.
/ip firewall nat
add chain=srcnat action=accept src-address=192.168.10.0/24 dst-address=192.168.20.0/24 comment="WireGuard without NAT"
add chain=srcnat action=accept src-address=192.168.20.0/24 dst-address=192.168.10.0/24 comment="WireGuard without NAT"
Правила должны находиться выше masquerade.
Info
Если правила подмены адресов не затрагивают сети филиалов, отдельное исключение не требуется.
Проверить порядок правил можно командами:
/ip firewall nat print
/ip firewall filter print
10. Проверяем маршруты
RouterOS использует сети из allowed-address для выбора удалённого узла WireGuard.
Проверяем таблицу маршрутизации:
/ip route print
В обычной схеме с двумя филиалами отдельные статические маршруты чаще всего не требуются.
При нескольких внешних каналах, отдельных таблицах маршрутизации или VRF может понадобиться дополнительная настройка маршрутов. Такие схемы в этой статье не рассматриваются.
11. Проверяем соединение
Проверяем удалённые узлы:
/interface wireguard peers print
После успешного обмена ключами появится значение last-handshake, а счётчики rx и tx начнут увеличиваться.
Например:
last-handshake: 10s ago
rx: 12.3 MiB
tx: 8.5 MiB
WireGuard не показывает отдельное состояние «подключено». Основные признаки работы:
- недавно выполнен обмен ключами;
- увеличиваются счётчики приёма и передачи;
- доступен адрес противоположной стороны;
- доступны устройства удалённой локальной сети.
С первого роутера проверяем адрес WireGuard второго:
/ping 10.0.0.2 interface=wg-mikrotik-2
Со второго роутера проверяем адрес WireGuard первого:
/ping 10.0.0.1 interface=wg-mikrotik-1
Затем проверяем адреса роутеров в удалённых локальных сетях.
С первого роутера:
ping 192.168.20.1
Со второго роутера:
ping 192.168.10.1
Если обмен ключами произошёл, но локальные сети недоступны, следует проверить:
- сети в
allowed-address; - правила цепочки
forward; - исключения из
masquerade; - пересечение локальных сетей;
- таблицу маршрутизации.
12. Проверяем журнал и счётчики
Подробные сведения об удалённых узлах:
/interface wireguard peers print detail
Статистика приёма и передачи:
/interface wireguard peers print stats
Журнал WireGuard:
/log print where topics~"wireguard"
Проверка прослушивания и обращений к порту:
/ip firewall connection print where dst-port=51820
Счётчики увеличиваются только при передаче данных или при включённом persistent-keepalive.
13. Учитываем FastTrack
FastTrack может обходить часть правил межсетевого экрана и мешать работе сложных схем маршрутизации и учёта трафика.
Правила, разрешающие обмен между филиалами, рекомендуется разместить выше правила FastTrack:
/ip firewall filter
add chain=forward action=accept src-address=192.168.10.0/24 dst-address=192.168.20.0/24 place-before=[find action=fasttrack-connection]
add chain=forward action=accept src-address=192.168.20.0/24 dst-address=192.168.10.0/24 place-before=[find action=fasttrack-connection]
Если соединение не работает или ведёт себя нестабильно, FastTrack можно временно отключить для проверки.
14. Типовые неисправности
Нет обмена ключами
Проверьте:
- внешний адрес в
endpoint-address; - порт в
endpoint-port; - доступность
51820/udp; - перенаправление порта на внешнем маршрутизаторе;
- открытые ключи;
- наличие CGNAT у провайдера;
- правило в цепочке
input.
Обмен ключами есть, но локальные сети недоступны
Проверьте:
- локальную сеть противоположной стороны в
allowed-address; - правила в цепочке
forward; - исключения из
masquerade; - маршруты;
- отсутствие пересечения адресных пространств.
Доступны только адреса WireGuard
Это означает, что само соединение установлено, но пакеты в локальную сеть не проходят.
Проверьте:
- сеть филиала в
allowed-address; - правила межсетевого экрана;
- маршрут до удалённой сети;
- обратный маршрут;
- межсетевой экран конечного устройства.
Соединение пропадает после периода бездействия
Добавьте или проверьте:
persistent-keepalive=25s
Этот параметр особенно важен, если один из роутеров находится за NAT или использует меняющийся внешний адрес.
15. Резервная копия
После завершения настройки сохраните резервную копию конфигурации обоих роутеров.
Создаём текстовый экспорт:
/export file=wireguard-config
Создаём двоичную резервную копию:
/system backup save name=wireguard-backup
Скачайте полученные файлы с обоих роутеров и храните их вне самих устройств.
Особенно важно сохранить:
- настройки интерфейсов WireGuard;
- открытые и закрытые ключи;
- настройки удалённых узлов;
- IP-адреса WireGuard;
- правила межсетевого экрана;
- правила подмены адресов.
Warning
Текстовый экспорт может не содержать закрытые ключи. Для полного восстановления храните также двоичную резервную копию RouterOS.
При потере закрытого ключа соответствующего интерфейса придётся создать новую пару ключей и заменить открытый ключ на противоположном роутере.
Полезные ссылки
WireGuard
https://www.wireguard.com/
WireGuard в MikroTik RouterOS
https://help.mikrotik.com/docs/display/ROS/WireGuard
Отслеживание соединений в MikroTik RouterOS
https://help.mikrotik.com/docs/display/ROS/Connection+tracking