380 lines
13 KiB
Markdown
380 lines
13 KiB
Markdown
# OSPF на IHOR/VPSVILLE с BGP маршрутами и автоматическим failover
|
||
|
||
## Правильная архитектура
|
||
|
||
```mermaid
|
||
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):
|
||
|
||
```shell
|
||
# Настроить 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:
|
||
|
||
```shell
|
||
# Скрипт для динамического изменения 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):
|
||
|
||
```shell
|
||
# Создать 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):
|
||
|
||
```shell
|
||
# 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):
|
||
|
||
```shell
|
||
# 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:
|
||
```shell
|
||
# Проверить 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:
|
||
```shell
|
||
# Проверить OSPF маршруты
|
||
/routing ospf route print
|
||
|
||
# Проверить routing table BGP-Routes
|
||
/ip route print where routing-table=BGP-Routes
|
||
```
|
||
|
||
## Тестирование failover
|
||
|
||
### Тест 1: Отключение SWE-HIPHOST:
|
||
```shell
|
||
# На 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 маршрутов:
|
||
```shell
|
||
# Проверить что BGP маршруты продолжают работать через FIN
|
||
/routing bgp route print count-only where active=yes
|
||
|
||
# Проверить что OSPF анонсирует маршруты
|
||
/routing ospf route print count-only
|
||
```
|
||
|
||
## Мониторинг
|
||
|
||
### Создание дашборда на IHOR:
|
||
```shell
|
||
# Скрипт для отображения статуса
|
||
/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):
|
||
```shell
|
||
# 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):
|
||
```shell
|
||
# 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
|
||
```
|
||
|
||
## Заключение
|
||
|
||
Теперь правильно! Решение обеспечивает:
|
||
|
||
1. **OSPF работает на IHOR** где собираются BGP маршруты
|
||
2. **Автоматический failover** между SWE-HIPHOST и FIN-HIPHOST
|
||
3. **Быстрое обнаружение проблем** через BFD (100ms интервал)
|
||
4. **Динамическое управление маршрутами** на основе доступности шлюзов
|
||
5. **Автоматическое распространение** всех 12,000 BGP маршрутов через OSPF
|
||
|
||
При отвале SWE-HIPHOST IHOR автоматически переключится на FIN-HIPHOST, и все BGP маршруты продолжат работать через резервный шлюз! |