# OSPF на IHOR/VPSVILLE с BGP маршрутами и автоматическим failover ## Правильная архитектура ```mermaid graph TB subgraph "HOME" HOME[HOME
home.rt.shx.su] RT[Routing Table
BGP-Routes] end subgraph "Москва" IHOR[MSK-IHOR
msk.ihor.rt.shx.su] VPSVILLE[MSK-VPSVILLE
msk.vpsville.rt.shx.su] BGP[BGP Routes
12,000 маршрутов] OSPF[OSPF Instance
redistribute=bgp] BFD_SWE[BFD → SWE] BFD_FIN[BFD → FIN] end subgraph "Швеция" SWE[SWE-HIPHOST
swe.hiphost.rt.shx.su] end subgraph "Финляндия" FIN[FIN-HIPHOST
fin.hiphost.rt.shx.su] end %% BGP и OSPF BGP -. "12,000 routes" .- OSPF OSPF -. "OSPF routes" .- HOME %% BFD мониторинг IHOR -. "BFD monitoring" .- SWE IHOR -. "BFD monitoring" .- FIN %% Маршрутизация HOME -. "Routing rules" .- RT RT -. "OSPF routes" .- HOME style HOME fill:#e1f5fe style IHOR fill:#ff9800 style VPSVILLE fill:#ff9800 style SWE fill:#4caf50 style FIN fill:#ff5722 style BGP fill:#9c27b0 style OSPF fill:#9c27b0 ``` ## Проблема У вас есть: - **OSPF работает на IHOR/VPSVILLE** где собираются BGP маршруты - **12,000 маршрутов** приходят через BGP на IHOR/VPSVILLE - **SWE-HIPHOST** - основной шлюз для BGP маршрутов - **FIN-HIPHOST** - резервный шлюз - При отвале SWE-HIPHOST нужно автоматически переключиться на FIN-HIPHOST ## Решение 1: Динамические маршруты с check-gateway на IHOR ### Настройка на MSK-IHOR (msk.ihor.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 # Включить redistribute BGP в OSPF /routing ospf instance set [ find default=yes ] redistribute=connected,static,bgp # Создать статические маршруты с failover для BGP маршрутов # Основной маршрут через SWE-HIPHOST /ip route add dst-address=0.0.0.0/0 gateway=swe-hiphost distance=1 check-gateway=bfd # Резервный маршрут через FIN-HIPHOST add dst-address=0.0.0.0/0 gateway=fin-hiphost distance=2 check-gateway=bfd ``` ## Решение 2: Динамический OSPF cost на основе BFD ### Скрипт на IHOR для изменения OSPF cost: ```shell # Скрипт для динамического изменения OSPF cost на основе доступности шлюзов /system script add name=adjust-gateway-cost source={ :local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST] :local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST] :local sweInterface [/routing ospf interface-template find where interfaces=gre-SWE-HIPHOST] :local finInterface [/routing ospf interface-template find where interfaces=gre-FIN-HIPHOST] # Настроить cost для SWE-HIPHOST :if ([:len $sweStatus] > 0) do={ # SWE доступен - низкий cost (основной маршрут) /routing ospf interface-template set $sweInterface cost=10 :log info "SWE-HIPHOST is UP - cost=10 (primary)" } else={ # SWE недоступен - высокий cost (резервный маршрут) /routing ospf interface-template set $sweInterface cost=1000 :log info "SWE-HIPHOST is DOWN - cost=1000 (backup)" } # Настроить cost для FIN-HIPHOST :if ([:len $finStatus] > 0) do={ :if ([:len $sweStatus] > 0) do={ # SWE доступен - FIN как резервный /routing ospf interface-template set $finInterface cost=100 :log info "FIN-HIPHOST is UP - cost=100 (backup)" } else={ # SWE недоступен - FIN как основной /routing ospf interface-template set $finInterface cost=10 :log info "FIN-HIPHOST is UP - cost=10 (primary)" } } else={ # FIN недоступен - высокий cost /routing ospf interface-template set $finInterface cost=1000 :log info "FIN-HIPHOST is DOWN - cost=1000" } } # Запускать каждые 5 секунд /system scheduler add name=adjust-gateway-cost interval=5s on-event=adjust-gateway-cost ``` ## Решение 3: Условный redistribute на основе BFD ### Скрипт на IHOR для условного включения/отключения redistribute BGP /system script add name=conditional-bgp-redistribute source={ :local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST] :local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST] :if ([:len $sweStatus] > 0) do={ # SWE доступен - включить redistribute BGP (основной) /routing ospf instance set [find default=yes] redistribute=connected,static,bgp :log info "SWE-HIPHOST is UP - BGP redistribute enabled (primary)" } else={ :if ([:len $finStatus] > 0) do={ # SWE недоступен, но FIN доступен - включить redistribute BGP (резервный) /routing ospf instance set [find default=yes] redistribute=connected,static,bgp :log info "SWE-HIPHOST is DOWN, FIN-HIPHOST is UP - BGP redistribute enabled (backup)" } else={ # Оба недоступны - отключить redistribute BGP /routing ospf instance set [find default=yes] redistribute=connected,static :log info "Both gateways are DOWN - BGP redistribute disabled" } } } # Запускать каждые 10 секунд /system scheduler add name=conditional-bgp-redistribute interval=10s on-event=conditional-bgp-redistribute ``` ## Решение 4: Динамические статические маршруты ### Скрипт на IHOR для управления статическими маршрутами: ```shell # Скрипт для динамического управления статическими маршрутами /system script add name=manage-gateway-routes source={ :local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST] :local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST] :local sweRoute [/ip route print count-only where gateway=swe-hiphost and dst-address=0.0.0.0/0] :local finRoute [/ip route print count-only where gateway=fin-hiphost and dst-address=0.0.0.0/0] # Управление маршрутом через SWE :if ([:len $sweStatus] > 0) do={ :if ($sweRoute = 0) do={ # SWE доступен, но маршрута нет - создать /ip route add dst-address=0.0.0.0/0 gateway=swe-hiphost distance=1 check-gateway=bfd :log info "Added route via SWE-HIPHOST" } } else={ :if ($sweRoute > 0) do={ # SWE недоступен, но маршрут есть - удалить /ip route remove [find where gateway=swe-hiphost and dst-address=0.0.0.0/0] :log info "Removed route via SWE-HIPHOST" } } # Управление маршрутом через FIN :if ([:len $finStatus] > 0) do={ :if ($finRoute = 0) do={ # FIN доступен, но маршрута нет - создать /ip route add dst-address=0.0.0.0/0 gateway=fin-hiphost distance=2 check-gateway=bfd :log info "Added route via FIN-HIPHOST" } } else={ :if ($finRoute > 0) do={ # FIN недоступен, но маршрут есть - удалить /ip route remove [find where gateway=fin-hiphost and dst-address=0.0.0.0/0] :log info "Removed route via FIN-HIPHOST" } } } # Запускать каждые 10 секунд /system scheduler add name=manage-gateway-routes interval=10s on-event=manage-gateway-routes ``` ## Настройка на HOME (home.rt.shx.su): ```shell # Создать routing table для BGP маршрутов /routing table add name=BGP-Routes fib # Routing rule для всех BGP маршрутов /routing rule add dst-address=0.0.0.0/0 action=lookup table=BGP-Routes # OSPF интерфейсы к IHOR /routing ospf interface-template add interfaces=gre-MSK-IHOR-RTK cost=10 area=backbone add interfaces=gre-MSK-IHOR-MTS cost=100 area=backbone ``` ## Настройка на SWE-HIPHOST (swe.hiphost.rt.shx.su): ```shell # BFD для мониторинга от IHOR /routing bfd add interface=gre-IHOR-SWE interval=100ms multiplier=3 # OSPF интерфейс /routing ospf interface-template add interfaces=gre-IHOR-SWE cost=10 area=backbone ``` ## Настройка на FIN-HIPHOST (fin.hiphost.rt.shx.su): ```shell # BFD для мониторинга от IHOR /routing bfd add interface=gre-IHOR-FIN interval=100ms multiplier=3 # OSPF интерфейс (резервный) /routing ospf interface-template add interfaces=gre-IHOR-FIN cost=100 area=backbone ``` ## Проверка настройки ### На IHOR: ```shell # Проверить BFD статус /routing bfd print # Проверить статические маршруты /ip route print where dst-address=0.0.0.0/0 # Проверить OSPF redistribute /routing ospf instance print # Проверить BGP маршруты /routing bgp route print count-only where active=yes ``` ### На HOME: ```shell # Проверить OSPF маршруты /routing ospf route print # Проверить routing table BGP-Routes /ip route print where routing-table=BGP-Routes ``` ## Тестирование failover ### Тест 1: Отключение SWE-HIPHOST: ```shell # На IHOR отключить GRE туннель к SWE /interface gre disable [find where name=gre-SWE-HIPHOST] # Подождать 10-30 секунд и проверить маршруты /ip route print where dst-address=0.0.0.0/0 # Проверить OSPF маршруты на HOME /routing ospf route print ``` ### Тест 2: Проверка BGP маршрутов: ```shell # Проверить что BGP маршруты продолжают работать через FIN /routing bgp route print count-only where active=yes # Проверить что OSPF анонсирует маршруты /routing ospf route print count-only ``` ## Мониторинг ### Создание дашборда на IHOR: ```shell # Скрипт для отображения статуса /system script add name=show-ihor-status source={ :log info "=== IHOR Gateway Status ===" :log info "BFD Status:" /routing bfd print :log info "Gateway Routes:" /ip route print where dst-address=0.0.0.0/0 :log info "BGP Routes Count:" :log info [/routing bgp route print count-only where active=yes] :log info "OSPF Routes Count:" :log info [/routing ospf route print count-only] :log info "=== End Report ===" } # Запускать каждую минуту /system scheduler add name=ihor-status interval=1m on-event=show-ihor-status ``` ## Полная конфигурация для копирования ### MSK-IHOR (msk.ihor.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 redistribute /routing ospf instance set [ find default=yes ] redistribute=connected,static,bgp # Статические маршруты с failover /ip route add dst-address=0.0.0.0/0 gateway=swe-hiphost distance=1 check-gateway=bfd add dst-address=0.0.0.0/0 gateway=fin-hiphost distance=2 check-gateway=bfd # OSPF интерфейсы /routing ospf interface-template add interfaces=gre-SWE-HIPHOST cost=10 area=backbone add interfaces=gre-FIN-HIPHOST cost=100 area=backbone # Логирование /system logging add topics=ospf add topics=bfd add topics=bgp ``` ### HOME (home.rt.shx.su): ```shell # Routing table для BGP маршрутов /routing table add name=BGP-Routes fib # Routing rule для всех BGP маршрутов /routing rule add dst-address=0.0.0.0/0 action=lookup table=BGP-Routes # OSPF интерфейсы к IHOR /routing ospf interface-template add interfaces=gre-MSK-IHOR-RTK cost=10 area=backbone add interfaces=gre-MSK-IHOR-MTS cost=100 area=backbone ``` ## Заключение Теперь правильно! Решение обеспечивает: 1. **OSPF работает на IHOR** где собираются BGP маршруты 2. **Автоматический failover** между SWE-HIPHOST и FIN-HIPHOST 3. **Быстрое обнаружение проблем** через BFD (100ms интервал) 4. **Динамическое управление маршрутами** на основе доступности шлюзов 5. **Автоматическое распространение** всех 12,000 BGP маршрутов через OSPF При отвале SWE-HIPHOST IHOR автоматически переключится на FIN-HIPHOST, и все BGP маршруты продолжат работать через резервный шлюз!