13 KiB
13 KiB
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
Заключение
Теперь правильно! Решение обеспечивает:
- OSPF работает на IHOR где собираются BGP маршруты
- Автоматический failover между SWE-HIPHOST и FIN-HIPHOST
- Быстрое обнаружение проблем через BFD (100ms интервал)
- Динамическое управление маршрутами на основе доступности шлюзов
- Автоматическое распространение всех 12,000 BGP маршрутов через OSPF
При отвале SWE-HIPHOST IHOR автоматически переключится на FIN-HIPHOST, и все BGP маршруты продолжат работать через резервный шлюз!