# OSPF Gateway Failover: SWE-HIPHOST → FIN-HIPHOST ## Проблема У вас есть: - BGP приносит список адресов - Трафик фильтруется на шлюз `swe-hiphost` - Нужно автоматически переключаться на `fin-hiphost` при недоступности `swe-hiphost` - **Решение через OSPF** ## Архитектура решения через OSPF ```mermaid graph TB subgraph "HOME" HOME[HOME
home.rt.shx.su] BGP[BGP Routes] OSPF[OSPF Instance] RT[Routing Table] end subgraph "Швеция" SWE[SWE-HIPHOST
swe.hiphost.rt.shx.su] OSPF_SWE[OSPF
redistribute=static] BFD_SWE[BFD Session] end subgraph "Финляндия" FIN[FIN-HIPHOST
fin.hiphost.rt.shx.su] OSPF_FIN[OSPF
redistribute=static] BFD_FIN[BFD Session] end %% OSPF связи HOME -. "OSPF area" .- SWE HOME -. "OSPF area" .- FIN %% BFD мониторинг SWE -. "BFD monitoring" .- FIN HOME -. "BFD monitoring" .- SWE HOME -. "BFD monitoring" .- FIN %% Маршрутизация BGP -. "BGP routes" .- HOME OSPF -. "OSPF routes" .- HOME RT -. "Active routes" .- HOME style HOME fill:#e1f5fe style SWE fill:#4caf50 style FIN fill:#ff9800 style OSPF fill:#ff5722 style BFD_SWE fill:#9c27b0 style BFD_FIN fill:#9c27b0 ``` ## Решение 1: OSPF с динамическими cost ### Настройка на SWE-HIPHOST (swe.hiphost.rt.shx.su): ```shell # Настроить BFD для мониторинга доступности /routing bfd add interface=gre-FIN-HIPHOST interval=100ms multiplier=3 # Создать статические маршруты для BGP адресов /ip route add dst-address=173.194.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=74.125.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=142.250.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=172.217.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=216.58.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=34.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=35.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=142.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd # Включить redistribute в OSPF /routing ospf instance set [ find default=yes ] redistribute=connected,static # Настроить OSPF интерфейс с динамическим cost /routing ospf interface-template add interfaces=gre-HOME cost=10 area=backbone ``` ### Настройка на FIN-HIPHOST (fin.hiphost.rt.shx.su): ```shell # Настроить BFD для мониторинга доступности /routing bfd add interface=gre-SWE-HIPHOST interval=100ms multiplier=3 # Создать статические маршруты для BGP адресов /ip route add dst-address=173.194.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=74.125.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=142.250.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=172.217.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=216.58.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=34.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=35.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=142.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd # Включить redistribute в OSPF /routing ospf instance set [ find default=yes ] redistribute=connected,static # Настроить OSPF интерфейс с высоким cost (резервный) /routing ospf interface-template add interfaces=gre-HOME cost=100 area=backbone ``` ### Настройка на HOME (home.rt.shx.su): ```shell # Настроить BFD для мониторинга обоих шлюзов /routing bfd add interface=gre-SWE-HIPHOST interval=100ms multiplier=3 add interface=gre-FIN-HIPHOST interval=100ms multiplier=3 # OSPF интерфейсы /routing ospf interface-template add interfaces=gre-SWE-HIPHOST cost=10 area=backbone add interfaces=gre-FIN-HIPHOST cost=100 area=backbone # Создать routing table для BGP маршрутов /routing table add name=BGP-Routes fib # Address-list для BGP маршрутов /ip firewall address-list add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route" add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route" add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route" add list=BGP-ROUTES list=172.217.0.0/16 comment="BGP route" add list=BGP-ROUTES list=216.58.0.0/16 comment="BGP route" add list=BGP-ROUTES list=34.0.0.0/8 comment="BGP route" add list=BGP-ROUTES list=35.0.0.0/8 comment="BGP route" add list=BGP-ROUTES list=142.0.0.0/8 comment="BGP route" # Routing rules для BGP маршрутов /routing rule add dst-address=173.194.0.0/16 action=lookup table=BGP-Routes add dst-address=74.125.0.0/16 action=lookup table=BGP-Routes add dst-address=142.250.0.0/16 action=lookup table=BGP-Routes add dst-address=172.217.0.0/16 action=lookup table=BGP-Routes add dst-address=216.58.0.0/16 action=lookup table=BGP-Routes add dst-address=34.0.0.0/8 action=lookup table=BGP-Routes add dst-address=35.0.0.0/8 action=lookup table=BGP-Routes add dst-address=142.0.0.0/8 action=lookup table=BGP-Routes ``` ## Решение 2: OSPF с динамическим cost на основе BFD ### Скрипт для динамического изменения OSPF cost: ```shell # Скрипт на SWE-HIPHOST для изменения cost на основе доступности FIN /system script add name=adjust-ospf-cost-swe source={ :local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST] :local homeInterface [/routing ospf interface-template find where interfaces=gre-HOME] :if ([:len $finStatus] > 0) do={ # FIN доступен - низкий cost (основной маршрут) /routing ospf interface-template set $homeInterface cost=10 :log info "FIN-HIPHOST is UP - SWE cost=10 (primary)" } else={ # FIN недоступен - высокий cost (резервный маршрут) /routing ospf interface-template set $homeInterface cost=1000 :log info "FIN-HIPHOST is DOWN - SWE cost=1000 (backup)" } } # Скрипт на FIN-HIPHOST для изменения cost на основе доступности SWE /system script add name=adjust-ospf-cost-fin source={ :local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST] :local homeInterface [/routing ospf interface-template find where interfaces=gre-HOME] :if ([:len $sweStatus] > 0) do={ # SWE доступен - высокий cost (резервный маршрут) /routing ospf interface-template set $homeInterface cost=100 :log info "SWE-HIPHOST is UP - FIN cost=100 (backup)" } else={ # SWE недоступен - низкий cost (основной маршрут) /routing ospf interface-template set $homeInterface cost=10 :log info "SWE-HIPHOST is DOWN - FIN cost=10 (primary)" } } # Запускать скрипты каждые 5 секунд /system scheduler add name=adjust-ospf-cost-swe interval=5s on-event=adjust-ospf-cost-swe /system scheduler add name=adjust-ospf-cost-fin interval=5s on-event=adjust-ospf-cost-fin ``` ## Решение 3: OSPF с условными маршрутами ### Скрипт для условного создания маршрутов на основе BFD: ```shell # Скрипт на SWE-HIPHOST /system script add name=conditional-routes-swe source={ :local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST] :local bgpRoutes [/routing bgp route print where active=yes] :if ([:len $finStatus] > 0) do={ # FIN доступен - создать маршруты через FIN :foreach route in=$bgpRoutes do={ :local dstAddress [:pick $route 0 [:find $route " "]] :local existingRoute [/ip route print count-only where dst-address=$dstAddress and gateway=fin-hiphost] :if ($existingRoute = 0) do={ /ip route add dst-address=$dstAddress gateway=fin-hiphost distance=1 check-gateway=bfd :log info "Added route $dstAddress via FIN-HIPHOST" } } } else={ # FIN недоступен - удалить маршруты через FIN /ip route remove [find where gateway=fin-hiphost] :log info "Removed routes via FIN-HIPHOST (unavailable)" } } # Скрипт на FIN-HIPHOST /system script add name=conditional-routes-fin source={ :local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST] :local bgpRoutes [/routing bgp route print where active=yes] :if ([:len $sweStatus] > 0) do={ # SWE доступен - создать маршруты через SWE :foreach route in=$bgpRoutes do={ :local dstAddress [:pick $route 0 [:find $route " "]] :local existingRoute [/ip route print count-only where dst-address=$dstAddress and gateway=swe-hiphost] :if ($existingRoute = 0) do={ /ip route add dst-address=$dstAddress gateway=swe-hiphost distance=1 check-gateway=bfd :log info "Added route $dstAddress via SWE-HIPHOST" } } } else={ # SWE недоступен - удалить маршруты через SWE /ip route remove [find where gateway=swe-hiphost] :log info "Removed routes via SWE-HIPHOST (unavailable)" } } # Запускать каждые 30 секунд /system scheduler add name=conditional-routes-swe interval=30s on-event=conditional-routes-swe /system scheduler add name=conditional-routes-fin interval=30s on-event=conditional-routes-fin ``` ## Решение 4: OSPF с route redistribution фильтрацией ### Настройка условного redistribute на основе BFD: ```shell # Скрипт на SWE-HIPHOST для условного redistribute /system script add name=conditional-redistribute-swe source={ :local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST] :if ([:len $finStatus] > 0) do={ # FIN доступен - включить redistribute /routing ospf instance set [find default=yes] redistribute=connected,static :log info "SWE: FIN is UP - redistribute enabled" } else={ # FIN недоступен - отключить redistribute /routing ospf instance set [find default=yes] redistribute=connected :log info "SWE: FIN is DOWN - redistribute disabled" } } # Скрипт на FIN-HIPHOST для условного redistribute /system script add name=conditional-redistribute-fin source={ :local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST] :if ([:len $sweStatus] > 0) do={ # SWE доступен - отключить redistribute (резервный) /routing ospf instance set [find default=yes] redistribute=connected :log info "FIN: SWE is UP - redistribute disabled (backup)" } else={ # SWE недоступен - включить redistribute (основной) /routing ospf instance set [find default=yes] redistribute=connected,static :log info "FIN: SWE is DOWN - redistribute enabled (primary)" } } # Запускать каждые 10 секунд /system scheduler add name=conditional-redistribute-swe interval=10s on-event=conditional-redistribute-swe /system scheduler add name=conditional-redistribute-fin interval=10s on-event=conditional-redistribute-fin ``` ## Решение 5: OSPF с route filtering ### Настройка route filtering на основе BFD статуса: ```shell # Создать route filters на SWE-HIPHOST /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 # Скрипт для условного включения/отключения route filters /system script add name=toggle-route-filters source={ :local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST] :local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST] # На SWE-HIPHOST :if ([:len $finStatus] > 0) do={ # FIN доступен - включить фильтры (SWE будет анонсировать) /routing ospf redistribute enable [find where type=static] :log info "SWE: Route filters enabled (FIN is UP)" } else={ # FIN недоступен - отключить фильтры (SWE не будет анонсировать) /routing ospf redistribute disable [find where type=static] :log info "SWE: Route filters disabled (FIN is DOWN)" } # На FIN-HIPHOST :if ([:len $sweStatus] > 0) do={ # SWE доступен - отключить фильтры (FIN не будет анонсировать) /routing ospf redistribute disable [find where type=static] :log info "FIN: Route filters disabled (SWE is UP)" } else={ # SWE недоступен - включить фильтры (FIN будет анонсировать) /routing ospf redistribute enable [find where type=static] :log info "FIN: Route filters enabled (SWE is DOWN)" } } # Запускать каждые 10 секунд /system scheduler add name=toggle-route-filters interval=10s on-event=toggle-route-filters ``` ## Проверка настройки ### Проверка OSPF маршрутов: ```shell # На HOME проверить OSPF маршруты /routing ospf route print # Проверить OSPF соседей /routing ospf neighbor print # Проверить routing table BGP-Routes /ip route print where routing-table=BGP-Routes ``` ### Проверка BFD статуса: ```shell # Проверить BFD сессии /routing bfd print # Проверить BFD детали /routing bfd print detail ``` ### Проверка маршрутов на шлюзах: ```shell # На SWE-HIPHOST /ip route print where dst-address~"173.194" # На FIN-HIPHOST /ip route print where dst-address~"173.194" ``` ## Тестирование failover ### Тест 1: Отключение SWE-HIPHOST: ```shell # Отключить GRE туннель на SWE /interface gre disable [find where name=gre-HOME] # Подождать 10-30 секунд и проверить OSPF маршруты на HOME /routing ospf route print # Проверить что маршруты идут через FIN /ip route print where routing-table=BGP-Routes ``` ### Тест 2: Отключение FIN-HIPHOST: ```shell # Отключить GRE туннель на FIN /interface gre disable [find where name=gre-HOME] # Подождать и проверить что маршруты переключились на SWE /routing ospf route print ``` ## Мониторинг и логирование ### Настройка логирования: ```shell # Включить логирование для OSPF /system logging add topics=ospf # Включить логирование для BFD /system logging add topics=bfd # Включить логирование для routing /system logging add topics=route ``` ### Создание дашборда: ```shell # Скрипт для отображения статуса /system script add name=show-ospf-status source={ :log info "=== OSPF Gateway Status ===" :log info "BFD Status:" /routing bfd print :log info "OSPF Routes:" /routing ospf route print :log info "OSPF Neighbors:" /routing ospf neighbor print :log info "BGP Routes Table:" /ip route print where routing-table=BGP-Routes :log info "=== End Report ===" } # Запускать каждую минуту /system scheduler add name=ospf-status interval=1m on-event=show-ospf-status ``` ## Полная конфигурация для копирования ### SWE-HIPHOST (swe.hiphost.rt.shx.su): ```shell # BFD для мониторинга FIN /routing bfd add interface=gre-FIN-HIPHOST interval=100ms multiplier=3 # Статические маршруты через FIN /ip route add dst-address=173.194.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=74.125.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=142.250.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=172.217.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=216.58.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=34.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=35.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd add dst-address=142.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd # OSPF redistribute /routing ospf instance set [ find default=yes ] redistribute=connected,static # OSPF интерфейс /routing ospf interface-template add interfaces=gre-HOME cost=10 area=backbone ``` ### FIN-HIPHOST (fin.hiphost.rt.shx.su): ```shell # BFD для мониторинга SWE /routing bfd add interface=gre-SWE-HIPHOST interval=100ms multiplier=3 # Статические маршруты через SWE /ip route add dst-address=173.194.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=74.125.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=142.250.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=172.217.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=216.58.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=34.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=35.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=142.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd # OSPF redistribute /routing ospf instance set [ find default=yes ] redistribute=connected,static # OSPF интерфейс (резервный) /routing ospf interface-template add interfaces=gre-HOME cost=100 area=backbone ``` ### HOME (home.rt.shx.su): ```shell # BFD для мониторинга шлюзов /routing bfd add interface=gre-SWE-HIPHOST interval=100ms multiplier=3 add interface=gre-FIN-HIPHOST interval=100ms multiplier=3 # OSPF интерфейсы /routing ospf interface-template add interfaces=gre-SWE-HIPHOST cost=10 area=backbone add interfaces=gre-FIN-HIPHOST cost=100 area=backbone # Routing table для BGP маршрутов /routing table add name=BGP-Routes fib # Address-list для BGP маршрутов /ip firewall address-list add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route" add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route" add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route" add list=BGP-ROUTES list=172.217.0.0/16 comment="BGP route" add list=BGP-ROUTES list=216.58.0.0/16 comment="BGP route" add list=BGP-ROUTES list=34.0.0.0/8 comment="BGP route" add list=BGP-ROUTES list=35.0.0.0/8 comment="BGP route" add list=BGP-ROUTES list=142.0.0.0/8 comment="BGP route" # Routing rules /routing rule add dst-address=173.194.0.0/16 action=lookup table=BGP-Routes add dst-address=74.125.0.0/16 action=lookup table=BGP-Routes add dst-address=142.250.0.0/16 action=lookup table=BGP-Routes add dst-address=172.217.0.0/16 action=lookup table=BGP-Routes add dst-address=216.58.0.0/16 action=lookup table=BGP-Routes add dst-address=34.0.0.0/8 action=lookup table=BGP-Routes add dst-address=35.0.0.0/8 action=lookup table=BGP-Routes add dst-address=142.0.0.0/8 action=lookup table=BGP-Routes # Логирование /system logging add topics=ospf add topics=bfd add topics=route ``` ## Заключение OSPF решение обеспечивает: 1. **Автоматический failover** через OSPF cost manipulation 2. **Быстрое обнаружение проблем** через BFD (100ms интервал) 3. **Динамическое управление маршрутами** через redistribute 4. **Элегантную интеграцию** с существующей OSPF инфраструктурой 5. **Автоматическое восстановление** при восстановлении доступности **Преимущества OSPF подхода:** - ✅ Использует существующую OSPF инфраструктуру - ✅ Автоматическое распространение изменений - ✅ Встроенная поддержка failover - ✅ Меньше скриптов и ручного управления - ✅ Более надежное решение Теперь при недоступности SWE-HIPHOST OSPF автоматически выберет маршрут через FIN-HIPHOST, а при восстановлении вернется к SWE-HIPHOST.