Files
shx-network/ospf_ihor_bgp_failover.md

380 lines
13 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 на 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 маршруты продолжат работать через резервный шлюз!