459 lines
16 KiB
Markdown
459 lines
16 KiB
Markdown
# OSPF + BGP Автоматический Failover для 12,000 маршрутов
|
||
|
||
## Проблема
|
||
|
||
У вас есть:
|
||
- **12,000 маршрутов** приходят через BGP
|
||
- Трафик фильтруется на шлюз `swe-hiphost`
|
||
- Нужно автоматически переключаться на `fin-hiphost` при недоступности `swe-hiphost`
|
||
- **БЕЗ ручного прописывания IP адресов**
|
||
|
||
## Архитектура автоматического решения
|
||
|
||
```mermaid
|
||
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):
|
||
|
||
```shell
|
||
# Создать 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):
|
||
|
||
```shell
|
||
# 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):
|
||
|
||
```shell
|
||
# 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:
|
||
|
||
```shell
|
||
# Скрипт для динамического изменения 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:
|
||
|
||
```shell
|
||
# Скрипт для динамического изменения 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:
|
||
|
||
```shell
|
||
# Скрипт для условного включения/отключения 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:
|
||
|
||
```shell
|
||
# Скрипт для условного включения/отключения 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:
|
||
|
||
```shell
|
||
# Скрипт для автоматического создания 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 маршрутов:
|
||
|
||
```shell
|
||
# На 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:
|
||
|
||
```shell
|
||
# Скрипт для переключения 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 маршрутов:
|
||
```shell
|
||
# Проверить количество активных BGP маршрутов
|
||
/routing bgp route print count-only where active=yes
|
||
|
||
# Проверить первые 10 BGP маршрутов
|
||
/routing bgp route print where active=yes limit=10
|
||
```
|
||
|
||
### Проверка OSPF redistribute:
|
||
```shell
|
||
# Проверить настройки redistribute
|
||
/routing ospf instance print
|
||
|
||
# Проверить route filters
|
||
/routing ospf redistribute print
|
||
```
|
||
|
||
### Проверка routing rules:
|
||
```shell
|
||
# Проверить количество routing rules
|
||
/routing rule print count-only where table=BGP-Routes
|
||
|
||
# Проверить первые 10 routing rules
|
||
/routing rule print where table=BGP-Routes limit=10
|
||
```
|
||
|
||
### Проверка маршрутов в таблице:
|
||
```shell
|
||
# Проверить количество маршрутов в таблице 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:
|
||
```shell
|
||
# Отключить 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: Проверка количества маршрутов:
|
||
```shell
|
||
# Проверить что все BGP маршруты попали в OSPF
|
||
/routing ospf route print count-only
|
||
|
||
# Сравнить с количеством BGP маршрутов
|
||
/routing bgp route print count-only where active=yes
|
||
```
|
||
|
||
## Мониторинг автоматической системы
|
||
|
||
### Создание дашборда для мониторинга:
|
||
```shell
|
||
# Скрипт для отображения статуса автоматической системы
|
||
/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):
|
||
```shell
|
||
# 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):
|
||
```shell
|
||
# 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):
|
||
```shell
|
||
# 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
|
||
```
|
||
|
||
## Заключение
|
||
|
||
Автоматическое решение обеспечивает:
|
||
|
||
1. **Полностью автоматическую обработку 12,000 BGP маршрутов** без ручного прописывания
|
||
2. **Автоматический failover** через OSPF cost manipulation
|
||
3. **Быстрое обнаружение проблем** через BFD (100ms интервал)
|
||
4. **Динамическое управление маршрутами** через redistribute
|
||
5. **Масштабируемость** - работает с любым количеством BGP маршрутов
|
||
|
||
**Ключевые преимущества:**
|
||
- ✅ **Никаких ручных IP** - все автоматически из BGP
|
||
- ✅ **Масштабируемость** - работает с 12,000+ маршрутов
|
||
- ✅ **Автоматическое создание routing rules** для всех BGP маршрутов
|
||
- ✅ **Динамический failover** через OSPF
|
||
- ✅ **Минимальная настройка** - только включить redistribute=bgp
|
||
|
||
Теперь все 12,000 ваших BGP маршрутов будут автоматически обрабатываться и переключаться между SWE-HIPHOST и FIN-HIPHOST в зависимости от доступности! |