Развертывание отказоустойчивого WireGuard Site-to-Site с динамической маршрутизацией OSPF
При попытке развертывания динамической маршрутизации OSPF поверх туннелей WireGuard возникают специфические проблемы:
- OSPF Adjacency зависает в состоянии
Init,2-WayилиExStart/Exchange. - WireGuard отбрасывает мультикаст-пакеты OSPF Hello (
224.0.0.5/224.0.0.6) из-за жесткой фильтрации крипто-маршрутизации (Cryptokey Routing). - При падении одного из резервных каналов маршруты не переключаются автоматически.
- Фрагментация пакетов OSPF DBD (Database Description) из-за некорректного значения MTU интерфейса WireGuard.
1. Настройка ядра Linux и сетевого интерфейса WireGuard
Для пропуска мультикаста и любых транзитных подсетей директива AllowedIPs на обоих узлах должна включать диапазон мультикаста и туннельную подсеть (или 0.0.0.0/0):
# /etc/wireguard/wg0.conf на Узле А (10.254.0.1/30):
[Interface]
PrivateKey = aaaaaa...
Address = 10.254.0.1/30
ListenPort = 51820
MTU = 1420
[Peer]
PublicKey = bbbbbb...
Endpoint = 198.51.100.2:51820
# Обязательно разрешаем мультикаст 224.0.0.0/4 и туннельный линк:
AllowedIPs = 10.254.0.0/30, 224.0.0.0/4, 192.168.0.0/16
PersistentKeepalive = 102. Включение демона OSPF в FRRouting (/etc/frr/daemons)
zebra=yes
ospfd=yes3. Конфигурация OSPF в FRR (/etc/frr/frr.conf)
Поскольку WireGuard является интерфейсом Point-to-Point без нативной поддержки физического широковещания, задайте сетевой тип point-to-point:
frr version 8.5
frr defaults traditional
!
interface wg0
ip ospf network point-to-point
ip ospf hello-interval 2
ip ospf dead-interval 6
ip ospf cost 10
ip ospf mtu-ignore
!
router ospf
ospf router-id 10.254.0.1
network 10.254.0.0/30 area 0
network 192.168.10.0/24 area 0
redistribute connected
!
line vty
!4. Команды проверки статуса OSPF и WireGuard
# Проверка статуса пиров WireGuard:
wg show
# Проверка соседства OSPF через vtysh:
vtysh -c "show ip ospf neighbor"
vtysh -c "show ip route ospf"
vtysh -c "show ip ospf interface wg0" Частые вопросы (FAQ)
Почему OSPF Hello пакеты не проходят через стандартный WireGuard интерфейс?
WireGuard выполняет Cryptokey Routing: пакет отправляется пиру только в том случае, если его IP назначения явно входит в список AllowedIPs этого пира. Поскольку OSPF отправляет Hello на адрес 224.0.0.5, диапазон 224.0.0.0/4 обязательно должен присутствовать в AllowedIPs.
Почему OSPF зависает в состоянии ExStart при установлении соседства?
Это происходит из-за несовпадения MTU между сторонами туннеля при обмене большими DBD пакетами. Решением является принудительная установка одинакового MTU (1420 байт) на интерфейсах wg0 либо включение директивы ip ospf mtu-ignore в конфиге FRR.
Зачем указывать тип 'ip ospf network point-to-point'?
В режиме Point-to-Point протокол OSPF не тратит время и ресурсы на выбор Designated Router (DR) и Backup Designated Router (BDR), что ускоряет сходимость сети до сотен миллисекунд.
Как организовать балансировку трафика через два параллельных WireGuard туннеля?
Создайте два интерфейса (wg0 и wg1) через разных провайдеров, назначьте им одинаковую стоимость (ip ospf cost 10) в конфигурации OSPF, и ядро Linux включит механизм ECMP (Equal-Cost Multi-Path) для маршрутизации трафика.