Files
shx-network/dynamic_routing_with_ospf_bfd.md

412 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Динамическое управление маршрутами через OSPF и BFD
## Проблема
У вас есть статические маршруты с gateway `swe-hiphost`, которые настраиваются через routing rules, и нужно, чтобы они динамически изменялись в зависимости от активности туннеля через OSPF и BFD.
## Решение: Динамические маршруты через OSPF redistribute
### Архитектура решения
```mermaid
graph TB
subgraph "HOME"
HOME[HOME<br/>home.rt.shx.su]
RT[Routing Table<br/>YouTube]
RR[Routing Rules]
end
subgraph "Москва"
IHOR[MSK-IHOR<br/>msk.ihor.rt.shx.su]
OSPF[OSPF Instance<br/>redistribute=static]
end
subgraph "Швеция"
SWE[SWE-HIPHOST<br/>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.