# OSPF + BGP Автоматический Failover для 12,000 маршрутов ## Проблема У вас есть: - **12,000 маршрутов** приходят через BGP - Трафик фильтруется на шлюз `swe-hiphost` - Нужно автоматически переключаться на `fin-hiphost` при недоступности `swe-hiphost` - **БЕЗ ручного прописывания IP адресов** ## Архитектура автоматического решения ```mermaid graph TB subgraph "HOME" HOME[HOME
home.rt.shx.su] BGP[BGP Routes
12,000 маршрутов] OSPF[OSPF Instance] RT[Routing Table
BGP-Routes] SCRIPT[Auto Script
BGP→OSPF] end subgraph "Швеция" SWE[SWE-HIPHOST
swe.hiphost.rt.shx.su] OSPF_SWE[OSPF
redistribute=bgp] BFD_SWE[BFD Session] end subgraph "Финляндия" FIN[FIN-HIPHOST
fin.hiphost.rt.shx.su] OSPF_FIN[OSPF
redistribute=bgp] BFD_FIN[BFD Session] end %% Автоматические связи BGP -. "12,000 routes" .- SCRIPT SCRIPT -. "Auto redistribute" .- OSPF OSPF -. "OSPF routes" .- RT %% BFD мониторинг SWE -. "BFD monitoring" .- FIN HOME -. "BFD monitoring" .- SWE HOME -. "BFD monitoring" .- FIN style HOME fill:#e1f5fe style SWE fill:#4caf50 style FIN fill:#ff9800 style BGP fill:#ff5722 style SCRIPT fill:#9c27b0 ``` ## Решение 1: Автоматический BGP → OSPF redistribute ### Настройка на HOME (home.rt.shx.su): ```shell # Создать routing table для BGP маршрутов /routing table add name=BGP-Routes fib # Включить redistribute BGP в OSPF /routing ospf instance set [ find default=yes ] redistribute=connected,static,bgp # Настроить BFD для мониторинга шлюзов /routing bfd add interface=gre-SWE-HIPHOST interval=100ms multiplier=3 add interface=gre-FIN-HIPHOST interval=100ms multiplier=3 # OSPF интерфейсы с разным cost /routing ospf interface-template add interfaces=gre-SWE-HIPHOST cost=10 area=backbone add interfaces=gre-FIN-HIPHOST cost=100 area=backbone # Routing rule для ВСЕХ BGP маршрутов (автоматически) /routing rule add dst-address=0.0.0.0/0 action=lookup table=BGP-Routes ``` ### Настройка на SWE-HIPHOST (swe.hiphost.rt.shx.su): ```shell # BFD для мониторинга FIN /routing bfd add interface=gre-FIN-HIPHOST interval=100ms multiplier=3 # Включить redistribute BGP в OSPF /routing ospf instance set [ find default=yes ] redistribute=connected,static,bgp # 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 # Включить redistribute BGP в OSPF /routing ospf instance set [ find default=yes ] redistribute=connected,static,bgp # OSPF интерфейс (резервный) /routing ospf interface-template add interfaces=gre-HOME cost=100 area=backbone ``` ## Решение 2: Динамический OSPF cost на основе BFD ### Скрипт на SWE-HIPHOST: ```shell # Скрипт для динамического изменения OSPF cost /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)" } } # Запускать каждые 5 секунд /system scheduler add name=adjust-ospf-cost-swe interval=5s on-event=adjust-ospf-cost-swe ``` ### Скрипт на FIN-HIPHOST: ```shell # Скрипт для динамического изменения OSPF cost /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-fin interval=5s on-event=adjust-ospf-cost-fin ``` ## Решение 3: Условный redistribute на основе BFD ### Скрипт на SWE-HIPHOST: ```shell # Скрипт для условного включения/отключения 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 BGP /routing ospf instance set [find default=yes] redistribute=connected,static,bgp :log info "SWE: FIN is UP - BGP redistribute enabled" } else={ # FIN недоступен - отключить redistribute BGP /routing ospf instance set [find default=yes] redistribute=connected,static :log info "SWE: FIN is DOWN - BGP redistribute disabled" } } # Запускать каждые 10 секунд /system scheduler add name=conditional-redistribute-swe interval=10s on-event=conditional-redistribute-swe ``` ### Скрипт на FIN-HIPHOST: ```shell # Скрипт для условного включения/отключения 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 BGP (резервный) /routing ospf instance set [find default=yes] redistribute=connected,static :log info "FIN: SWE is UP - BGP redistribute disabled (backup)" } else={ # SWE недоступен - включить redistribute BGP (основной) /routing ospf instance set [find default=yes] redistribute=connected,static,bgp :log info "FIN: SWE is DOWN - BGP redistribute enabled (primary)" } } # Запускать каждые 10 секунд /system scheduler add name=conditional-redistribute-fin interval=10s on-event=conditional-redistribute-fin ``` ## Решение 4: Автоматическое создание routing rules для BGP маршрутов ### Скрипт на HOME для автоматического создания routing rules: ```shell # Скрипт для автоматического создания routing rules из BGP /system script add name=create-bgp-routing-rules source={ :local bgpRoutes [/routing bgp route print where active=yes] :local existingRules [/routing rule print count-only where table=BGP-Routes] # Если routing rules еще не созданы :if ($existingRules = 0) do={ :log info "Creating routing rules for BGP routes..." :foreach route in=$bgpRoutes do={ :local dstAddress [:pick $route 0 [:find $route " "]] # Создать routing rule для каждого BGP маршрута /routing rule add dst-address=$dstAddress action=lookup table=BGP-Routes } :log info "Created routing rules for all BGP routes" } } # Запускать каждые 60 секунд (только для создания rules) /system scheduler add name=create-bgp-routing-rules interval=60s on-event=create-bgp-routing-rules ``` ## Решение 5: Полностью автоматическое решение через route filtering ### Настройка route filtering для всех BGP маршрутов: ```shell # На SWE-HIPHOST создать route filter для всех BGP маршрутов /routing ospf redistribute add instance=default type=bgp route-filter=0.0.0.0/0 # На FIN-HIPHOST создать route filter для всех BGP маршрутов /routing ospf redistribute add instance=default type=bgp route-filter=0.0.0.0/0 ``` ### Скрипт для условного включения/отключения route filters: ```shell # Скрипт для переключения route filters /system script add name=toggle-bgp-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 доступен - включить BGP фильтры (SWE будет анонсировать) /routing ospf redistribute enable [find where type=bgp] :log info "SWE: BGP route filters enabled (FIN is UP)" } else={ # FIN недоступен - отключить BGP фильтры (SWE не будет анонсировать) /routing ospf redistribute disable [find where type=bgp] :log info "SWE: BGP route filters disabled (FIN is DOWN)" } # На FIN-HIPHOST :if ([:len $sweStatus] > 0) do={ # SWE доступен - отключить BGP фильтры (FIN не будет анонсировать) /routing ospf redistribute disable [find where type=bgp] :log info "FIN: BGP route filters disabled (SWE is UP)" } else={ # SWE недоступен - включить BGP фильтры (FIN будет анонсировать) /routing ospf redistribute enable [find where type=bgp] :log info "FIN: BGP route filters enabled (SWE is DOWN)" } } # Запускать каждые 10 секунд /system scheduler add name=toggle-bgp-route-filters interval=10s on-event=toggle-bgp-route-filters ``` ## Проверка автоматической настройки ### Проверка BGP маршрутов: ```shell # Проверить количество активных BGP маршрутов /routing bgp route print count-only where active=yes # Проверить первые 10 BGP маршрутов /routing bgp route print where active=yes limit=10 ``` ### Проверка OSPF redistribute: ```shell # Проверить настройки redistribute /routing ospf instance print # Проверить route filters /routing ospf redistribute print ``` ### Проверка routing rules: ```shell # Проверить количество routing rules /routing rule print count-only where table=BGP-Routes # Проверить первые 10 routing rules /routing rule print where table=BGP-Routes limit=10 ``` ### Проверка маршрутов в таблице: ```shell # Проверить количество маршрутов в таблице BGP-Routes /ip route print count-only where routing-table=BGP-Routes # Проверить первые 10 маршрутов /ip route print where routing-table=BGP-Routes limit=10 ``` ## Тестирование автоматического failover ### Тест 1: Отключение SWE-HIPHOST: ```shell # Отключить GRE туннель на SWE /interface gre disable [find where name=gre-HOME] # Подождать 10-30 секунд и проверить OSPF маршруты /routing ospf route print # Проверить что маршруты идут через FIN /ip route print where routing-table=BGP-Routes limit=5 ``` ### Тест 2: Проверка количества маршрутов: ```shell # Проверить что все BGP маршруты попали в OSPF /routing ospf route print count-only # Сравнить с количеством BGP маршрутов /routing bgp route print count-only where active=yes ``` ## Мониторинг автоматической системы ### Создание дашборда для мониторинга: ```shell # Скрипт для отображения статуса автоматической системы /system script add name=show-auto-bgp-status source={ :log info "=== Automatic BGP Failover Status ===" :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 "Routing Rules Count:" :log info [/routing rule print count-only where table=BGP-Routes] :log info "BGP-Routes Table Count:" :log info [/ip route print count-only where routing-table=BGP-Routes] :log info "BFD Status:" /routing bfd print :log info "=== End Report ===" } # Запускать каждую минуту /system scheduler add name=auto-bgp-status interval=1m on-event=show-auto-bgp-status ``` ## Полная автоматическая конфигурация ### HOME (home.rt.shx.su): ```shell # Routing table для BGP маршрутов /routing table add name=BGP-Routes fib # 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 rule для ВСЕХ BGP маршрутов /routing rule add dst-address=0.0.0.0/0 action=lookup table=BGP-Routes # Логирование /system logging add topics=ospf add topics=bfd add topics=bgp ``` ### SWE-HIPHOST (swe.hiphost.rt.shx.su): ```shell # BFD для мониторинга FIN /routing bfd add interface=gre-FIN-HIPHOST interval=100ms multiplier=3 # OSPF redistribute /routing ospf instance set [ find default=yes ] redistribute=connected,static,bgp # 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 # OSPF redistribute /routing ospf instance set [ find default=yes ] redistribute=connected,static,bgp # OSPF интерфейс (резервный) /routing ospf interface-template add interfaces=gre-HOME cost=100 area=backbone ``` ## Заключение Автоматическое решение обеспечивает: 1. **Полностью автоматическую обработку 12,000 BGP маршрутов** без ручного прописывания 2. **Автоматический failover** через OSPF cost manipulation 3. **Быстрое обнаружение проблем** через BFD (100ms интервал) 4. **Динамическое управление маршрутами** через redistribute 5. **Масштабируемость** - работает с любым количеством BGP маршрутов **Ключевые преимущества:** - ✅ **Никаких ручных IP** - все автоматически из BGP - ✅ **Масштабируемость** - работает с 12,000+ маршрутов - ✅ **Автоматическое создание routing rules** для всех BGP маршрутов - ✅ **Динамический failover** через OSPF - ✅ **Минимальная настройка** - только включить redistribute=bgp Теперь все 12,000 ваших BGP маршрутов будут автоматически обрабатываться и переключаться между SWE-HIPHOST и FIN-HIPHOST в зависимости от доступности!