Files
shx-network/ospf_ihor_bgp_failover.md

13 KiB
Raw Permalink Blame History

OSPF на IHOR/VPSVILLE с BGP маршрутами и автоматическим failover

Правильная архитектура

graph TB
    subgraph "HOME"
        HOME[HOME<br/>home.rt.shx.su]
        RT[Routing Table<br/>BGP-Routes]
    end
    
    subgraph "Москва"
        IHOR[MSK-IHOR<br/>msk.ihor.rt.shx.su]
        VPSVILLE[MSK-VPSVILLE<br/>msk.vpsville.rt.shx.su]
        BGP[BGP Routes<br/>12,000 маршрутов]
        OSPF[OSPF Instance<br/>redistribute=bgp]
        BFD_SWE[BFD → SWE]
        BFD_FIN[BFD → FIN]
    end
    
    subgraph "Швеция"
        SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
    end
    
    subgraph "Финляндия"
        FIN[FIN-HIPHOST<br/>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):

# Настроить 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:

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

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

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

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

# Проверить 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:

# Проверить OSPF маршруты
/routing ospf route print

# Проверить routing table BGP-Routes
/ip route print where routing-table=BGP-Routes

Тестирование failover

Тест 1: Отключение SWE-HIPHOST:

# На 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 маршрутов:

# Проверить что BGP маршруты продолжают работать через FIN
/routing bgp route print count-only where active=yes

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

Мониторинг

Создание дашборда на IHOR:

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

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

# 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 маршруты продолжат работать через резервный шлюз!