Files
shx-network/ospf_gateway_failover.md

562 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OSPF Gateway Failover: SWE-HIPHOST → FIN-HIPHOST
## Проблема
У вас есть:
- BGP приносит список адресов
- Трафик фильтруется на шлюз `swe-hiphost`
- Нужно автоматически переключаться на `fin-hiphost` при недоступности `swe-hiphost`
- **Решение через OSPF**
## Архитектура решения через OSPF
```mermaid
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):
```shell
# Настроить 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):
```shell
# Настроить 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):
```shell
# Настроить 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:
```shell
# Скрипт на 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:
```shell
# Скрипт на 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:
```shell
# Скрипт на 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 статуса:
```shell
# Создать 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 маршрутов:
```shell
# На HOME проверить OSPF маршруты
/routing ospf route print
# Проверить OSPF соседей
/routing ospf neighbor print
# Проверить routing table BGP-Routes
/ip route print where routing-table=BGP-Routes
```
### Проверка BFD статуса:
```shell
# Проверить BFD сессии
/routing bfd print
# Проверить BFD детали
/routing bfd print detail
```
### Проверка маршрутов на шлюзах:
```shell
# На SWE-HIPHOST
/ip route print where dst-address~"173.194"
# На FIN-HIPHOST
/ip route print where dst-address~"173.194"
```
## Тестирование failover
### Тест 1: Отключение SWE-HIPHOST:
```shell
# Отключить 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:
```shell
# Отключить GRE туннель на FIN
/interface gre disable [find where name=gre-HOME]
# Подождать и проверить что маршруты переключились на SWE
/routing ospf route print
```
## Мониторинг и логирование
### Настройка логирования:
```shell
# Включить логирование для OSPF
/system logging
add topics=ospf
# Включить логирование для BFD
/system logging
add topics=bfd
# Включить логирование для routing
/system logging
add topics=route
```
### Создание дашборда:
```shell
# Скрипт для отображения статуса
/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):
```shell
# 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):
```shell
# 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):
```shell
# 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.