Refactor multiwan_mikrotik_setup.md to improve clarity and consistency in configuration. Renamed PPPoE client interface to 'RTK-Internet', updated routing table entries for failover and health checks in the main routing table, and adjusted connection marking rules for better readability. Added commands for monitoring routes in the main table.
This commit is contained in:
@@ -0,0 +1,380 @@
|
||||
# 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 маршруты продолжат работать через резервный шлюз!
|
||||
Reference in New Issue
Block a user