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,459 @@
|
||||
# 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 в зависимости от доступности!
|
||||
Reference in New Issue
Block a user