Files
shx-network/ospf_gateway_failover.md

21 KiB
Raw Permalink Blame History

OSPF Gateway Failover: SWE-HIPHOST → FIN-HIPHOST

Проблема

У вас есть:

  • BGP приносит список адресов
  • Трафик фильтруется на шлюз swe-hiphost
  • Нужно автоматически переключаться на fin-hiphost при недоступности swe-hiphost
  • Решение через OSPF

Архитектура решения через OSPF

graph TB
    subgraph "HOME"
        HOME[HOME<br/>home.rt.shx.su]
        BGP[BGP Routes]
        OSPF[OSPF Instance]
        RT[Routing Table]
    end
    
    subgraph "Швеция"
        SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
        OSPF_SWE[OSPF<br/>redistribute=static]
        BFD_SWE[BFD Session]
    end
    
    subgraph "Финляндия"
        FIN[FIN-HIPHOST<br/>fin.hiphost.rt.shx.su]
        OSPF_FIN[OSPF<br/>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):

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

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

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

# Скрипт на 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:

# Скрипт на 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:

# Скрипт на 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 статуса:

# Создать 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 маршрутов:

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

# Проверить OSPF соседей
/routing ospf neighbor print

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

Проверка BFD статуса:

# Проверить BFD сессии
/routing bfd print

# Проверить BFD детали
/routing bfd print detail

Проверка маршрутов на шлюзах:

# На SWE-HIPHOST
/ip route print where dst-address~"173.194"

# На FIN-HIPHOST
/ip route print where dst-address~"173.194"

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

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

# Отключить 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:

# Отключить GRE туннель на FIN
/interface gre disable [find where name=gre-HOME]

# Подождать и проверить что маршруты переключились на SWE
/routing ospf route print

Мониторинг и логирование

Настройка логирования:

# Включить логирование для OSPF
/system logging
add topics=ospf

# Включить логирование для BFD
/system logging
add topics=bfd

# Включить логирование для routing
/system logging
add topics=route

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

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

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

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

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