# Динамическое управление маршрутами через OSPF и BFD
## Проблема
У вас есть статические маршруты с gateway `swe-hiphost`, которые настраиваются через routing rules, и нужно, чтобы они динамически изменялись в зависимости от активности туннеля через OSPF и BFD.
## Решение: Динамические маршруты через OSPF redistribute
### Архитектура решения
```mermaid
graph TB
subgraph "HOME"
HOME[HOME
home.rt.shx.su]
RT[Routing Table
YouTube]
RR[Routing Rules]
end
subgraph "Москва"
IHOR[MSK-IHOR
msk.ihor.rt.shx.su]
OSPF[OSPF Instance
redistribute=static]
end
subgraph "Швеция"
SWE[SWE-HIPHOST
swe.hiphost.rt.shx.su]
BFD[BFD Session]
end
%% Связи
HOME -- "GRE туннели" --> IHOR
HOME -- "GRE туннели" --> SWE
IHOR -- "GRE туннель" --> SWE
%% OSPF и BFD
IHOR -. "OSPF redistribute" .- HOME
IHOR -. "BFD monitoring" .- SWE
%% Routing
RT -. "OSPF route" .- HOME
RR -. "Policy routing" .- RT
style HOME fill:#e1f5fe
style IHOR fill:#ff9800
style SWE fill:#4caf50
style OSPF fill:#ff5722
style BFD fill:#9c27b0
```
## Пошаговая настройка
### Шаг 1: Настройка BFD для мониторинга туннеля IHOR→SWE
#### На MSK-IHOR (msk.ihor.rt.shx.su):
```shell
# Настроить BFD для GRE туннеля к SWE
/routing bfd
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
# Включить BFD для OSPF
/routing ospf interface-template
set [ find where interfaces=gre-SWE-HIPHOST ] bfd=yes
```
#### На SWE-HIPHOST (swe.hiphost.rt.shx.su):
```shell
# Настроить BFD для GRE туннеля от IHOR
/routing bfd
add interface=gre-IHOR-SWE interval=100ms multiplier=3
# Включить BFD для OSPF
/routing ospf interface-template
set [ find where interfaces=gre-IHOR-SWE ] bfd=yes
```
### Шаг 2: Настройка условных статических маршрутов на IHOR
#### На MSK-IHOR (msk.ihor.rt.shx.su):
```shell
# Создать статические маршруты с проверкой доступности туннеля
/ip route
add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=ping
add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=ping
add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=ping
# Альтернативно - использовать check-gateway=bfd
/ip route
add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
```
### Шаг 3: Настройка OSPF redistribute на IHOR
#### На MSK-IHOR (msk.ihor.rt.shx.su):
```shell
# Включить redistribute статических маршрутов в OSPF
/routing ospf instance
set [ find default=yes ] redistribute=connected,static
# Настроить фильтрацию для redistribute (опционально)
/routing ospf redistribute
add instance=default type=static route-filter=173.194.0.0/16
add instance=default type=static route-filter=74.125.0.0/16
add instance=default type=static route-filter=142.250.0.0/16
add instance=default type=static route-filter=172.217.0.0/16
add instance=default type=static route-filter=216.58.0.0/16
add instance=default type=static route-filter=34.0.0.0/8
add instance=default type=static route-filter=35.0.0.0/8
add instance=default type=static route-filter=142.0.0.0/8
```
### Шаг 4: Настройка routing rules на HOME
#### На HOME (home.rt.shx.su):
```shell
# Создать routing table YouTube
/routing table
add name=YouTube fib
# Создать address-list для YouTube
/ip firewall address-list
add list=YouTube list=173.194.0.0/16 comment="YouTube"
add list=YouTube list=74.125.0.0/16 comment="YouTube"
add list=YouTube list=142.250.0.0/16 comment="YouTube"
add list=YouTube list=172.217.0.0/16 comment="YouTube"
add list=YouTube list=216.58.0.0/16 comment="YouTube"
add list=YouTube list=34.0.0.0/8 comment="YouTube"
add list=YouTube list=35.0.0.0/8 comment="YouTube"
add list=YouTube list=142.0.0.0/8 comment="YouTube"
# Routing rules для YouTube трафика
/routing rule
add dst-address=173.194.0.0/16 action=lookup table=YouTube
add dst-address=74.125.0.0/16 action=lookup table=YouTube
add dst-address=142.250.0.0/16 action=lookup table=YouTube
add dst-address=172.217.0.0/16 action=lookup table=YouTube
add dst-address=216.58.0.0/16 action=lookup table=YouTube
add dst-address=34.0.0.0/8 action=lookup table=YouTube
add dst-address=35.0.0.0/8 action=lookup table=YouTube
add dst-address=142.0.0.0/8 action=lookup table=YouTube
# Маршрут в таблице YouTube через IHOR (будет получаться через OSPF)
/ip route
add dst-address=0.0.0.0/0 gateway=10.100.4.2 routing-table=YouTube distance=1
```
## Альтернативное решение: Скрипт для динамического управления маршрутами
### Создание скрипта на IHOR
#### На MSK-IHOR (msk.ihor.rt.shx.su):
```shell
# Создать скрипт для мониторинга BFD и управления маршрутами
/system script
add name=check-swe-tunnel source={
:local bfdStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
:local routeExists [/ip route print count-only where dst-address=173.194.0.0/16]
:if ([:len $bfdStatus] > 0) do={
:if ($routeExists = 0) do={
:log info "SWE tunnel is UP - adding YouTube routes"
/ip route add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1
/ip route add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1
/ip route add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1
/ip route add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1
/ip route add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1
/ip route add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1
/ip route add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1
/ip route add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1
}
} else={
:if ($routeExists > 0) do={
:log info "SWE tunnel is DOWN - removing YouTube routes"
/ip route remove [find where dst-address=173.194.0.0/16]
/ip route remove [find where dst-address=74.125.0.0/16]
/ip route remove [find where dst-address=142.250.0.0/16]
/ip route remove [find where dst-address=172.217.0.0/16]
/ip route remove [find where dst-address=216.58.0.0/16]
/ip route remove [find where dst-address=34.0.0.0/8]
/ip route remove [find where dst-address=35.0.0.0/8]
/ip route remove [find where dst-address=142.0.0.0/8]
}
}
}
# Создать scheduler для запуска скрипта каждые 10 секунд
/system scheduler
add name=check-swe-tunnel interval=10s on-event=check-swe-tunnel
```
## Решение через OSPF cost manipulation
### Настройка динамического cost на основе BFD
#### На MSK-IHOR (msk.ihor.rt.shx.su):
```shell
# Создать скрипт для изменения OSPF cost на основе BFD статуса
/system script
add name=adjust-ospf-cost source={
:local bfdStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
:local ospfInterface [/routing ospf interface-template find where interfaces=gre-SWE-HIPHOST]
:if ([:len $bfdStatus] > 0) do={
# Туннель активен - низкий cost
/routing ospf interface-template set $ospfInterface cost=10
:log info "SWE tunnel UP - OSPF cost set to 10"
} else={
# Туннель неактивен - высокий cost
/routing ospf interface-template set $ospfInterface cost=1000
:log info "SWE tunnel DOWN - OSPF cost set to 1000"
}
}
# Запускать скрипт каждые 5 секунд
/system scheduler
add name=adjust-ospf-cost interval=5s on-event=adjust-ospf-cost
```
## Проверка настройки
### На MSK-IHOR:
```shell
# Проверить BFD статус
/routing bfd print
# Проверить статические маршруты
/ip route print where dst-address~"173.194"
# Проверить OSPF redistribute
/routing ospf redistribute print
# Проверить OSPF маршруты
/routing ospf route print
```
### На HOME:
```shell
# Проверить OSPF маршруты
/routing ospf route print
# Проверить routing table YouTube
/ip route print where routing-table=YouTube
# Проверить routing rules
/routing rule print where table=YouTube
```
## Тестирование
### Тест 1: Проверка автоматического добавления маршрутов
```shell
# На IHOR проверить что маршруты добавлены
/ip route print where dst-address~"173.194"
# На HOME проверить что маршруты получены через OSPF
/routing ospf route print
```
### Тест 2: Проверка failover при отключении туннеля
```shell
# Отключить GRE туннель на IHOR
/interface gre disable [find where name=gre-SWE-HIPHOST]
# Подождать 10-30 секунд и проверить что маршруты исчезли
/ip route print where dst-address~"173.194"
# Включить туннель обратно
/interface gre enable [find where name=gre-SWE-HIPHOST]
# Проверить что маршруты появились снова
/ip route print where dst-address~"173.194"
```
### Тест 3: Проверка BFD мониторинга
```shell
# Проверить BFD сессии
/routing bfd print detail
# Проверить BFD логи
/log print where topics~"bfd"
```
## Мониторинг и логирование
### Настройка логирования на IHOR:
```shell
# Включить логирование для BFD
/system logging
add topics=bfd
# Включить логирование для OSPF
/system logging
add topics=ospf
# Включить логирование для routing
/system logging
add topics=route
```
### Создание дашборда для мониторинга:
```shell
# Скрипт для отображения статуса
/system script
add name=show-tunnel-status source={
:log info "=== Tunnel Status Report ==="
:log info "BFD Status:"
/routing bfd print
:log info "YouTube Routes:"
/ip route print where dst-address~"173.194"
:log info "OSPF Routes:"
/routing ospf route print
:log info "=== End Report ==="
}
# Запускать каждую минуту
/system scheduler
add name=status-report interval=1m on-event=show-tunnel-status
```
## Полная конфигурация для копирования
### MSK-IHOR (msk.ihor.rt.shx.su):
```shell
# BFD для GRE туннеля
/routing bfd
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
# OSPF с BFD
/routing ospf interface-template
set [ find where interfaces=gre-SWE-HIPHOST ] bfd=yes
# Статические маршруты с проверкой
/ip route
add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
# OSPF redistribute
/routing ospf instance
set [ find default=yes ] redistribute=connected,static
```
### SWE-HIPHOST (swe.hiphost.rt.shx.su):
```shell
# BFD для GRE туннеля
/routing bfd
add interface=gre-IHOR-SWE interval=100ms multiplier=3
# OSPF с BFD
/routing ospf interface-template
set [ find where interfaces=gre-IHOR-SWE ] bfd=yes
```
### HOME (home.rt.shx.su):
```shell
# Routing table YouTube
/routing table
add name=YouTube fib
# Address-list YouTube
/ip firewall address-list
add list=YouTube list=173.194.0.0/16 comment="YouTube"
add list=YouTube list=74.125.0.0/16 comment="YouTube"
add list=YouTube list=142.250.0.0/16 comment="YouTube"
add list=YouTube list=172.217.0.0/16 comment="YouTube"
add list=YouTube list=216.58.0.0/16 comment="YouTube"
add list=YouTube list=34.0.0.0/8 comment="YouTube"
add list=YouTube list=35.0.0.0/8 comment="YouTube"
add list=YouTube list=142.0.0.0/8 comment="YouTube"
# Routing rules
/routing rule
add dst-address=173.194.0.0/16 action=lookup table=YouTube
add dst-address=74.125.0.0/16 action=lookup table=YouTube
add dst-address=142.250.0.0/16 action=lookup table=YouTube
add dst-address=172.217.0.0/16 action=lookup table=YouTube
add dst-address=216.58.0.0/16 action=lookup table=YouTube
add dst-address=34.0.0.0/8 action=lookup table=YouTube
add dst-address=35.0.0.0/8 action=lookup table=YouTube
add dst-address=142.0.0.0/8 action=lookup table=YouTube
# Маршрут в таблице YouTube
/ip route
add dst-address=0.0.0.0/0 gateway=10.100.4.2 routing-table=YouTube distance=1
```
## Заключение
Данное решение обеспечивает:
1. **Автоматическое управление маршрутами** через OSPF redistribute
2. **Быстрое обнаружение проблем** через BFD (100ms интервал)
3. **Динамическое добавление/удаление маршрутов** в зависимости от состояния туннеля
4. **Сохранение routing rules** на HOME для Policy Based Routing
5. **Автоматический failover** при проблемах с туннелем
Теперь ваши статические маршруты с gateway `swe-hiphost` будут автоматически появляться и исчезать в зависимости от активности туннеля, контролируемой OSPF и BFD.