16 KiB
16 KiB
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
Заключение
Автоматическое решение обеспечивает:
- Полностью автоматическую обработку 12,000 BGP маршрутов без ручного прописывания
- Автоматический failover через OSPF cost manipulation
- Быстрое обнаружение проблем через BFD (100ms интервал)
- Динамическое управление маршрутами через redistribute
- Масштабируемость - работает с любым количеством BGP маршрутов
Ключевые преимущества:
- ✅ Никаких ручных IP - все автоматически из BGP
- ✅ Масштабируемость - работает с 12,000+ маршрутов
- ✅ Автоматическое создание routing rules для всех BGP маршрутов
- ✅ Динамический failover через OSPF
- ✅ Минимальная настройка - только включить redistribute=bgp
Теперь все 12,000 ваших BGP маршрутов будут автоматически обрабатываться и переключаться между SWE-HIPHOST и FIN-HIPHOST в зависимости от доступности!