Files
shx-network/ospf_bgp_automatic_failover.md
T

16 KiB
Raw Blame History

OSPF + BGP Автоматический Failover для 12,000 маршрутов

Проблема

У вас есть:

  • 12,000 маршрутов приходят через BGP
  • Трафик фильтруется на шлюз swe-hiphost
  • Нужно автоматически переключаться на fin-hiphost при недоступности swe-hiphost
  • БЕЗ ручного прописывания IP адресов

Архитектура автоматического решения

graph TB
    subgraph "HOME"
        HOME[HOME<br/>home.rt.shx.su]
        BGP[BGP Routes<br/>12,000 маршрутов]
        OSPF[OSPF Instance]
        RT[Routing Table<br/>BGP-Routes]
        SCRIPT[Auto Script<br/>BGP→OSPF]
    end
    
    subgraph "Швеция"
        SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
        OSPF_SWE[OSPF<br/>redistribute=bgp]
        BFD_SWE[BFD Session]
    end
    
    subgraph "Финляндия"
        FIN[FIN-HIPHOST<br/>fin.hiphost.rt.shx.su]
        OSPF_FIN[OSPF<br/>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):

# Создать 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):

# 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):

# 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:

# Скрипт для динамического изменения 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:

# Скрипт для динамического изменения 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:

# Скрипт для условного включения/отключения 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:

# Скрипт для условного включения/отключения 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:

# Скрипт для автоматического создания 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 маршрутов:

# На 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:

# Скрипт для переключения 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 маршрутов:

# Проверить количество активных BGP маршрутов
/routing bgp route print count-only where active=yes

# Проверить первые 10 BGP маршрутов
/routing bgp route print where active=yes limit=10

Проверка OSPF redistribute:

# Проверить настройки redistribute
/routing ospf instance print

# Проверить route filters
/routing ospf redistribute print

Проверка routing rules:

# Проверить количество routing rules
/routing rule print count-only where table=BGP-Routes

# Проверить первые 10 routing rules
/routing rule print where table=BGP-Routes limit=10

Проверка маршрутов в таблице:

# Проверить количество маршрутов в таблице 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:

# Отключить 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: Проверка количества маршрутов:

# Проверить что все BGP маршруты попали в OSPF
/routing ospf route print count-only

# Сравнить с количеством BGP маршрутов
/routing bgp route print count-only where active=yes

Мониторинг автоматической системы

Создание дашборда для мониторинга:

# Скрипт для отображения статуса автоматической системы
/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):

# 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):

# 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):

# 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 в зависимости от доступности!