WireGuard + VXLAN — overlay-сети на MikroTik
Объединение удалённых площадок в единый L2-сегмент — одна из самых востребованных задач в корпоративных сетях. WireGuard обеспечивает шифрованный L3-туннель, но не умеет передавать Ethernet-фреймы. VXLAN (Virtual Extensible LAN) решает эту проблему, инкапсулируя L2-трафик в UDP-пакеты. Комбинация WireGuard + VXLAN позволяет получить безопасную overlay-сеть уровня L2 через интернет: устройства на удалённых площадках оказываются в одном broadcast-домене, как если бы были подключены к одному коммутатору.
Описание
Архитектура решения
Схема WireGuard + VXLAN overlay:
codeSite A Site B ┌──────────────────┐ ┌──────────────────┐ │ PC-A │ │ PC-B │ │ 192.168.100.10 │ │ 192.168.100.20 │ │ │ │ │ │ │ │ ┌────┴────┐ │ │ ┌────┴────┐ │ │ │ bridge1 │ │ │ │ bridge1 │ │ │ │ │ │ │ │ │ │ │ │ vxlan100│ │ │ │ vxlan100│ │ │ └────┬────┘ │ │ └────┬────┘ │ │ │ │ │ │ │ │ VXLAN (VNI 100) │ │ VXLAN (VNI 100) │ │ remote=10.255.0.2│ │ remote=10.255.0.1│ │ │ │ │ │ │ │ ┌────┴────┐ │ │ ┌────┴────┐ │ │ │ wg0 │ │ Internet (encrypted) │ │ wg0 │ │ │ │10.255.0.1/30│ │◄──────────────────────────────────►│ │10.255.0.2/30│ │ │ └────┬────┘ │ WireGuard tunnel │ └────┬────┘ │ │ │ │ │ │ │ │ WAN: 203.0.113.1 │ │ WAN: 198.51.100.1│ └──────────────────┘ └──────────────────┘
Уровни инкапсуляции (изнутри наружу):
- Оригинальный Ethernet-фрейм — трафик между PC-A и PC-B (L2)
- VXLAN — инкапсуляция L2 фрейма в UDP (порт 4789), добавляет ~50 байт overhead
- WireGuard — шифрование и инкапсуляция в UDP (порт 13231), добавляет ~60 байт overhead
- Транспортный IP — доставка через интернет
Итого overhead: ~110 байт. При стандартном MTU 1500 полезная нагрузка VXLAN-фрейма составит около 1370 байт (необходимо учитывать для корректной работы).
Зачем нужна связка WireGuard + VXLAN
- L2-связность через интернет — устройства на обеих площадках в одной подсети (один broadcast-домен)
- Шифрование — VXLAN сам по себе не шифрует трафик; WireGuard обеспечивает confidentiality
- Миграция виртуальных машин — vMotion, Live Migration требуют L2-связности между гипервизорами
- Legacy-приложения — программы, работающие только в L2 (NetBIOS, некоторые SCADA-системы)
- Единый DHCP-сервер — один DHCP выдаёт адреса на обеих площадках
- Кластеризация — некоторые кластерные решения требуют L2 между узлами
WireGuard + VXLAN vs другие L2 VPN
| Критерий | WireGuard + VXLAN | EoIP | VPLS/MPLS | L2TP |
|---|---|---|---|---|
| Шифрование | Да (WireGuard) | Нет (нужен IPsec) | Нет | Нет (нужен IPsec) |
| Совместимость | Linux, MikroTik | Только MikroTik | MikroTik, Cisco, Juniper | Широкая |
| Производительность | Высокая | Средняя | Максимальная | Низкая |
| MTU overhead | ~110 байт | ~42 байта | ~8 байт (метки) | ~40 байт |
| Уровень | L2 overlay | L2 | L2 | L2 |
| Масштабируемость | До 16M VNI | 65535 tunnel-id | Высокая | Средняя |
| Требования к инфраструктуре | Интернет | Интернет | Собственная сеть | Интернет |
WireGuard + VXLAN — оптимальный выбор для L2 overlay через интернет, когда нужна шифрование и совместимость с не-MikroTik оборудованием.
Настройка
Требования
- RouterOS 7.20+ на обоих MikroTik
- Публичный IP хотя бы на одной стороне (для WireGuard)
- Сетевые данные:
| Параметр | Site A | Site B |
|---|---|---|
| WAN IP | 203.0.113.1 | 198.51.100.1 |
| WireGuard IP | 10.255.0.1/30 | 10.255.0.2/30 |
| WireGuard Port | 13231 | 13231 |
| LAN Subnet | 192.168.100.0/24 | 192.168.100.0/24 |
| VXLAN VNI | 100 | 100 |
Обратите внимание: LAN subnet одинаковая на обеих площадках — это суть L2 overlay.
Шаг 1: WireGuard туннель
Site A:
[admin@MikroTik] ># Создаём WireGuard интерфейс /interface/wireguard add name=wg0 listen-port=13231 mtu=1420 # Смотрим публичный ключ /interface/wireguard print # Запишите public-key — нужен для Site B # Назначаем IP на WireGuard туннель /ip/address add address=10.255.0.1/30 interface=wg0 # Добавляем peer (Site B) /interface/wireguard/peers add interface=wg0 \ public-key="<PUBLIC_KEY_SITE_B>" \ allowed-address=10.255.0.2/32 \ endpoint-address=198.51.100.1 \ endpoint-port=13231 # Firewall: разрешаем WireGuard /ip/firewall/filter add chain=input protocol=udp dst-port=13231 \ action=accept comment="Allow WireGuard" place-before=0
Site B:
[admin@MikroTik] >/interface/wireguard add name=wg0 listen-port=13231 mtu=1420 /interface/wireguard print # Запишите public-key для Site A /ip/address add address=10.255.0.2/30 interface=wg0 /interface/wireguard/peers add interface=wg0 \ public-key="<PUBLIC_KEY_SITE_A>" \ allowed-address=10.255.0.1/32 \ endpoint-address=203.0.113.1 \ endpoint-port=13231 /ip/firewall/filter add chain=input protocol=udp dst-port=13231 \ action=accept comment="Allow WireGuard" place-before=0
Проверка WireGuard:
[admin@MikroTik] >/ping 10.255.0.2 count=5 src-address=10.255.0.1
Шаг 2: VXLAN overlay поверх WireGuard
После установки WireGuard-туннеля создаём VXLAN-интерфейс, который будет работать внутри туннеля.
Site A:
[admin@MikroTik] ># Создаём VXLAN интерфейс /interface/vxlan add name=vxlan100 vni=100 port=4789 \ local-address=10.255.0.1 remote-address=10.255.0.2 # Устанавливаем MTU с учётом overhead # WireGuard MTU 1420 - VXLAN overhead 50 = 1370 /interface/vxlan set vxlan100 mtu=1370
Site B:
[admin@MikroTik] >/interface/vxlan add name=vxlan100 vni=100 port=4789 \ local-address=10.255.0.2 remote-address=10.255.0.1 /interface/vxlan set vxlan100 mtu=1370
Параметры VXLAN:
vni=100— VXLAN Network Identifier (аналог VLAN ID, диапазон 1–16777215)port=4789— стандартный UDP-порт VXLAN (RFC 7348)local-address— IP WireGuard-интерфейса на этой сторонеremote-address— IP WireGuard-интерфейса на удалённой стороне
VXLAN использует адреса WireGuard-туннеля (10.255.0.x), поэтому весь VXLAN-трафик автоматически идёт через шифрованный WireGuard-туннель.
Шаг 3: Добавление VXLAN в bridge
Для объединения локальной сети с VXLAN-туннелем добавляем оба интерфейса в один bridge.
Site A:
[admin@MikroTik] ># Создаём bridge (или используем существующий) /interface/bridge add name=bridge1 protocol-mode=none \ vlan-filtering=no # Добавляем локальный порт (например, ether2-ether5) /interface/bridge/port add bridge=bridge1 interface=ether2 /interface/bridge/port add bridge=bridge1 interface=ether3 /interface/bridge/port add bridge=bridge1 interface=ether4 /interface/bridge/port add bridge=bridge1 interface=ether5 # Добавляем VXLAN в тот же bridge /interface/bridge/port add bridge=bridge1 interface=vxlan100 # IP-адрес на bridge (gateway для LAN) /ip/address add address=192.168.100.1/24 interface=bridge1
Site B:
[admin@MikroTik] >/interface/bridge add name=bridge1 protocol-mode=none \ vlan-filtering=no /interface/bridge/port add bridge=bridge1 interface=ether2 /interface/bridge/port add bridge=bridge1 interface=ether3 /interface/bridge/port add bridge=bridge1 interface=ether4 /interface/bridge/port add bridge=bridge1 interface=ether5 /interface/bridge/port add bridge=bridge1 interface=vxlan100 # На Site B НЕ назначаем тот же IP — bridge один, но gateway один # Если нужен gateway — используйте VRRP или один DHCP-сервер /ip/address add address=192.168.100.2/24 interface=bridge1
Шаг 4: DHCP (опционально)
Если хотите единый DHCP для обеих площадок — настройте его только на одной стороне:
Site A (DHCP-сервер):
[admin@MikroTik] >/ip/pool add name=pool-lan ranges=192.168.100.10-192.168.100.250 /ip/dhcp-server add name=dhcp-lan interface=bridge1 \ address-pool=pool-lan lease-time=1h /ip/dhcp-server/network add address=192.168.100.0/24 \ gateway=192.168.100.1 dns-server=8.8.8.8,8.8.4.4
DHCP-запросы (broadcast) от клиентов Site B пройдут через VXLAN-туннель до DHCP-сервера на Site A.
Шаг 5: Firewall для VXLAN
VXLAN-трафик идёт внутри WireGuard, поэтому дополнительные правила нужны только для forward через bridge:
[admin@MikroTik] ># Разрешить forward для bridge-трафика /ip/firewall/filter add chain=forward in-interface=bridge1 \ out-interface=bridge1 action=accept \ comment="Allow bridge L2 forward" place-before=0
Полная конфигурация (copy-paste)
Site A — полная конфигурация:
[admin@MikroTik] ># WireGuard /interface/wireguard add name=wg0 listen-port=13231 mtu=1420 /ip/address add address=10.255.0.1/30 interface=wg0 /interface/wireguard/peers add interface=wg0 \ public-key="<PUBLIC_KEY_SITE_B>" \ allowed-address=10.255.0.2/32 \ endpoint-address=198.51.100.1 \ endpoint-port=13231 # VXLAN over WireGuard /interface/vxlan add name=vxlan100 vni=100 port=4789 \ local-address=10.255.0.1 remote-address=10.255.0.2 mtu=1370 # Bridge (L2 domain) /interface/bridge add name=bridge1 protocol-mode=none /interface/bridge/port add bridge=bridge1 interface=ether2 /interface/bridge/port add bridge=bridge1 interface=ether3 /interface/bridge/port add bridge=bridge1 interface=vxlan100 /ip/address add address=192.168.100.1/24 interface=bridge1 # Firewall /ip/firewall/filter add chain=input protocol=udp dst-port=13231 \ action=accept comment="Allow WireGuard" place-before=0 /ip/firewall/filter add chain=forward in-interface=bridge1 \ out-interface=bridge1 action=accept \ comment="Allow bridge forward" place-before=0
Site B — полная конфигурация:
[admin@MikroTik] ># WireGuard /interface/wireguard add name=wg0 listen-port=13231 mtu=1420 /ip/address add address=10.255.0.2/30 interface=wg0 /interface/wireguard/peers add interface=wg0 \ public-key="<PUBLIC_KEY_SITE_A>" \ allowed-address=10.255.0.1/32 \ endpoint-address=203.0.113.1 \ endpoint-port=13231 # VXLAN over WireGuard /interface/vxlan add name=vxlan100 vni=100 port=4789 \ local-address=10.255.0.2 remote-address=10.255.0.1 mtu=1370 # Bridge (L2 domain) /interface/bridge add name=bridge1 protocol-mode=none /interface/bridge/port add bridge=bridge1 interface=ether2 /interface/bridge/port add bridge=bridge1 interface=ether3 /interface/bridge/port add bridge=bridge1 interface=vxlan100 /ip/address add address=192.168.100.2/24 interface=bridge1 # Firewall /ip/firewall/filter add chain=input protocol=udp dst-port=13231 \ action=accept comment="Allow WireGuard" place-before=0 /ip/firewall/filter add chain=forward in-interface=bridge1 \ out-interface=bridge1 action=accept \ comment="Allow bridge forward" place-before=0
Проверка
Проверка WireGuard
[admin@MikroTik] ># Статус WireGuard-туннеля /interface/wireguard/peers print detail # Пинг через туннель /ping 10.255.0.2 count=5
В выводе peers обратите внимание на поля:
last-handshake— время последнего handshake (должно быть < 2 минут)rx/tx— количество переданных байт (должно расти)
Проверка VXLAN
[admin@MikroTik] ># Состояние VXLAN-интерфейса /interface/vxlan print detail # Проверка что интерфейс running /interface print where name=vxlan100
Интерфейс vxlan100 должен иметь флаг R (running).
Проверка Bridge
[admin@MikroTik] ># Порты bridge /interface/bridge/port print where bridge=bridge1 # MAC-таблица bridge (должны быть MAC-адреса с обеих площадок) /interface/bridge/host print where bridge=bridge1
В MAC-таблице вы должны видеть:
- MAC-адреса локальных устройств (на портах ether2-ether5)
- MAC-адреса удалённых устройств (на порту vxlan100)
Проверка L2-связности
С PC-A (192.168.100.10) выполните пинг PC-B (192.168.100.20):
codeping 192.168.100.20
Если пинг проходит — L2 overlay работает. Проверьте ARP:
codearp -a
MAC-адрес PC-B должен быть видим с PC-A, несмотря на то что они физически в разных локациях.
Проверка MTU
Критически важно убедиться, что MTU настроен корректно:
[admin@MikroTik] ># Пинг с большим пакетом через VXLAN /ping 192.168.100.20 size=1342 do-not-fragment count=5
Если пинг с size=1342 проходит, а с size=1400 — нет, MTU настроен верно (1342 + 28 bytes IP/ICMP header = 1370).
Масштабирование: несколько площадок
Для трёх и более площадок потребуется VXLAN с несколькими remote-адресами или использование multicast/BUM-трафика.
Пример для трёх площадок (Site A, B, C):
Site A:
[admin@MikroTik] ># WireGuard peers для B и C /interface/wireguard/peers add interface=wg0 \ public-key="<KEY_B>" \ allowed-address=10.255.0.2/32 \ endpoint-address=198.51.100.1 endpoint-port=13231 /interface/wireguard/peers add interface=wg0 \ public-key="<KEY_C>" \ allowed-address=10.255.0.5/32 \ endpoint-address=192.0.2.1 endpoint-port=13231 # VXLAN VTEPs — по одному на каждый remote /interface/vxlan add name=vxlan100-b vni=100 port=4789 \ local-address=10.255.0.1 remote-address=10.255.0.2 /interface/vxlan add name=vxlan100-c vni=100 port=4789 \ local-address=10.255.0.1 remote-address=10.255.0.5 # Оба VXLAN в один bridge /interface/bridge/port add bridge=bridge1 interface=vxlan100-b /interface/bridge/port add bridge=bridge1 interface=vxlan100-c
При большом количестве площадок (N > 5) количество туннелей растёт как N*(N-1)/2 в full-mesh. В таких случаях рассмотрите hub-and-spoke топологию или EVPN.
Оптимизация MTU
MTU — самый частый источник проблем в overlay-сетях. Разберём расчёт подробно.
Расчёт MTU
codeИнтернет MTU: 1500 - WireGuard overhead: -80 (40 IPv4/IPv6 + 8 UDP + 32 WG header) = WireGuard MTU: 1420 - VXLAN overhead: -50 (20 IP + 8 UDP + 8 VXLAN + 14 inner Ethernet) = VXLAN payload MTU: 1370
Итого: полезная нагрузка через VXLAN — 1370 байт.
Настройка MTU на всех уровнях
[admin@MikroTik] ># WireGuard — 1420 /interface/wireguard set wg0 mtu=1420 # VXLAN — 1370 /interface/vxlan set vxlan100 mtu=1370 # Bridge — наследует минимальный MTU портов (1370) # Клиентские устройства должны использовать MTU ≤ 1370
MSS Clamping
Для TCP-трафика настройте MSS clamping, чтобы избежать фрагментации:
[admin@MikroTik] >/ip/firewall/mangle add chain=forward out-interface=bridge1 \ protocol=tcp tcp-flags=syn action=change-mss \ new-mss=clamp-to-pmtu passthrough=yes \ comment="MSS clamp for VXLAN overlay"
Типичные ошибки
1. VXLAN не работает — фрагментация пакетов
Причина: MTU не учитывает overhead WireGuard + VXLAN. Пакеты фрагментируются или отбрасываются.
Симптомы: пинг маленькими пакетами работает, большие файлы не передаются, SSH "зависает" после авторизации.
Решение: корректно настройте MTU и MSS:
[admin@MikroTik] >/interface/wireguard set wg0 mtu=1420 /interface/vxlan set vxlan100 mtu=1370 /ip/firewall/mangle add chain=forward out-interface=bridge1 \ protocol=tcp tcp-flags=syn action=change-mss \ new-mss=1330 passthrough=yes
2. Broadcast storm через VXLAN
Причина: L2 overlay означает, что весь broadcast-трафик (ARP, DHCP, NetBIOS) проходит через WAN-канал. При большом количестве устройств это может перегрузить канал.
Решение:
[admin@MikroTik] ># Включите storm control на bridge /interface/bridge set bridge1 \ multicast-flood=no \ unknown-multicast-flood=no # Ограничьте broadcast на VXLAN-порту /interface/bridge/port set [find interface=vxlan100] \ broadcast-flood=yes unknown-multicast-flood=no unknown-unicast-flood=no
Также рассмотрите ARP proxy для уменьшения broadcast-трафика.
3. VXLAN remote-address указывает на WAN IP вместо WireGuard IP
Причина: VXLAN настроен с remote-address=198.51.100.1 (WAN) вместо remote-address=10.255.0.2 (WireGuard). Трафик идёт мимо WireGuard-туннеля — нешифрованным.
Решение: VXLAN remote-address должен быть IP из WireGuard-подсети:
[admin@MikroTik] ># Правильно: /interface/vxlan set vxlan100 remote-address=10.255.0.2 # Неправильно: # /interface/vxlan set vxlan100 remote-address=198.51.100.1
4. Bridge loop при неправильной топологии
Причина: на обеих сторонах включён STP, и bridge видит одинаковые MAC-адреса через разные порты.
Решение:
[admin@MikroTik] ># Отключите STP на VXLAN-порту /interface/bridge/port set [find interface=vxlan100] \ auto-isolate=no bpdu-guard=yes # Или используйте protocol-mode=none на bridge /interface/bridge set bridge1 protocol-mode=none
5. WireGuard allowed-address не включает VXLAN-трафик
Причина: в WireGuard peers allowed-address не включает IP VXLAN remote-side. WireGuard отбрасывает VXLAN-пакеты.
Решение: allowed-address должен включать IP WireGuard-пира:
[admin@MikroTik] ># Убедитесь что 10.255.0.2/32 есть в allowed-address /interface/wireguard/peers print detail # При необходимости исправьте: /interface/wireguard/peers set 0 allowed-address=10.255.0.2/32
6. Разные VNI на разных сторонах
Причина: на Site A vni=100, на Site B vni=200. VXLAN отбрасывает пакеты с неверным VNI.
Решение: VNI должен быть одинаковым на всех участниках overlay-сети:
[admin@MikroTik] ># Проверьте VNI на обеих сторонах /interface/vxlan print # При необходимости исправьте: /interface/vxlan set vxlan100 vni=100
Итоги
WireGuard + VXLAN — мощная комбинация для построения шифрованных L2 overlay-сетей через интернет на MikroTik. WireGuard обеспечивает шифрование и аутентификацию, VXLAN — L2-инкапсуляцию. Устройства на удалённых площадках видят друг друга как в одной локальной сети.
Ключевые моменты: правильный расчёт MTU (1370 для payload), VXLAN remote-address должен указывать на WireGuard IP (не WAN), MSS clamping обязателен для TCP. Broadcast storm — главный риск при масштабировании: ограничивайте количество устройств в одном L2-домене и используйте storm control.
Для малого количества площадок (2-5) решение работает отлично. При масштабировании до десятков площадок рассмотрите EVPN/VXLAN с BGP или коммерческие SD-WAN решения.
Site A Site B ┌──────────────────┐ ┌──────────────────┐ │ PC-A │ │ PC-B │ │ 192.168.100.10 │ │ 192.168.100.20 │ │ │ │ │ │ │ │ ┌────┴────┐ │ │ ┌────┴────┐ │ │ │ bridge1 │ │ │ │ bridge1 │ │ │ │ │ │ │ │ │ │ │ │ vxlan100│ │ │ │ vxlan100│ │ │ └────┬────┘ │ │ └────┬────┘ │ │ │ │ │ │ │ │ VXLAN (VNI 100) │ │ VXLAN (VNI 100) │ │ remote=10.255.0.2│ │ remote=10.255.0.1│ │ │ │ │ │ │ │ ┌────┴────┐ │ │ ┌────┴────┐ │ │ │ wg0 │ │ Internet (encrypted) │ │ wg0 │ │ │ │10.255.0.1/30│ │◄──────────────────────────────────►│ │10.255.0.2/30│ │ │ └────┬────┘ │ WireGuard tunnel │ └────┬────┘ │ │ │ │ │ │ │ │ WAN: 203.0.113.1 │ │ WAN: 198.51.100.1│ └──────────────────┘ └──────────────────┘ # Создаём WireGuard интерфейс /interface/wireguard add name=wg0 listen-port=13231 mtu=1420 # Смотрим публичный ключ /interface/wireguard print # Запишите public-key — нужен для Site B # Назначаем IP на WireGuard туннель /ip/address add address=10.255.0.1/30 interface=wg0 # Добавляем peer (Site B) /interface/wireguard/peers add interface=wg0 \ public-key="<PUBLIC_KEY_SITE_B>" \ allowed-address=10.255.0.2/32 \ endpoint-address=198.51.100.1 \ endpoint-port=13231 # Firewall: разрешаем WireGuard /ip/firewall/filter add chain=input protocol=udp dst-port=13231 \ action=accept comment="Allow WireGuard" place-before=0 /interface/wireguard add name=wg0 listen-port=13231 mtu=1420 /interface/wireguard print # Запишите public-key для Site A /ip/address add address=10.255.0.2/30 interface=wg0 /interface/wireguard/peers add interface=wg0 \ public-key="<PUBLIC_KEY_SITE_A>" \ allowed-address=10.255.0.1/32 \ endpoint-address=203.0.113.1 \ endpoint-port=13231 /ip/firewall/filter add chain=input protocol=udp dst-port=13231 \ action=accept comment="Allow WireGuard" place-before=0 /ping 10.255.0.2 count=5 src-address=10.255.0.1 # Создаём VXLAN интерфейс /interface/vxlan add name=vxlan100 vni=100 port=4789 \ local-address=10.255.0.1 remote-address=10.255.0.2 # Устанавливаем MTU с учётом overhead # WireGuard MTU 1420 - VXLAN overhead 50 = 1370 /interface/vxlan set vxlan100 mtu=1370 /interface/vxlan add name=vxlan100 vni=100 port=4789 \ local-address=10.255.0.2 remote-address=10.255.0.1 /interface/vxlan set vxlan100 mtu=1370 # Создаём bridge (или используем существующий) /interface/bridge add name=bridge1 protocol-mode=none \ vlan-filtering=no # Добавляем локальный порт (например, ether2-ether5) /interface/bridge/port add bridge=bridge1 interface=ether2 /interface/bridge/port add bridge=bridge1 interface=ether3 /interface/bridge/port add bridge=bridge1 interface=ether4 /interface/bridge/port add bridge=bridge1 interface=ether5 # Добавляем VXLAN в тот же bridge /interface/bridge/port add bridge=bridge1 interface=vxlan100 # IP-адрес на bridge (gateway для LAN) /ip/address add address=192.168.100.1/24 interface=bridge1 /interface/bridge add name=bridge1 protocol-mode=none \ vlan-filtering=no /interface/bridge/port add bridge=bridge1 interface=ether2 /interface/bridge/port add bridge=bridge1 interface=ether3 /interface/bridge/port add bridge=bridge1 interface=ether4 /interface/bridge/port add bridge=bridge1 interface=ether5 /interface/bridge/port add bridge=bridge1 interface=vxlan100 # На Site B НЕ назначаем тот же IP — bridge один, но gateway один # Если нужен gateway — используйте VRRP или один DHCP-сервер /ip/address add address=192.168.100.2/24 interface=bridge1 /ip/pool add name=pool-lan ranges=192.168.100.10-192.168.100.250 /ip/dhcp-server add name=dhcp-lan interface=bridge1 \ address-pool=pool-lan lease-time=1h /ip/dhcp-server/network add address=192.168.100.0/24 \ gateway=192.168.100.1 dns-server=8.8.8.8,8.8.4.4 # Разрешить forward для bridge-трафика /ip/firewall/filter add chain=forward in-interface=bridge1 \ out-interface=bridge1 action=accept \ comment="Allow bridge L2 forward" place-before=0 # WireGuard /interface/wireguard add name=wg0 listen-port=13231 mtu=1420 /ip/address add address=10.255.0.1/30 interface=wg0 /interface/wireguard/peers add interface=wg0 \ public-key="<PUBLIC_KEY_SITE_B>" \ allowed-address=10.255.0.2/32 \ endpoint-address=198.51.100.1 \ endpoint-port=13231 # VXLAN over WireGuard /interface/vxlan add name=vxlan100 vni=100 port=4789 \ local-address=10.255.0.1 remote-address=10.255.0.2 mtu=1370 # Bridge (L2 domain) /interface/bridge add name=bridge1 protocol-mode=none /interface/bridge/port add bridge=bridge1 interface=ether2 /interface/bridge/port add bridge=bridge1 interface=ether3 /interface/bridge/port add bridge=bridge1 interface=vxlan100 /ip/address add address=192.168.100.1/24 interface=bridge1 # Firewall /ip/firewall/filter add chain=input protocol=udp dst-port=13231 \ action=accept comment="Allow WireGuard" place-before=0 /ip/firewall/filter add chain=forward in-interface=bridge1 \ out-interface=bridge1 action=accept \ comment="Allow bridge forward" place-before=0 # WireGuard /interface/wireguard add name=wg0 listen-port=13231 mtu=1420 /ip/address add address=10.255.0.2/30 interface=wg0 /interface/wireguard/peers add interface=wg0 \ public-key="<PUBLIC_KEY_SITE_A>" \ allowed-address=10.255.0.1/32 \ endpoint-address=203.0.113.1 \ endpoint-port=13231 # VXLAN over WireGuard /interface/vxlan add name=vxlan100 vni=100 port=4789 \ local-address=10.255.0.2 remote-address=10.255.0.1 mtu=1370 # Bridge (L2 domain) /interface/bridge add name=bridge1 protocol-mode=none /interface/bridge/port add bridge=bridge1 interface=ether2 /interface/bridge/port add bridge=bridge1 interface=ether3 /interface/bridge/port add bridge=bridge1 interface=vxlan100 /ip/address add address=192.168.100.2/24 interface=bridge1 # Firewall /ip/firewall/filter add chain=input protocol=udp dst-port=13231 \ action=accept comment="Allow WireGuard" place-before=0 /ip/firewall/filter add chain=forward in-interface=bridge1 \ out-interface=bridge1 action=accept \ comment="Allow bridge forward" place-before=0 # Статус WireGuard-туннеля /interface/wireguard/peers print detail # Пинг через туннель /ping 10.255.0.2 count=5 # Состояние VXLAN-интерфейса /interface/vxlan print detail # Проверка что интерфейс running /interface print where name=vxlan100 # Порты bridge /interface/bridge/port print where bridge=bridge1 # MAC-таблица bridge (должны быть MAC-адреса с обеих площадок) /interface/bridge/host print where bridge=bridge1 ping 192.168.100.20 arp -a # Пинг с большим пакетом через VXLAN /ping 192.168.100.20 size=1342 do-not-fragment count=5 # WireGuard peers для B и C /interface/wireguard/peers add interface=wg0 \ public-key="<KEY_B>" \ allowed-address=10.255.0.2/32 \ endpoint-address=198.51.100.1 endpoint-port=13231 /interface/wireguard/peers add interface=wg0 \ public-key="<KEY_C>" \ allowed-address=10.255.0.5/32 \ endpoint-address=192.0.2.1 endpoint-port=13231 # VXLAN VTEPs — по одному на каждый remote /interface/vxlan add name=vxlan100-b vni=100 port=4789 \ local-address=10.255.0.1 remote-address=10.255.0.2 /interface/vxlan add name=vxlan100-c vni=100 port=4789 \ local-address=10.255.0.1 remote-address=10.255.0.5 # Оба VXLAN в один bridge /interface/bridge/port add bridge=bridge1 interface=vxlan100-b /interface/bridge/port add bridge=bridge1 interface=vxlan100-c Интернет MTU: 1500 - WireGuard overhead: -80 (40 IPv4/IPv6 + 8 UDP + 32 WG header) = WireGuard MTU: 1420 - VXLAN overhead: -50 (20 IP + 8 UDP + 8 VXLAN + 14 inner Ethernet) = VXLAN payload MTU: 1370 # WireGuard — 1420 /interface/wireguard set wg0 mtu=1420 # VXLAN — 1370 /interface/vxlan set vxlan100 mtu=1370 # Bridge — наследует минимальный MTU портов (1370) # Клиентские устройства должны использовать MTU ≤ 1370 /ip/firewall/mangle add chain=forward out-interface=bridge1 \ protocol=tcp tcp-flags=syn action=change-mss \ new-mss=clamp-to-pmtu passthrough=yes \ comment="MSS clamp for VXLAN overlay" /interface/wireguard set wg0 mtu=1420 /interface/vxlan set vxlan100 mtu=1370 /ip/firewall/mangle add chain=forward out-interface=bridge1 \ protocol=tcp tcp-flags=syn action=change-mss \ new-mss=1330 passthrough=yes # Включите storm control на bridge /interface/bridge set bridge1 \ multicast-flood=no \ unknown-multicast-flood=no # Ограничьте broadcast на VXLAN-порту /interface/bridge/port set [find interface=vxlan100] \ broadcast-flood=yes unknown-multicast-flood=no unknown-unicast-flood=no # Правильно: /interface/vxlan set vxlan100 remote-address=10.255.0.2 # Неправильно: # /interface/vxlan set vxlan100 remote-address=198.51.100.1 # Отключите STP на VXLAN-порту /interface/bridge/port set [find interface=vxlan100] \ auto-isolate=no bpdu-guard=yes # Или используйте protocol-mode=none на bridge /interface/bridge set bridge1 protocol-mode=none # Убедитесь что 10.255.0.2/32 есть в allowed-address /interface/wireguard/peers print detail # При необходимости исправьте: /interface/wireguard/peers set 0 allowed-address=10.255.0.2/32 # Проверьте VNI на обеих сторонах /interface/vxlan print # При необходимости исправьте: /interface/vxlan set vxlan100 vni=100