21 KiB
21 KiB
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 решение обеспечивает:
- Автоматический failover через OSPF cost manipulation
- Быстрое обнаружение проблем через BFD (100ms интервал)
- Динамическое управление маршрутами через redistribute
- Элегантную интеграцию с существующей OSPF инфраструктурой
- Автоматическое восстановление при восстановлении доступности
Преимущества OSPF подхода:
- ✅ Использует существующую OSPF инфраструктуру
- ✅ Автоматическое распространение изменений
- ✅ Встроенная поддержка failover
- ✅ Меньше скриптов и ручного управления
- ✅ Более надежное решение
Теперь при недоступности SWE-HIPHOST OSPF автоматически выберет маршрут через FIN-HIPHOST, а при восстановлении вернется к SWE-HIPHOST.