Compare commits
2
Commits
f2e8ae9b0e
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c2e569e26 | ||
|
|
52ff4437c0 |
No files matched your search
@@ -0,0 +1,412 @@
|
||||
# BGP Gateway Failover: SWE-HIPHOST → FIN-HIPHOST
|
||||
|
||||
## Проблема
|
||||
|
||||
У вас есть:
|
||||
- BGP приносит список адресов
|
||||
- Трафик фильтруется на шлюз `swe-hiphost`
|
||||
- Нужно автоматически переключаться на `fin-hiphost` при недоступности `swe-hiphost`
|
||||
|
||||
## Архитектура решения
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "HOME"
|
||||
HOME[HOME<br/>home.rt.shx.su]
|
||||
BGP[BGP Routes]
|
||||
FILTER[Route Filter<br/>swe-hiphost]
|
||||
FAILOVER[Failover Logic]
|
||||
end
|
||||
|
||||
subgraph "Швеция"
|
||||
SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
|
||||
BFD_SWE[BFD Session]
|
||||
end
|
||||
|
||||
subgraph "Финляндия"
|
||||
FIN[FIN-HIPHOST<br/>fin.hiphost.rt.shx.su]
|
||||
BFD_FIN[BFD Session]
|
||||
end
|
||||
|
||||
%% BGP и маршрутизация
|
||||
BGP -. "BGP routes" .- HOME
|
||||
FILTER -. "Primary gateway" .- SWE
|
||||
FAILOVER -. "Backup gateway" .- FIN
|
||||
|
||||
%% BFD мониторинг
|
||||
HOME -. "BFD monitoring" .- SWE
|
||||
HOME -. "BFD monitoring" .- FIN
|
||||
|
||||
%% Failover
|
||||
FAILOVER -. "Auto switch" .- FILTER
|
||||
|
||||
style HOME fill:#e1f5fe
|
||||
style SWE fill:#4caf50
|
||||
style FIN fill:#ff9800
|
||||
style BFD_SWE fill:#9c27b0
|
||||
style BFD_FIN fill:#9c27b0
|
||||
```
|
||||
|
||||
## Решение 1: Динамические маршруты с check-gateway
|
||||
|
||||
### Настройка на HOME (home.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# Создать address-list для адресов из BGP (пример)
|
||||
/ip firewall address-list
|
||||
add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route"
|
||||
# ... добавьте все ваши BGP маршруты
|
||||
|
||||
# Создать статические маршруты с failover
|
||||
/ip route
|
||||
# Основной маршрут через SWE-HIPHOST
|
||||
add dst-address=173.194.0.0/16 gateway=swe-hiphost distance=1 check-gateway=ping
|
||||
add dst-address=74.125.0.0/16 gateway=swe-hiphost distance=1 check-gateway=ping
|
||||
add dst-address=142.250.0.0/16 gateway=swe-hiphost distance=1 check-gateway=ping
|
||||
|
||||
# Резервный маршрут через FIN-HIPHOST
|
||||
add dst-address=173.194.0.0/16 gateway=fin-hiphost distance=2 check-gateway=ping
|
||||
add dst-address=74.125.0.0/16 gateway=fin-hiphost distance=2 check-gateway=ping
|
||||
add dst-address=142.250.0.0/16 gateway=fin-hiphost distance=2 check-gateway=ping
|
||||
```
|
||||
|
||||
## Решение 2: BFD с динамическими маршрутами
|
||||
|
||||
### Настройка BFD мониторинга:
|
||||
|
||||
```shell
|
||||
# Настроить BFD для SWE-HIPHOST
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Настроить BFD для FIN-HIPHOST
|
||||
/routing bfd
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Создать маршруты с check-gateway=bfd
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# Резервные маршруты
|
||||
add dst-address=173.194.0.0/16 gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
```
|
||||
|
||||
## Решение 3: Скрипт для автоматического управления маршрутами
|
||||
|
||||
### Создание скрипта на HOME:
|
||||
|
||||
```shell
|
||||
# Скрипт для мониторинга и переключения шлюзов
|
||||
/system script
|
||||
add name=gateway-failover source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
|
||||
# Проверить статус SWE-HIPHOST
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - использовать его как primary
|
||||
:log info "SWE-HIPHOST is UP - using as primary gateway"
|
||||
/ip route set [find where dst-address=173.194.0.0/16 and gateway=swe-hiphost] distance=1
|
||||
/ip route set [find where dst-address=173.194.0.0/16 and gateway=fin-hiphost] distance=2
|
||||
/ip route set [find where dst-address=74.125.0.0/16 and gateway=swe-hiphost] distance=1
|
||||
/ip route set [find where dst-address=74.125.0.0/16 and gateway=fin-hiphost] distance=2
|
||||
/ip route set [find where dst-address=142.250.0.0/16 and gateway=swe-hiphost] distance=1
|
||||
/ip route set [find where dst-address=142.250.0.0/16 and gateway=fin-hiphost] distance=2
|
||||
} else={
|
||||
# SWE недоступен - переключиться на FIN
|
||||
:log info "SWE-HIPHOST is DOWN - switching to FIN-HIPHOST"
|
||||
/ip route set [find where dst-address=173.194.0.0/16 and gateway=swe-hiphost] distance=100
|
||||
/ip route set [find where dst-address=173.194.0.0/16 and gateway=fin-hiphost] distance=1
|
||||
/ip route set [find where dst-address=74.125.0.0/16 and gateway=swe-hiphost] distance=100
|
||||
/ip route set [find where dst-address=74.125.0.0/16 and gateway=fin-hiphost] distance=1
|
||||
/ip route set [find where dst-address=142.250.0.0/16 and gateway=swe-hiphost] distance=100
|
||||
/ip route set [find where dst-address=142.250.0.0/16 and gateway=fin-hiphost] distance=1
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать скрипт каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=gateway-failover interval=5s on-event=gateway-failover
|
||||
```
|
||||
|
||||
## Решение 4: Routing Rules с динамическими таблицами
|
||||
|
||||
### Создание динамических routing tables:
|
||||
|
||||
```shell
|
||||
# Создать routing tables для каждого шлюза
|
||||
/routing table
|
||||
add name=SWE-Gateway fib
|
||||
add name=FIN-Gateway fib
|
||||
|
||||
# Создать address-list для BGP маршрутов
|
||||
/ip firewall address-list
|
||||
add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route"
|
||||
|
||||
# Routing rules для BGP маршрутов
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=SWE-Gateway
|
||||
add dst-address=74.125.0.0/16 action=lookup table=SWE-Gateway
|
||||
add dst-address=142.250.0.0/16 action=lookup table=SWE-Gateway
|
||||
|
||||
# Маршруты в таблице SWE-Gateway
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=swe-hiphost routing-table=SWE-Gateway distance=1
|
||||
|
||||
# Маршруты в таблице FIN-Gateway (резервные)
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=fin-hiphost routing-table=FIN-Gateway distance=1
|
||||
```
|
||||
|
||||
### Скрипт для переключения таблиц:
|
||||
|
||||
```shell
|
||||
# Скрипт для переключения между routing tables
|
||||
/system script
|
||||
add name=switch-routing-table source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - использовать SWE-Gateway
|
||||
:log info "SWE-HIPHOST is UP - using SWE-Gateway"
|
||||
/routing rule set [find where table=SWE-Gateway] action=lookup
|
||||
/routing rule set [find where table=FIN-Gateway] action=lookup-only
|
||||
} else={
|
||||
# SWE недоступен - переключиться на FIN-Gateway
|
||||
:log info "SWE-HIPHOST is DOWN - switching to FIN-Gateway"
|
||||
/routing rule set [find where table=SWE-Gateway] action=lookup-only
|
||||
/routing rule set [find where table=FIN-Gateway] action=lookup
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=switch-routing-table interval=5s on-event=switch-routing-table
|
||||
```
|
||||
|
||||
## Решение 5: OSPF с динамическими cost
|
||||
|
||||
### Настройка OSPF с динамическим cost:
|
||||
|
||||
```shell
|
||||
# Создать скрипт для изменения OSPF cost на основе доступности
|
||||
/system script
|
||||
add name=adjust-ospf-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={
|
||||
/routing ospf interface-template set $sweInterface cost=10
|
||||
:log info "SWE-HIPHOST UP - OSPF cost=10"
|
||||
} else={
|
||||
/routing ospf interface-template set $sweInterface cost=1000
|
||||
:log info "SWE-HIPHOST DOWN - OSPF cost=1000"
|
||||
}
|
||||
|
||||
# Настроить cost для FIN-HIPHOST
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
/routing ospf interface-template set $finInterface cost=20
|
||||
:log info "FIN-HIPHOST UP - OSPF cost=20"
|
||||
} else={
|
||||
/routing ospf interface-template set $finInterface cost=1000
|
||||
:log info "FIN-HIPHOST DOWN - OSPF cost=1000"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=adjust-ospf-cost interval=5s on-event=adjust-ospf-cost
|
||||
```
|
||||
|
||||
## Автоматическое создание маршрутов из BGP
|
||||
|
||||
### Скрипт для автоматического создания маршрутов:
|
||||
|
||||
```shell
|
||||
# Скрипт для создания маршрутов из BGP с failover
|
||||
/system script
|
||||
add name=create-bgp-routes source={
|
||||
:local bgpRoutes [/routing bgp route print where active=yes]
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
|
||||
:foreach route in=$bgpRoutes do={
|
||||
:local dstAddress [:pick $route 0 [:find $route " "]]
|
||||
|
||||
# Проверить существует ли уже маршрут
|
||||
:local existingRoute [/ip route print count-only where dst-address=$dstAddress]
|
||||
|
||||
:if ($existingRoute = 0) do={
|
||||
# Создать маршрут с failover
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - создать с distance=1
|
||||
/ip route add dst-address=$dstAddress gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
/ip route add dst-address=$dstAddress gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
:log info "Created route $dstAddress with SWE primary"
|
||||
} else={
|
||||
# SWE недоступен - создать с FIN primary
|
||||
/ip route add dst-address=$dstAddress gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
/ip route add dst-address=$dstAddress gateway=swe-hiphost distance=2 check-gateway=bfd
|
||||
:log info "Created route $dstAddress with FIN primary"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 30 секунд
|
||||
/system scheduler
|
||||
add name=create-bgp-routes interval=30s on-event=create-bgp-routes
|
||||
```
|
||||
|
||||
## Проверка настройки
|
||||
|
||||
### Проверка BFD статуса:
|
||||
```shell
|
||||
# Проверить BFD сессии
|
||||
/routing bfd print
|
||||
|
||||
# Проверить детали BFD
|
||||
/routing bfd print detail
|
||||
```
|
||||
|
||||
### Проверка маршрутов:
|
||||
```shell
|
||||
# Проверить все маршруты
|
||||
/ip route print
|
||||
|
||||
# Проверить маршруты к конкретному адресу
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# Проверить routing tables
|
||||
/ip route print where routing-table=SWE-Gateway
|
||||
/ip route print where routing-table=FIN-Gateway
|
||||
```
|
||||
|
||||
### Проверка BGP маршрутов:
|
||||
```shell
|
||||
# Проверить активные BGP маршруты
|
||||
/routing bgp route print where active=yes
|
||||
|
||||
# Проверить BGP соседей
|
||||
/routing bgp neighbor print
|
||||
```
|
||||
|
||||
## Тестирование failover
|
||||
|
||||
### Тест 1: Проверка переключения при отключении SWE:
|
||||
```shell
|
||||
# Отключить GRE туннель к SWE
|
||||
/interface gre disable [find where name=gre-SWE-HIPHOST]
|
||||
|
||||
# Подождать 10-30 секунд и проверить маршруты
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# Включить туннель обратно
|
||||
/interface gre enable [find where name=gre-SWE-HIPHOST]
|
||||
```
|
||||
|
||||
### Тест 2: Проверка traceroute:
|
||||
```shell
|
||||
# Проверить маршрут к BGP адресу
|
||||
traceroute 173.194.0.1
|
||||
|
||||
# Должен показать путь через активный шлюз
|
||||
```
|
||||
|
||||
## Мониторинг и логирование
|
||||
|
||||
### Настройка логирования:
|
||||
```shell
|
||||
# Включить логирование для BFD
|
||||
/system logging
|
||||
add topics=bfd
|
||||
|
||||
# Включить логирование для routing
|
||||
/system logging
|
||||
add topics=route
|
||||
|
||||
# Включить логирование для BGP
|
||||
/system logging
|
||||
add topics=bgp
|
||||
```
|
||||
|
||||
### Создание дашборда:
|
||||
```shell
|
||||
# Скрипт для отображения статуса
|
||||
/system script
|
||||
add name=show-gateway-status source={
|
||||
:log info "=== Gateway Status Report ==="
|
||||
:log info "BFD Status:"
|
||||
/routing bfd print
|
||||
:log info "Active Routes:"
|
||||
/ip route print where dst-address~"173.194"
|
||||
:log info "BGP Routes:"
|
||||
/routing bgp route print where active=yes
|
||||
:log info "=== End Report ==="
|
||||
}
|
||||
|
||||
# Запускать каждую минуту
|
||||
/system scheduler
|
||||
add name=gateway-status interval=1m on-event=show-gateway-status
|
||||
```
|
||||
|
||||
## Полная конфигурация для копирования
|
||||
|
||||
### HOME (home.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
|
||||
|
||||
# Создать routing tables
|
||||
/routing table
|
||||
add name=SWE-Gateway fib
|
||||
add name=FIN-Gateway fib
|
||||
|
||||
# Address-list для BGP маршрутов
|
||||
/ip firewall address-list
|
||||
add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route"
|
||||
|
||||
# Routing rules
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=SWE-Gateway
|
||||
add dst-address=74.125.0.0/16 action=lookup table=SWE-Gateway
|
||||
add dst-address=142.250.0.0/16 action=lookup table=SWE-Gateway
|
||||
|
||||
# Маршруты в таблицах
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=swe-hiphost routing-table=SWE-Gateway distance=1
|
||||
add dst-address=0.0.0.0/0 gateway=fin-hiphost routing-table=FIN-Gateway distance=1
|
||||
|
||||
# Логирование
|
||||
/system logging
|
||||
add topics=bfd
|
||||
add topics=route
|
||||
add topics=bgp
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
Данное решение обеспечивает:
|
||||
|
||||
1. **Автоматический failover** между SWE-HIPHOST и FIN-HIPHOST
|
||||
2. **Быстрое обнаружение проблем** через BFD (100ms интервал)
|
||||
3. **Динамическое управление маршрутами** в зависимости от доступности шлюзов
|
||||
4. **Поддержку BGP маршрутов** с автоматическим созданием failover маршрутов
|
||||
5. **Гибкость настройки** через routing tables и rules
|
||||
|
||||
Теперь при недоступности SWE-HIPHOST трафик автоматически переключится на FIN-HIPHOST, а при восстановлении SWE-HIPHOST вернется к нему.
|
||||
@@ -0,0 +1,412 @@
|
||||
# Динамическое управление маршрутами через OSPF и BFD
|
||||
|
||||
## Проблема
|
||||
|
||||
У вас есть статические маршруты с gateway `swe-hiphost`, которые настраиваются через routing rules, и нужно, чтобы они динамически изменялись в зависимости от активности туннеля через OSPF и BFD.
|
||||
|
||||
## Решение: Динамические маршруты через OSPF redistribute
|
||||
|
||||
### Архитектура решения
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "HOME"
|
||||
HOME[HOME<br/>home.rt.shx.su]
|
||||
RT[Routing Table<br/>YouTube]
|
||||
RR[Routing Rules]
|
||||
end
|
||||
|
||||
subgraph "Москва"
|
||||
IHOR[MSK-IHOR<br/>msk.ihor.rt.shx.su]
|
||||
OSPF[OSPF Instance<br/>redistribute=static]
|
||||
end
|
||||
|
||||
subgraph "Швеция"
|
||||
SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
|
||||
BFD[BFD Session]
|
||||
end
|
||||
|
||||
%% Связи
|
||||
HOME -- "GRE туннели" --> IHOR
|
||||
HOME -- "GRE туннели" --> SWE
|
||||
IHOR -- "GRE туннель" --> SWE
|
||||
|
||||
%% OSPF и BFD
|
||||
IHOR -. "OSPF redistribute" .- HOME
|
||||
IHOR -. "BFD monitoring" .- SWE
|
||||
|
||||
%% Routing
|
||||
RT -. "OSPF route" .- HOME
|
||||
RR -. "Policy routing" .- RT
|
||||
|
||||
style HOME fill:#e1f5fe
|
||||
style IHOR fill:#ff9800
|
||||
style SWE fill:#4caf50
|
||||
style OSPF fill:#ff5722
|
||||
style BFD fill:#9c27b0
|
||||
```
|
||||
|
||||
## Пошаговая настройка
|
||||
|
||||
### Шаг 1: Настройка BFD для мониторинга туннеля IHOR→SWE
|
||||
|
||||
#### На MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# Настроить BFD для GRE туннеля к SWE
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Включить BFD для OSPF
|
||||
/routing ospf interface-template
|
||||
set [ find where interfaces=gre-SWE-HIPHOST ] bfd=yes
|
||||
```
|
||||
|
||||
#### На SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
```shell
|
||||
# Настроить BFD для GRE туннеля от IHOR
|
||||
/routing bfd
|
||||
add interface=gre-IHOR-SWE interval=100ms multiplier=3
|
||||
|
||||
# Включить BFD для OSPF
|
||||
/routing ospf interface-template
|
||||
set [ find where interfaces=gre-IHOR-SWE ] bfd=yes
|
||||
```
|
||||
|
||||
### Шаг 2: Настройка условных статических маршрутов на IHOR
|
||||
|
||||
#### На MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# Создать статические маршруты с проверкой доступности туннеля
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
|
||||
# Альтернативно - использовать check-gateway=bfd
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
```
|
||||
|
||||
### Шаг 3: Настройка OSPF redistribute на IHOR
|
||||
|
||||
#### На MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# Включить redistribute статических маршрутов в OSPF
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
|
||||
# Настроить фильтрацию для redistribute (опционально)
|
||||
/routing ospf redistribute
|
||||
add instance=default type=static route-filter=173.194.0.0/16
|
||||
add instance=default type=static route-filter=74.125.0.0/16
|
||||
add instance=default type=static route-filter=142.250.0.0/16
|
||||
add instance=default type=static route-filter=172.217.0.0/16
|
||||
add instance=default type=static route-filter=216.58.0.0/16
|
||||
add instance=default type=static route-filter=34.0.0.0/8
|
||||
add instance=default type=static route-filter=35.0.0.0/8
|
||||
add instance=default type=static route-filter=142.0.0.0/8
|
||||
```
|
||||
|
||||
### Шаг 4: Настройка routing rules на HOME
|
||||
|
||||
#### На HOME (home.rt.shx.su):
|
||||
```shell
|
||||
# Создать routing table YouTube
|
||||
/routing table
|
||||
add name=YouTube fib
|
||||
|
||||
# Создать address-list для YouTube
|
||||
/ip firewall address-list
|
||||
add list=YouTube list=173.194.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=74.125.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=142.250.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=172.217.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=216.58.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=34.0.0.0/8 comment="YouTube"
|
||||
add list=YouTube list=35.0.0.0/8 comment="YouTube"
|
||||
add list=YouTube list=142.0.0.0/8 comment="YouTube"
|
||||
|
||||
# Routing rules для YouTube трафика
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=74.125.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=142.250.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=172.217.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=216.58.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=34.0.0.0/8 action=lookup table=YouTube
|
||||
add dst-address=35.0.0.0/8 action=lookup table=YouTube
|
||||
add dst-address=142.0.0.0/8 action=lookup table=YouTube
|
||||
|
||||
# Маршрут в таблице YouTube через IHOR (будет получаться через OSPF)
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=10.100.4.2 routing-table=YouTube distance=1
|
||||
```
|
||||
|
||||
## Альтернативное решение: Скрипт для динамического управления маршрутами
|
||||
|
||||
### Создание скрипта на IHOR
|
||||
|
||||
#### На MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# Создать скрипт для мониторинга BFD и управления маршрутами
|
||||
/system script
|
||||
add name=check-swe-tunnel source={
|
||||
:local bfdStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local routeExists [/ip route print count-only where dst-address=173.194.0.0/16]
|
||||
|
||||
:if ([:len $bfdStatus] > 0) do={
|
||||
:if ($routeExists = 0) do={
|
||||
:log info "SWE tunnel is UP - adding YouTube routes"
|
||||
/ip route add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1
|
||||
}
|
||||
} else={
|
||||
:if ($routeExists > 0) do={
|
||||
:log info "SWE tunnel is DOWN - removing YouTube routes"
|
||||
/ip route remove [find where dst-address=173.194.0.0/16]
|
||||
/ip route remove [find where dst-address=74.125.0.0/16]
|
||||
/ip route remove [find where dst-address=142.250.0.0/16]
|
||||
/ip route remove [find where dst-address=172.217.0.0/16]
|
||||
/ip route remove [find where dst-address=216.58.0.0/16]
|
||||
/ip route remove [find where dst-address=34.0.0.0/8]
|
||||
/ip route remove [find where dst-address=35.0.0.0/8]
|
||||
/ip route remove [find where dst-address=142.0.0.0/8]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Создать scheduler для запуска скрипта каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=check-swe-tunnel interval=10s on-event=check-swe-tunnel
|
||||
```
|
||||
|
||||
## Решение через OSPF cost manipulation
|
||||
|
||||
### Настройка динамического cost на основе BFD
|
||||
|
||||
#### На MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# Создать скрипт для изменения OSPF cost на основе BFD статуса
|
||||
/system script
|
||||
add name=adjust-ospf-cost source={
|
||||
:local bfdStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local ospfInterface [/routing ospf interface-template find where interfaces=gre-SWE-HIPHOST]
|
||||
|
||||
:if ([:len $bfdStatus] > 0) do={
|
||||
# Туннель активен - низкий cost
|
||||
/routing ospf interface-template set $ospfInterface cost=10
|
||||
:log info "SWE tunnel UP - OSPF cost set to 10"
|
||||
} else={
|
||||
# Туннель неактивен - высокий cost
|
||||
/routing ospf interface-template set $ospfInterface cost=1000
|
||||
:log info "SWE tunnel DOWN - OSPF cost set to 1000"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать скрипт каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=adjust-ospf-cost interval=5s on-event=adjust-ospf-cost
|
||||
```
|
||||
|
||||
## Проверка настройки
|
||||
|
||||
### На MSK-IHOR:
|
||||
```shell
|
||||
# Проверить BFD статус
|
||||
/routing bfd print
|
||||
|
||||
# Проверить статические маршруты
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# Проверить OSPF redistribute
|
||||
/routing ospf redistribute print
|
||||
|
||||
# Проверить OSPF маршруты
|
||||
/routing ospf route print
|
||||
```
|
||||
|
||||
### На HOME:
|
||||
```shell
|
||||
# Проверить OSPF маршруты
|
||||
/routing ospf route print
|
||||
|
||||
# Проверить routing table YouTube
|
||||
/ip route print where routing-table=YouTube
|
||||
|
||||
# Проверить routing rules
|
||||
/routing rule print where table=YouTube
|
||||
```
|
||||
|
||||
## Тестирование
|
||||
|
||||
### Тест 1: Проверка автоматического добавления маршрутов
|
||||
```shell
|
||||
# На IHOR проверить что маршруты добавлены
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# На HOME проверить что маршруты получены через OSPF
|
||||
/routing ospf route print
|
||||
```
|
||||
|
||||
### Тест 2: Проверка failover при отключении туннеля
|
||||
```shell
|
||||
# Отключить GRE туннель на IHOR
|
||||
/interface gre disable [find where name=gre-SWE-HIPHOST]
|
||||
|
||||
# Подождать 10-30 секунд и проверить что маршруты исчезли
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# Включить туннель обратно
|
||||
/interface gre enable [find where name=gre-SWE-HIPHOST]
|
||||
|
||||
# Проверить что маршруты появились снова
|
||||
/ip route print where dst-address~"173.194"
|
||||
```
|
||||
|
||||
### Тест 3: Проверка BFD мониторинга
|
||||
```shell
|
||||
# Проверить BFD сессии
|
||||
/routing bfd print detail
|
||||
|
||||
# Проверить BFD логи
|
||||
/log print where topics~"bfd"
|
||||
```
|
||||
|
||||
## Мониторинг и логирование
|
||||
|
||||
### Настройка логирования на IHOR:
|
||||
```shell
|
||||
# Включить логирование для BFD
|
||||
/system logging
|
||||
add topics=bfd
|
||||
|
||||
# Включить логирование для OSPF
|
||||
/system logging
|
||||
add topics=ospf
|
||||
|
||||
# Включить логирование для routing
|
||||
/system logging
|
||||
add topics=route
|
||||
```
|
||||
|
||||
### Создание дашборда для мониторинга:
|
||||
```shell
|
||||
# Скрипт для отображения статуса
|
||||
/system script
|
||||
add name=show-tunnel-status source={
|
||||
:log info "=== Tunnel Status Report ==="
|
||||
:log info "BFD Status:"
|
||||
/routing bfd print
|
||||
:log info "YouTube Routes:"
|
||||
/ip route print where dst-address~"173.194"
|
||||
:log info "OSPF Routes:"
|
||||
/routing ospf route print
|
||||
:log info "=== End Report ==="
|
||||
}
|
||||
|
||||
# Запускать каждую минуту
|
||||
/system scheduler
|
||||
add name=status-report interval=1m on-event=show-tunnel-status
|
||||
```
|
||||
|
||||
## Полная конфигурация для копирования
|
||||
|
||||
### MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# BFD для GRE туннеля
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# OSPF с BFD
|
||||
/routing ospf interface-template
|
||||
set [ find where interfaces=gre-SWE-HIPHOST ] bfd=yes
|
||||
|
||||
# Статические маршруты с проверкой
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
|
||||
# OSPF redistribute
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
```
|
||||
|
||||
### SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
```shell
|
||||
# BFD для GRE туннеля
|
||||
/routing bfd
|
||||
add interface=gre-IHOR-SWE interval=100ms multiplier=3
|
||||
|
||||
# OSPF с BFD
|
||||
/routing ospf interface-template
|
||||
set [ find where interfaces=gre-IHOR-SWE ] bfd=yes
|
||||
```
|
||||
|
||||
### HOME (home.rt.shx.su):
|
||||
```shell
|
||||
# Routing table YouTube
|
||||
/routing table
|
||||
add name=YouTube fib
|
||||
|
||||
# Address-list YouTube
|
||||
/ip firewall address-list
|
||||
add list=YouTube list=173.194.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=74.125.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=142.250.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=172.217.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=216.58.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=34.0.0.0/8 comment="YouTube"
|
||||
add list=YouTube list=35.0.0.0/8 comment="YouTube"
|
||||
add list=YouTube list=142.0.0.0/8 comment="YouTube"
|
||||
|
||||
# Routing rules
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=74.125.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=142.250.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=172.217.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=216.58.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=34.0.0.0/8 action=lookup table=YouTube
|
||||
add dst-address=35.0.0.0/8 action=lookup table=YouTube
|
||||
add dst-address=142.0.0.0/8 action=lookup table=YouTube
|
||||
|
||||
# Маршрут в таблице YouTube
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=10.100.4.2 routing-table=YouTube distance=1
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
Данное решение обеспечивает:
|
||||
|
||||
1. **Автоматическое управление маршрутами** через OSPF redistribute
|
||||
2. **Быстрое обнаружение проблем** через BFD (100ms интервал)
|
||||
3. **Динамическое добавление/удаление маршрутов** в зависимости от состояния туннеля
|
||||
4. **Сохранение routing rules** на HOME для Policy Based Routing
|
||||
5. **Автоматический failover** при проблемах с туннелем
|
||||
|
||||
Теперь ваши статические маршруты с gateway `swe-hiphost` будут автоматически появляться и исчезать в зависимости от активности туннеля, контролируемой OSPF и BFD.
|
||||
@@ -0,0 +1,313 @@
|
||||
## Site-to-Site GRE между двумя MikroTik RouterOS 7.14+ (Shats ↔ Malinin)
|
||||
|
||||
Этот гайд пошагово настраивает маршрут между двумя площадками по GRE-туннелю так, чтобы клиенты за роутером Shats из сети `192.168.0.0/16` видели клиентов сети `192.168.1.0/24` за роутером Malinin.
|
||||
|
||||
- Платформа: MikroTik RouterOS 7.14+
|
||||
- Туннель: GRE (с опцией — GRE поверх IPsec для шифрования)
|
||||
- Очень подробно: с командами CLI, проверками и устранением неполадок
|
||||
|
||||
### Схема и адреса
|
||||
- Router Shats:
|
||||
- WAN (публичный): `178.49.24.65`
|
||||
- LAN: `192.168.0.0/16`
|
||||
- GRE IP на туннеле: `10.199.99.1/30`
|
||||
- Router Malinin:
|
||||
- WAN (публичный): `80.64.170.90`
|
||||
- LAN: `192.168.1.0/24`
|
||||
- GRE IP на туннеле: `10.199.99.2/30`
|
||||
|
||||
GRE-интерфейс поднимается между публичными адресами. На GRE назначаем /30 адреса из подсети `10.199.99.0/30`.
|
||||
|
||||
---
|
||||
|
||||
### Предпосылки и рекомендации
|
||||
1) Доступ в терминал RouterOS (WinBox/WebFig/SSH).
|
||||
2) На обоих маршрутизаторах уже есть рабочий доступ в интернет на WAN-интерфейсах.
|
||||
3) Если включён FastTrack — его нужно отключить или исключить межсайтовый трафик из fasttrack.
|
||||
4) Маскарадинг (srcnat/masquerade) — добавим правила обхода NAT для межсайтового трафика, чтобы не NAT’ить его.
|
||||
5) MTU/MSS — включим `clamp-tcp-mss` на GRE, чтобы избежать фрагментации.
|
||||
|
||||
Примечание: Если у вас на WAN есть строгий firewall, заранее разрешите протокол GRE (IP protocol 47) в `input` на адреса пиров.
|
||||
|
||||
---
|
||||
|
||||
### 0) Резервная копия (рекомендуется)
|
||||
```rsc
|
||||
/system backup save name=pre-gre-setup
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 1) Создание GRE-интерфейсов
|
||||
|
||||
Настраиваем GRE на каждом роутере. Важно указать правильные `local-address` (своё публичное) и `remote-address` (публичный адрес удалённого роутера).
|
||||
|
||||
#### На Shats
|
||||
```rsc
|
||||
/interface gre
|
||||
add name=gre-to-malinin local-address=178.49.24.65 remote-address=80.64.170.90 clamp-tcp-mss=yes keepalive=10s,10
|
||||
|
||||
/ip address
|
||||
add address=10.199.99.1/30 interface=gre-to-malinin comment="GRE to Malinin"
|
||||
```
|
||||
|
||||
#### На Malinin
|
||||
```rsc
|
||||
/interface gre
|
||||
add name=gre-to-shats local-address=80.64.170.90 remote-address=178.49.24.65 clamp-tcp-mss=yes keepalive=10s,10
|
||||
|
||||
/ip address
|
||||
add address=10.199.99.2/30 interface=gre-to-shats comment="GRE to Shats"
|
||||
```
|
||||
|
||||
Пояснения:
|
||||
- `clamp-tcp-mss=yes` — автоматически поджимает MSS внутри GRE, снижая риск фрагментации.
|
||||
- `keepalive=10s,10` — отправка keepalive каждые 10 секунд, 10 неудачных попыток → интерфейс считается down.
|
||||
|
||||
---
|
||||
|
||||
### 2) Маршрутизация между LAN-сетями
|
||||
|
||||
Добавляем на обоих роутерах статические маршруты в удалённые LAN через IP удалённого конца GRE.
|
||||
|
||||
#### На Shats (в сторону сети Malinin 192.168.1.0/24)
|
||||
```rsc
|
||||
/ip route
|
||||
add dst-address=192.168.1.0/24 gateway=10.199.99.2 comment="to Malinin via GRE"
|
||||
```
|
||||
|
||||
#### На Malinin (в сторону сети Shats 192.168.0.0/16)
|
||||
```rsc
|
||||
/ip route
|
||||
add dst-address=192.168.0.0/16 gateway=10.199.99.1 comment="to Shats via GRE"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3) Обход NAT (srcnat bypass)
|
||||
|
||||
Если у вас есть общие правила `masquerade` на WAN, необходимо добавить правила «accept» перед masquerade, чтобы НЕ NAT’ить межсайтовый трафик. Это критично для корректной маршрутизации между приватными сетями.
|
||||
|
||||
#### На Shats
|
||||
```rsc
|
||||
/ip firewall nat
|
||||
add chain=srcnat src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="bypass NAT to Malinin LAN"
|
||||
```
|
||||
|
||||
#### На Malinin
|
||||
```rsc
|
||||
/ip firewall nat
|
||||
add chain=srcnat src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="bypass NAT to Shats LAN"
|
||||
```
|
||||
|
||||
Убедитесь, что эти правила стоят ВЫШЕ ваших общих правил `masquerade`.
|
||||
|
||||
---
|
||||
|
||||
### 4) FastTrack: отключить или исключить межсайтовый трафик
|
||||
|
||||
Если включён FastTrack, он может «обходить» firewall/NAT-цепочки и ломать туннельный трафик. Проще всего — отключить FastTrack, или скорректировать условие fasttrack-правила так, чтобы исключить межсайтовые сети.
|
||||
|
||||
Вариант A — полностью отключить FastTrack (на обоих):
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
set [find where chain=forward and action=fasttrack-connection] disabled=yes
|
||||
```
|
||||
|
||||
Вариант B — исключить межсайтовый трафик из FastTrack (пример для типового fasttrack-правила):
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
# Пример: добавляем отрицательные условия к существующему fasttrack-правилу
|
||||
set [find where chain=forward and action=fasttrack-connection and connection-state~"established,related"] \
|
||||
src-address=!192.168.0.0/16 dst-address=!192.168.1.0/24
|
||||
```
|
||||
|
||||
Примечание: точный синтаксис «set ... src-address/dst-address» для вашего текущего fasttrack-правила может отличаться. Универсально — поставить ПЕРЕД fasttrack явное `accept` для межсайтовых сетей в обе стороны (такие пакеты не попадут под fasttrack):
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
add chain=forward src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="allow site-to-site"
|
||||
add chain=forward src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="allow site-to-site"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5) Разрешения в firewall (input) для GRE
|
||||
|
||||
Если у вас жёсткие политики на `input`, нужно явно разрешить GRE-пакеты c удалённого публичного IP в адрес вашего WAN.
|
||||
|
||||
#### На Shats
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
add chain=input protocol=gre src-address=80.64.170.90 dst-address=178.49.24.65 action=accept comment="allow GRE from Malinin"
|
||||
```
|
||||
|
||||
#### На Malinin
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
add chain=input protocol=gre src-address=178.49.24.65 dst-address=80.64.170.90 action=accept comment="allow GRE from Shats"
|
||||
```
|
||||
|
||||
Разрешите также `icmp` (для диагностики) и доступ управления (ssh/winbox) по необходимости. Если политика по умолчанию — `drop`, удостоверьтесь, что выше есть правила `accept` для established/related.
|
||||
|
||||
---
|
||||
|
||||
### 6) Проверка работоспособности
|
||||
|
||||
1) Статус GRE-интерфейса:
|
||||
```rsc
|
||||
/interface gre print detail
|
||||
```
|
||||
|
||||
2) Ping точек GRE:
|
||||
```rsc
|
||||
/ping 10.199.99.2 interface=gre-to-malinin ;# выполнять на Shats
|
||||
/ping 10.199.99.1 interface=gre-to-shats ;# выполнять на Malinin
|
||||
```
|
||||
|
||||
3) Ping межсайтовых адресов (с указанием источника из LAN):
|
||||
```rsc
|
||||
# На Shats — пингуем хост в 192.168.1.0/24, например 192.168.1.10
|
||||
/ping 192.168.1.10 src-address=192.168.0.1
|
||||
|
||||
# На Malinin — пингуем хост в 192.168.0.0/16, например 192.168.0.10
|
||||
/ping 192.168.0.10 src-address=192.168.1.1
|
||||
```
|
||||
|
||||
4) Таблица маршрутов и ARP (диагностика):
|
||||
```rsc
|
||||
/ip route print where dst-address~"192.168.0.0/16|192.168.1.0/24"
|
||||
/ip neighbor print
|
||||
```
|
||||
|
||||
5) Connection tracking (убедиться, что нет NAT на межсайтовых потоках):
|
||||
```rsc
|
||||
/ip firewall connection print where dst-address~"192.168.1." or src-address~"192.168.1."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7) Частые проблемы и решения
|
||||
- Туннель up, но пинги межсайт не идут: проверьте, что на обеих сторонах есть статические маршруты через адрес ДРУГОГО конца GRE (10.199.99.2 на Shats и 10.199.99.1 на Malinin).
|
||||
- Пакеты идут в одну сторону: убедитесь в обходе NAT (правила `srcnat action=accept` стоят выше masquerade) и в исключении FastTrack.
|
||||
- Туннель не поднимается: разрешите `protocol=gre` на `input` между публичными IP, проверьте, что `local-address`/`remote-address` указаны верно.
|
||||
- Большие пакеты/веб «подвисают»: включён `clamp-tcp-mss=yes` на GRE. При необходимости можно уменьшить MTU GRE-интерфейса (например, до 1430) и повторно проверить.
|
||||
|
||||
---
|
||||
|
||||
### 8) Полные блоки конфигурации для быстрого применения
|
||||
|
||||
Скопируйте на соответствующий роутер целиком. Корректируйте адреса управления (src-address в ping) под ваши реальные адреса шлюзов/LAN.
|
||||
|
||||
#### Применить на Shats
|
||||
```rsc
|
||||
/interface gre
|
||||
add name=gre-to-malinin local-address=178.49.24.65 remote-address=80.64.170.90 clamp-tcp-mss=yes keepalive=10s,10
|
||||
|
||||
/ip address
|
||||
add address=10.199.99.1/30 interface=gre-to-malinin comment="GRE to Malinin"
|
||||
|
||||
/ip route
|
||||
add dst-address=192.168.1.0/24 gateway=10.199.99.2 comment="to Malinin via GRE"
|
||||
|
||||
/ip firewall nat
|
||||
add chain=srcnat src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="bypass NAT to Malinin LAN"
|
||||
|
||||
/ip firewall filter
|
||||
add chain=input protocol=gre src-address=80.64.170.90 dst-address=178.49.24.65 action=accept comment="allow GRE from Malinin"
|
||||
# (Опция) Явно разрешить межсайтовый трафик и обойти fasttrack
|
||||
add chain=forward src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="allow site-to-site"
|
||||
add chain=forward src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="allow site-to-site"
|
||||
# (Опция) отключить fasttrack целиком
|
||||
# set [find where chain=forward and action=fasttrack-connection] disabled=yes
|
||||
```
|
||||
|
||||
#### Применить на Malinin
|
||||
```rsc
|
||||
/interface gre
|
||||
add name=gre-to-shats local-address=80.64.170.90 remote-address=178.49.24.65 clamp-tcp-mss=yes keepalive=10s,10
|
||||
|
||||
/ip address
|
||||
add address=10.199.99.2/30 interface=gre-to-shats comment="GRE to Shats"
|
||||
|
||||
/ip route
|
||||
add dst-address=192.168.0.0/16 gateway=10.199.99.1 comment="to Shats via GRE"
|
||||
|
||||
/ip firewall nat
|
||||
add chain=srcnat src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="bypass NAT to Shats LAN"
|
||||
|
||||
/ip firewall filter
|
||||
add chain=input protocol=gre src-address=178.49.24.65 dst-address=80.64.170.90 action=accept comment="allow GRE from Shats"
|
||||
# (Опция) Явно разрешить межсайтовый трафик и обойти fasttrack
|
||||
add chain=forward src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="allow site-to-site"
|
||||
add chain=forward src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="allow site-to-site"
|
||||
# (Опция) отключить fasttrack целиком
|
||||
# set [find where chain=forward and action=fasttrack-connection] disabled=yes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9) (Опционально) Шифрование: GRE поверх IPsec
|
||||
|
||||
Если требуется шифровать GRE-трафик через интернет, включите IPsec в транспортном режиме для протокола GRE между публичными IP. Пример — IKEv2 с PSK и современными шифрами. Команды приводятся симметрично на обеих сторонах (подставьте соответствующие локальные/удалённые адреса и одинаковый секрет).
|
||||
|
||||
#### На Shats
|
||||
```rsc
|
||||
/ip ipsec profile
|
||||
add name=prof-gre ike-dh-group=modp2048 ike-encryption=aes-256 ike-integrity=sha256
|
||||
|
||||
/ip ipsec proposal
|
||||
add name=prop-gre auth-algorithms=sha256 enc-algorithms=aes-256-gcm pfs-group=none
|
||||
|
||||
/ip ipsec peer
|
||||
add name=peer-malinin address=80.64.170.90/32 exchange-mode=ike2 profile=prof-gre send-initial-contact=yes
|
||||
|
||||
/ip ipsec identity
|
||||
add peer=peer-malinin auth-method=pre-shared-key secret="SET_STRONG_SHARED_KEY"
|
||||
|
||||
/ip ipsec policy
|
||||
add src-address=178.49.24.65/32 dst-address=80.64.170.90/32 protocol=gre action=encrypt level=require \
|
||||
proposal=prop-gre tunnel=no sa-src-address=178.49.24.65 sa-dst-address=80.64.170.90
|
||||
```
|
||||
|
||||
#### На Malinin
|
||||
```rsc
|
||||
/ip ipsec profile
|
||||
add name=prof-gre ike-dh-group=modp2048 ike-encryption=aes-256 ike-integrity=sha256
|
||||
|
||||
/ip ipsec proposal
|
||||
add name=prop-gre auth-algorithms=sha256 enc-algorithms=aes-256-gcm pfs-group=none
|
||||
|
||||
/ip ipsec peer
|
||||
add name=peer-shats address=178.49.24.65/32 exchange-mode=ike2 profile=prof-gre send-initial-contact=yes
|
||||
|
||||
/ip ipsec identity
|
||||
add peer=peer-shats auth-method=pre-shared-key secret="SET_STRONG_SHARED_KEY"
|
||||
|
||||
/ip ipsec policy
|
||||
add src-address=80.64.170.90/32 dst-address=178.49.24.65/32 protocol=gre action=encrypt level=require \
|
||||
proposal=prop-gre tunnel=no sa-src-address=80.64.170.90 sa-dst-address=178.49.24.65
|
||||
```
|
||||
|
||||
Дополнительно:
|
||||
- Если политика `input` строгая, разрешите UDP/500 и UDP/4500 (IKE/NAT-T) и `ipsec-esp` между публичными IP.
|
||||
- На публичных адресах без NAT можно оставить `nat-traversal=no` (по умолчанию RouterOS 7 сам определяет необходимость). Для надёжности: `peer set peer-... passive=no`.
|
||||
|
||||
Проверка:
|
||||
```rsc
|
||||
/ip ipsec active-peers print detail
|
||||
/ip ipsec installed-sa print detail
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 10) Финальная проверка связности пользователей
|
||||
1) С ПК за Shats (например, `192.168.0.100`) — ping `192.168.1.10` (ПК за Malinin). Должны быть ответы.
|
||||
2) С ПК за Malinin (например, `192.168.1.50`) — ping `192.168.0.10` (ПК за Shats).
|
||||
3) Traceroute между сетями должен показывать переход через GRE (обычно один «хоп» до адреса удалённой LAN через 10.199.99.1↔10.199.99.2).
|
||||
4) При большой нагрузке на межсайтовый трафик убедитесь, что нет внезапных обрывов (если есть — проверьте MTU/MSS и FastTrack/NAT правила).
|
||||
|
||||
---
|
||||
|
||||
Готово. После выполнения шагов клиенты `192.168.0.0/16` за Shats будут видеть клиентов `192.168.1.0/24` за Malinin через GRE-туннель. Для безопасности можно включить опциональный раздел IPsec.
|
||||
|
||||
|
||||
@@ -0,0 +1,289 @@
|
||||
# Настройка MultiWAN на MikroTik RouterOS v7
|
||||
|
||||
## Описание конфигурации
|
||||
|
||||
Данная инструкция описывает настройку MultiWAN с тремя провайдерами для обеспечения отказоустойчивости и распределения VPN соединений по разным внешним IP адресам.
|
||||
|
||||
### Провайдеры:
|
||||
1. **Ростелеком (RTK-Internet)** - ether8, PPPoE, внешний IP: 87.103.241.8
|
||||
2. **Электронный город** - ether1, DHCP, внешний IP: 178.49.24.65
|
||||
3. **МТС** - ether7, DHCP, внешний IP: 109.174.26.78
|
||||
|
||||
## Схема подключения
|
||||
|
||||
```
|
||||
[Ростелеком] ---- ether8 ---- [MikroTik Router]
|
||||
[Эл.Город] ---- ether1 ---- [MikroTik Router] ---- LAN
|
||||
[МТС] ---- ether7 ---- [MikroTik Router]
|
||||
```
|
||||
|
||||
## Базовые настройки
|
||||
|
||||
### 1. Настройка интерфейсов
|
||||
|
||||
```bash
|
||||
# Настройка интерфейсов
|
||||
/interface ethernet
|
||||
set [ find default-name=ether1 ] comment="Электронный город"
|
||||
set [ find default-name=ether7 ] comment="МТС"
|
||||
set [ find default-name=ether8 ] comment="Ростелеком"
|
||||
|
||||
# Создание списка WAN интерфейсов
|
||||
/interface list
|
||||
add name=WAN
|
||||
|
||||
# Добавление интерфейсов в WAN список
|
||||
/interface list member
|
||||
add interface=ether1 list=WAN
|
||||
add interface=ether7 list=WAN
|
||||
add interface=ether8 list=WAN
|
||||
|
||||
# Настройка локальной сети
|
||||
/interface bridge
|
||||
add name=br-lan
|
||||
/interface bridge port
|
||||
add bridge=br-lan interface=ether2
|
||||
add bridge=br-lan interface=ether3
|
||||
add bridge=br-lan interface=ether4
|
||||
add bridge=br-lan interface=ether5
|
||||
add bridge=br-lan interface=ether6
|
||||
```
|
||||
|
||||
### 2. Настройка IP адресов
|
||||
|
||||
```bash
|
||||
# IP адреса для провайдеров
|
||||
/ip address
|
||||
add address=192.168.88.254/24 interface=br-lan comment="LAN"
|
||||
|
||||
# PPPoE для Ростелеком
|
||||
/interface pppoe-client
|
||||
add name=RTK-Internet interface=ether8 user=your_username password=your_password
|
||||
add address=87.103.241.8/32 interface=RTK-Internet comment="Ростелеком"
|
||||
|
||||
# DHCP для Электронного города
|
||||
/ip dhcp-client
|
||||
add interface=ether1 name=dhcp-elcity
|
||||
add address=178.49.24.65/32 interface=ether1 comment="Электронный город"
|
||||
|
||||
# DHCP для МТС
|
||||
/ip dhcp-client
|
||||
add interface=ether7 name=dhcp-mts
|
||||
add address=109.174.26.78/32 interface=ether7 comment="МТС"
|
||||
```
|
||||
|
||||
### 3. Настройка NAT
|
||||
|
||||
```bash
|
||||
# Включение masquerading для всех WAN интерфейсов
|
||||
/ip firewall nat
|
||||
add action=masquerade chain=srcnat out-interface-list=WAN
|
||||
```
|
||||
|
||||
## Создание таблиц маршрутизации
|
||||
|
||||
### 1. Дополнительные routing tables
|
||||
|
||||
```bash
|
||||
# Создание таблиц маршрутизации для каждого провайдера
|
||||
/routing table
|
||||
add disabled=no fib name=rtab-rtk comment="Ростелеком"
|
||||
add disabled=no fib name=rtab-elcity comment="Электронный город"
|
||||
add disabled=no fib name=rtab-mts comment="МТС"
|
||||
```
|
||||
|
||||
### 2. Маршруты по умолчанию
|
||||
|
||||
```bash
|
||||
# Основные маршруты по умолчанию в таблице main
|
||||
/ip route
|
||||
add distance=251 gateway=87.103.241.1 comment="Ростелеком основной"
|
||||
add distance=252 gateway=178.49.24.1 comment="Эл.Город основной"
|
||||
add distance=253 gateway=109.174.26.1 comment="МТС основной"
|
||||
|
||||
# Маршруты в отдельных таблицах
|
||||
/ip route
|
||||
add gateway=87.103.241.1 routing-table=rtab-rtk comment="Ростелеком таблица"
|
||||
add gateway=178.49.24.1 routing-table=rtab-elcity comment="Эл.Город таблица"
|
||||
add gateway=109.174.26.1 routing-table=rtab-mts comment="МТС таблица"
|
||||
|
||||
# Настройка таблицы main для отказоустойчивости
|
||||
/ip route
|
||||
add distance=1 gateway=87.103.241.1 routing-table=main comment="Main Ростелеком"
|
||||
add distance=2 gateway=178.49.24.1 routing-table=main comment="Main Эл.Город"
|
||||
add distance=3 gateway=109.174.26.1 routing-table=main comment="Main МТС"
|
||||
```
|
||||
|
||||
## Настройка маркировки (Mangle)
|
||||
|
||||
### 1. Маркировка соединений по интерфейсам
|
||||
|
||||
```bash
|
||||
# Маркировка соединений по входящим интерфейсам
|
||||
/ip firewall mangle
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=RTK-Internet new-connection-mark=con-rtk passthrough=yes comment="Маркировка Ростелеком"
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=ether1 new-connection-mark=con-elcity passthrough=yes comment="Маркировка Эл.Город"
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=ether7 new-connection-mark=con-mts passthrough=yes comment="Маркировка МТС"
|
||||
```
|
||||
|
||||
### 2. Маркировка маршрутизации
|
||||
|
||||
```bash
|
||||
# Маркировка маршрутизации для исходящего трафика
|
||||
/ip firewall mangle
|
||||
add action=mark-routing chain=prerouting connection-mark=con-rtk in-interface-list=!WAN new-routing-mark=rtab-rtk passthrough=yes comment="Роутинг Ростелеком"
|
||||
add action=mark-routing chain=prerouting connection-mark=con-elcity in-interface-list=!WAN new-routing-mark=rtab-elcity passthrough=yes comment="Роутинг Эл.Город"
|
||||
add action=mark-routing chain=prerouting connection-mark=con-mts in-interface-list=!WAN new-routing-mark=rtab-mts passthrough=yes comment="Роутинг МТС"
|
||||
|
||||
# Маркировка для исходящих соединений
|
||||
/ip firewall mangle
|
||||
add action=mark-routing chain=output connection-mark=con-rtk new-routing-mark=rtab-rtk passthrough=yes comment="Output Ростелеком"
|
||||
add action=mark-routing chain=output connection-mark=con-elcity new-routing-mark=rtab-elcity passthrough=yes comment="Output Эл.Город"
|
||||
add action=mark-routing chain=output connection-mark=con-mts new-routing-mark=rtab-mts passthrough=yes comment="Output МТС"
|
||||
```
|
||||
|
||||
## Настройка отказоустойчивости
|
||||
|
||||
### 1. Рекурсивные маршруты для failover
|
||||
|
||||
```bash
|
||||
# Рекурсивные маршруты для автоматического переключения
|
||||
/ip route
|
||||
add distance=1 gateway=87.103.241.1 routing-table=rtab-elcity comment="Failover Ростелеком->Эл.Город"
|
||||
add distance=1 gateway=87.103.241.1 routing-table=rtab-mts comment="Failover Ростелеком->МТС"
|
||||
add distance=1 gateway=178.49.24.1 routing-table=rtab-rtk comment="Failover Эл.Город->Ростелеком"
|
||||
add distance=1 gateway=178.49.24.1 routing-table=rtab-mts comment="Failover Эл.Город->МТС"
|
||||
add distance=1 gateway=109.174.26.1 routing-table=rtab-rtk comment="Failover МТС->Ростелеком"
|
||||
add distance=1 gateway=109.174.26.1 routing-table=rtab-elcity comment="Failover МТС->Эл.Город"
|
||||
|
||||
# Рекурсивные маршруты для таблицы main
|
||||
/ip route
|
||||
add distance=1 gateway=178.49.24.1 routing-table=main comment="Main failover Эл.Город"
|
||||
add distance=1 gateway=109.174.26.1 routing-table=main comment="Main failover МТС"
|
||||
```
|
||||
|
||||
### 2. Настройка health check
|
||||
|
||||
```bash
|
||||
# Создание health check для провайдеров
|
||||
/tool ping
|
||||
add address=8.8.8.8 interval=10s name=ping-rtk
|
||||
add address=8.8.8.8 interval=10s name=ping-elcity
|
||||
add address=8.8.8.8 interval=10s name=ping-mts
|
||||
|
||||
# Настройка автоматического переключения при недоступности
|
||||
/ip route
|
||||
add distance=1 gateway=87.103.241.1 routing-table=rtab-rtk check-gateway=ping
|
||||
add distance=1 gateway=178.49.24.1 routing-table=rtab-elcity check-gateway=ping
|
||||
add distance=1 gateway=109.174.26.1 routing-table=rtab-mts check-gateway=ping
|
||||
|
||||
# Health check для таблицы main
|
||||
/ip route
|
||||
add distance=1 gateway=87.103.241.1 routing-table=main check-gateway=ping comment="Main health check Ростелеком"
|
||||
add distance=2 gateway=178.49.24.1 routing-table=main check-gateway=ping comment="Main health check Эл.Город"
|
||||
add distance=3 gateway=109.174.26.1 routing-table=main check-gateway=ping comment="Main health check МТС"
|
||||
```
|
||||
|
||||
## Настройка VPN соединений
|
||||
|
||||
### 1. Создание VPN интерфейсов для каждого провайдера
|
||||
|
||||
```bash
|
||||
# VPN интерфейсы для разных провайдеров
|
||||
/interface ovpn-client
|
||||
add name=ovpn-rtk connect-to=your_vpn_server_rtk user=your_vpn_user password=your_vpn_password
|
||||
add name=ovpn-elcity connect-to=your_vpn_server_elcity user=your_vpn_user password=your_vpn_password
|
||||
add name=ovpn-mts connect-to=your_vpn_server_mts user=your_vpn_user password=your_vpn_password
|
||||
```
|
||||
|
||||
### 2. Маркировка VPN трафика
|
||||
|
||||
```bash
|
||||
# Маркировка VPN соединений по провайдерам
|
||||
/ip firewall mangle
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=ovpn-rtk new-connection-mark=con-rtk passthrough=yes comment="VPN Ростелеком"
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=ovpn-elcity new-connection-mark=con-elcity passthrough=yes comment="VPN Эл.Город"
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=ovpn-mts new-connection-mark=con-mts passthrough=yes comment="VPN МТС"
|
||||
```
|
||||
|
||||
## Настройка балансировки нагрузки
|
||||
|
||||
### 1. Политика балансировки
|
||||
|
||||
```bash
|
||||
# Настройка политики для распределения трафика
|
||||
/ip firewall mangle
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface-list=!WAN new-connection-mark=con-rtk passthrough=yes src-address=192.168.88.0/24 dst-address=0.0.0.0/0 comment="Балансировка Ростелеком"
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface-list=!WAN new-connection-mark=con-elcity passthrough=yes src-address=192.168.88.0/24 dst-address=0.0.0.0/0 comment="Балансировка Эл.Город"
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface-list=!WAN new-connection-mark=con-mts passthrough=yes src-address=192.168.88.0/24 dst-address=0.0.0.0/0 comment="Балансировка МТС"
|
||||
```
|
||||
|
||||
## Проверка конфигурации
|
||||
|
||||
### 1. Проверка таблиц маршрутизации
|
||||
|
||||
```bash
|
||||
# Просмотр таблиц маршрутизации
|
||||
/routing table print
|
||||
|
||||
# Просмотр маршрутов в каждой таблице
|
||||
/ip route print where routing-table=rtab-rtk
|
||||
/ip route print where routing-table=rtab-elcity
|
||||
/ip route print where routing-table=rtab-mts
|
||||
|
||||
# Просмотр маршрутов в основной таблице
|
||||
/ip route print where routing-table=main
|
||||
```
|
||||
|
||||
### 2. Проверка маркировки
|
||||
|
||||
```bash
|
||||
# Просмотр правил mangle
|
||||
/ip firewall mangle print
|
||||
|
||||
# Проверка connection marks
|
||||
/ip firewall connection print
|
||||
```
|
||||
|
||||
### 3. Тестирование подключения
|
||||
|
||||
```bash
|
||||
# Тест подключения через разные провайдеры
|
||||
/tool traceroute 8.8.8.8 routing-table=rtab-rtk
|
||||
/tool traceroute 8.8.8.8 routing-table=rtab-elcity
|
||||
/tool traceroute 8.8.8.8 routing-table=rtab-mts
|
||||
```
|
||||
|
||||
## Мониторинг и логирование
|
||||
|
||||
### 1. Настройка логирования
|
||||
|
||||
```bash
|
||||
# Логирование изменений маршрутизации
|
||||
/system logging
|
||||
add action=memory topics=route
|
||||
add action=memory topics=firewall
|
||||
```
|
||||
|
||||
### 2. Мониторинг интерфейсов
|
||||
|
||||
```bash
|
||||
# Мониторинг состояния интерфейсов
|
||||
/interface monitor-traffic interface=RTK-Internet
|
||||
/interface monitor-traffic interface=ether1
|
||||
/interface monitor-traffic interface=ether7
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
Данная конфигурация обеспечивает:
|
||||
- Отказоустойчивость при выходе из строя одного из провайдеров
|
||||
- Распределение VPN соединений по разным внешним IP адресам
|
||||
- Балансировку нагрузки между провайдерами
|
||||
- Автоматическое переключение при недоступности каналов
|
||||
|
||||
Для применения конфигурации выполните команды последовательно, начиная с базовых настроек интерфейсов и заканчивая настройкой VPN соединений.
|
||||
|
||||
## Источники
|
||||
|
||||
- [Multiwan and routing in MikroTik ROS v7](https://mikrotik-training.ru/files/MUoM/2021/kuznetsov.pdf) - Владимир Кузнецов, Yandex
|
||||
@@ -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 в зависимости от доступности!
|
||||
@@ -0,0 +1,562 @@
|
||||
# OSPF Gateway Failover: SWE-HIPHOST → FIN-HIPHOST
|
||||
|
||||
## Проблема
|
||||
|
||||
У вас есть:
|
||||
- BGP приносит список адресов
|
||||
- Трафик фильтруется на шлюз `swe-hiphost`
|
||||
- Нужно автоматически переключаться на `fin-hiphost` при недоступности `swe-hiphost`
|
||||
- **Решение через OSPF**
|
||||
|
||||
## Архитектура решения через OSPF
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "HOME"
|
||||
HOME[HOME<br/>home.rt.shx.su]
|
||||
BGP[BGP Routes]
|
||||
OSPF[OSPF Instance]
|
||||
RT[Routing Table]
|
||||
end
|
||||
|
||||
subgraph "Швеция"
|
||||
SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
|
||||
OSPF_SWE[OSPF<br/>redistribute=static]
|
||||
BFD_SWE[BFD Session]
|
||||
end
|
||||
|
||||
subgraph "Финляндия"
|
||||
FIN[FIN-HIPHOST<br/>fin.hiphost.rt.shx.su]
|
||||
OSPF_FIN[OSPF<br/>redistribute=static]
|
||||
BFD_FIN[BFD Session]
|
||||
end
|
||||
|
||||
%% OSPF связи
|
||||
HOME -. "OSPF area" .- SWE
|
||||
HOME -. "OSPF area" .- FIN
|
||||
|
||||
%% BFD мониторинг
|
||||
SWE -. "BFD monitoring" .- FIN
|
||||
HOME -. "BFD monitoring" .- SWE
|
||||
HOME -. "BFD monitoring" .- FIN
|
||||
|
||||
%% Маршрутизация
|
||||
BGP -. "BGP routes" .- HOME
|
||||
OSPF -. "OSPF routes" .- HOME
|
||||
RT -. "Active routes" .- HOME
|
||||
|
||||
style HOME fill:#e1f5fe
|
||||
style SWE fill:#4caf50
|
||||
style FIN fill:#ff9800
|
||||
style OSPF fill:#ff5722
|
||||
style BFD_SWE fill:#9c27b0
|
||||
style BFD_FIN fill:#9c27b0
|
||||
```
|
||||
|
||||
## Решение 1: OSPF с динамическими cost
|
||||
|
||||
### Настройка на SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# Настроить BFD для мониторинга доступности
|
||||
/routing bfd
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Создать статические маршруты для BGP адресов
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# Включить redistribute в OSPF
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
|
||||
# Настроить OSPF интерфейс с динамическим cost
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=10 area=backbone
|
||||
```
|
||||
|
||||
### Настройка на FIN-HIPHOST (fin.hiphost.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# Настроить BFD для мониторинга доступности
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Создать статические маршруты для BGP адресов
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# Включить redistribute в OSPF
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
|
||||
# Настроить OSPF интерфейс с высоким cost (резервный)
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=100 area=backbone
|
||||
```
|
||||
|
||||
### Настройка на HOME (home.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 интерфейсы
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-SWE-HIPHOST cost=10 area=backbone
|
||||
add interfaces=gre-FIN-HIPHOST cost=100 area=backbone
|
||||
|
||||
# Создать routing table для BGP маршрутов
|
||||
/routing table
|
||||
add name=BGP-Routes fib
|
||||
|
||||
# Address-list для BGP маршрутов
|
||||
/ip firewall address-list
|
||||
add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=172.217.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=216.58.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=34.0.0.0/8 comment="BGP route"
|
||||
add list=BGP-ROUTES list=35.0.0.0/8 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.0.0.0/8 comment="BGP route"
|
||||
|
||||
# Routing rules для BGP маршрутов
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=74.125.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=142.250.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=172.217.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=216.58.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=34.0.0.0/8 action=lookup table=BGP-Routes
|
||||
add dst-address=35.0.0.0/8 action=lookup table=BGP-Routes
|
||||
add dst-address=142.0.0.0/8 action=lookup table=BGP-Routes
|
||||
```
|
||||
|
||||
## Решение 2: OSPF с динамическим cost на основе BFD
|
||||
|
||||
### Скрипт для динамического изменения OSPF cost:
|
||||
|
||||
```shell
|
||||
# Скрипт на SWE-HIPHOST для изменения cost на основе доступности FIN
|
||||
/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)"
|
||||
}
|
||||
}
|
||||
|
||||
# Скрипт на FIN-HIPHOST для изменения cost на основе доступности SWE
|
||||
/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-swe interval=5s on-event=adjust-ospf-cost-swe
|
||||
/system scheduler
|
||||
add name=adjust-ospf-cost-fin interval=5s on-event=adjust-ospf-cost-fin
|
||||
```
|
||||
|
||||
## Решение 3: OSPF с условными маршрутами
|
||||
|
||||
### Скрипт для условного создания маршрутов на основе BFD:
|
||||
|
||||
```shell
|
||||
# Скрипт на SWE-HIPHOST
|
||||
/system script
|
||||
add name=conditional-routes-swe source={
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
:local bgpRoutes [/routing bgp route print where active=yes]
|
||||
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
# FIN доступен - создать маршруты через FIN
|
||||
:foreach route in=$bgpRoutes do={
|
||||
:local dstAddress [:pick $route 0 [:find $route " "]]
|
||||
:local existingRoute [/ip route print count-only where dst-address=$dstAddress and gateway=fin-hiphost]
|
||||
|
||||
:if ($existingRoute = 0) do={
|
||||
/ip route add dst-address=$dstAddress gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
:log info "Added route $dstAddress via FIN-HIPHOST"
|
||||
}
|
||||
}
|
||||
} else={
|
||||
# FIN недоступен - удалить маршруты через FIN
|
||||
/ip route remove [find where gateway=fin-hiphost]
|
||||
:log info "Removed routes via FIN-HIPHOST (unavailable)"
|
||||
}
|
||||
}
|
||||
|
||||
# Скрипт на FIN-HIPHOST
|
||||
/system script
|
||||
add name=conditional-routes-fin source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local bgpRoutes [/routing bgp route print where active=yes]
|
||||
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - создать маршруты через SWE
|
||||
:foreach route in=$bgpRoutes do={
|
||||
:local dstAddress [:pick $route 0 [:find $route " "]]
|
||||
:local existingRoute [/ip route print count-only where dst-address=$dstAddress and gateway=swe-hiphost]
|
||||
|
||||
:if ($existingRoute = 0) do={
|
||||
/ip route add dst-address=$dstAddress gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
:log info "Added route $dstAddress via SWE-HIPHOST"
|
||||
}
|
||||
}
|
||||
} else={
|
||||
# SWE недоступен - удалить маршруты через SWE
|
||||
/ip route remove [find where gateway=swe-hiphost]
|
||||
:log info "Removed routes via SWE-HIPHOST (unavailable)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 30 секунд
|
||||
/system scheduler
|
||||
add name=conditional-routes-swe interval=30s on-event=conditional-routes-swe
|
||||
/system scheduler
|
||||
add name=conditional-routes-fin interval=30s on-event=conditional-routes-fin
|
||||
```
|
||||
|
||||
## Решение 4: OSPF с route redistribution фильтрацией
|
||||
|
||||
### Настройка условного redistribute на основе BFD:
|
||||
|
||||
```shell
|
||||
# Скрипт на SWE-HIPHOST для условного 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
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static
|
||||
:log info "SWE: FIN is UP - redistribute enabled"
|
||||
} else={
|
||||
# FIN недоступен - отключить redistribute
|
||||
/routing ospf instance set [find default=yes] redistribute=connected
|
||||
:log info "SWE: FIN is DOWN - redistribute disabled"
|
||||
}
|
||||
}
|
||||
|
||||
# Скрипт на FIN-HIPHOST для условного 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 (резервный)
|
||||
/routing ospf instance set [find default=yes] redistribute=connected
|
||||
:log info "FIN: SWE is UP - redistribute disabled (backup)"
|
||||
} else={
|
||||
# SWE недоступен - включить redistribute (основной)
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static
|
||||
:log info "FIN: SWE is DOWN - redistribute enabled (primary)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=conditional-redistribute-swe interval=10s on-event=conditional-redistribute-swe
|
||||
/system scheduler
|
||||
add name=conditional-redistribute-fin interval=10s on-event=conditional-redistribute-fin
|
||||
```
|
||||
|
||||
## Решение 5: OSPF с route filtering
|
||||
|
||||
### Настройка route filtering на основе BFD статуса:
|
||||
|
||||
```shell
|
||||
# Создать route filters на SWE-HIPHOST
|
||||
/routing ospf redistribute
|
||||
add instance=default type=static route-filter=173.194.0.0/16
|
||||
add instance=default type=static route-filter=74.125.0.0/16
|
||||
add instance=default type=static route-filter=142.250.0.0/16
|
||||
add instance=default type=static route-filter=172.217.0.0/16
|
||||
add instance=default type=static route-filter=216.58.0.0/16
|
||||
add instance=default type=static route-filter=34.0.0.0/8
|
||||
add instance=default type=static route-filter=35.0.0.0/8
|
||||
add instance=default type=static route-filter=142.0.0.0/8
|
||||
|
||||
# Скрипт для условного включения/отключения route filters
|
||||
/system script
|
||||
add name=toggle-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 доступен - включить фильтры (SWE будет анонсировать)
|
||||
/routing ospf redistribute enable [find where type=static]
|
||||
:log info "SWE: Route filters enabled (FIN is UP)"
|
||||
} else={
|
||||
# FIN недоступен - отключить фильтры (SWE не будет анонсировать)
|
||||
/routing ospf redistribute disable [find where type=static]
|
||||
:log info "SWE: Route filters disabled (FIN is DOWN)"
|
||||
}
|
||||
|
||||
# На FIN-HIPHOST
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - отключить фильтры (FIN не будет анонсировать)
|
||||
/routing ospf redistribute disable [find where type=static]
|
||||
:log info "FIN: Route filters disabled (SWE is UP)"
|
||||
} else={
|
||||
# SWE недоступен - включить фильтры (FIN будет анонсировать)
|
||||
/routing ospf redistribute enable [find where type=static]
|
||||
:log info "FIN: Route filters enabled (SWE is DOWN)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=toggle-route-filters interval=10s on-event=toggle-route-filters
|
||||
```
|
||||
|
||||
## Проверка настройки
|
||||
|
||||
### Проверка OSPF маршрутов:
|
||||
```shell
|
||||
# На HOME проверить OSPF маршруты
|
||||
/routing ospf route print
|
||||
|
||||
# Проверить OSPF соседей
|
||||
/routing ospf neighbor print
|
||||
|
||||
# Проверить routing table BGP-Routes
|
||||
/ip route print where routing-table=BGP-Routes
|
||||
```
|
||||
|
||||
### Проверка BFD статуса:
|
||||
```shell
|
||||
# Проверить BFD сессии
|
||||
/routing bfd print
|
||||
|
||||
# Проверить BFD детали
|
||||
/routing bfd print detail
|
||||
```
|
||||
|
||||
### Проверка маршрутов на шлюзах:
|
||||
```shell
|
||||
# На SWE-HIPHOST
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# На FIN-HIPHOST
|
||||
/ip route print where dst-address~"173.194"
|
||||
```
|
||||
|
||||
## Тестирование failover
|
||||
|
||||
### Тест 1: Отключение SWE-HIPHOST:
|
||||
```shell
|
||||
# Отключить GRE туннель на SWE
|
||||
/interface gre disable [find where name=gre-HOME]
|
||||
|
||||
# Подождать 10-30 секунд и проверить OSPF маршруты на HOME
|
||||
/routing ospf route print
|
||||
|
||||
# Проверить что маршруты идут через FIN
|
||||
/ip route print where routing-table=BGP-Routes
|
||||
```
|
||||
|
||||
### Тест 2: Отключение FIN-HIPHOST:
|
||||
```shell
|
||||
# Отключить GRE туннель на FIN
|
||||
/interface gre disable [find where name=gre-HOME]
|
||||
|
||||
# Подождать и проверить что маршруты переключились на SWE
|
||||
/routing ospf route print
|
||||
```
|
||||
|
||||
## Мониторинг и логирование
|
||||
|
||||
### Настройка логирования:
|
||||
```shell
|
||||
# Включить логирование для OSPF
|
||||
/system logging
|
||||
add topics=ospf
|
||||
|
||||
# Включить логирование для BFD
|
||||
/system logging
|
||||
add topics=bfd
|
||||
|
||||
# Включить логирование для routing
|
||||
/system logging
|
||||
add topics=route
|
||||
```
|
||||
|
||||
### Создание дашборда:
|
||||
```shell
|
||||
# Скрипт для отображения статуса
|
||||
/system script
|
||||
add name=show-ospf-status source={
|
||||
:log info "=== OSPF Gateway Status ==="
|
||||
:log info "BFD Status:"
|
||||
/routing bfd print
|
||||
:log info "OSPF Routes:"
|
||||
/routing ospf route print
|
||||
:log info "OSPF Neighbors:"
|
||||
/routing ospf neighbor print
|
||||
:log info "BGP Routes Table:"
|
||||
/ip route print where routing-table=BGP-Routes
|
||||
:log info "=== End Report ==="
|
||||
}
|
||||
|
||||
# Запускать каждую минуту
|
||||
/system scheduler
|
||||
add name=ospf-status interval=1m on-event=show-ospf-status
|
||||
```
|
||||
|
||||
## Полная конфигурация для копирования
|
||||
|
||||
### SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
```shell
|
||||
# BFD для мониторинга FIN
|
||||
/routing bfd
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Статические маршруты через FIN
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# OSPF redistribute
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
|
||||
# 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
|
||||
|
||||
# Статические маршруты через SWE
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# OSPF redistribute
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
|
||||
# OSPF интерфейс (резервный)
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=100 area=backbone
|
||||
```
|
||||
|
||||
### HOME (home.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 интерфейсы
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-SWE-HIPHOST cost=10 area=backbone
|
||||
add interfaces=gre-FIN-HIPHOST cost=100 area=backbone
|
||||
|
||||
# Routing table для BGP маршрутов
|
||||
/routing table
|
||||
add name=BGP-Routes fib
|
||||
|
||||
# Address-list для BGP маршрутов
|
||||
/ip firewall address-list
|
||||
add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=172.217.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=216.58.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=34.0.0.0/8 comment="BGP route"
|
||||
add list=BGP-ROUTES list=35.0.0.0/8 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.0.0.0/8 comment="BGP route"
|
||||
|
||||
# Routing rules
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=74.125.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=142.250.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=172.217.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=216.58.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=34.0.0.0/8 action=lookup table=BGP-Routes
|
||||
add dst-address=35.0.0.0/8 action=lookup table=BGP-Routes
|
||||
add dst-address=142.0.0.0/8 action=lookup table=BGP-Routes
|
||||
|
||||
# Логирование
|
||||
/system logging
|
||||
add topics=ospf
|
||||
add topics=bfd
|
||||
add topics=route
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
OSPF решение обеспечивает:
|
||||
|
||||
1. **Автоматический failover** через OSPF cost manipulation
|
||||
2. **Быстрое обнаружение проблем** через BFD (100ms интервал)
|
||||
3. **Динамическое управление маршрутами** через redistribute
|
||||
4. **Элегантную интеграцию** с существующей OSPF инфраструктурой
|
||||
5. **Автоматическое восстановление** при восстановлении доступности
|
||||
|
||||
**Преимущества OSPF подхода:**
|
||||
- ✅ Использует существующую OSPF инфраструктуру
|
||||
- ✅ Автоматическое распространение изменений
|
||||
- ✅ Встроенная поддержка failover
|
||||
- ✅ Меньше скриптов и ручного управления
|
||||
- ✅ Более надежное решение
|
||||
|
||||
Теперь при недоступности SWE-HIPHOST OSPF автоматически выберет маршрут через FIN-HIPHOST, а при восстановлении вернется к SWE-HIPHOST.
|
||||
@@ -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 маршруты продолжат работать через резервный шлюз!
|
||||
@@ -0,0 +1,416 @@
|
||||
## QoS на MikroTik RouterOS 7.14+ для Multi-WAN (3 провайдера) + CRS (DHCP)
|
||||
|
||||
Этот гайд описывает настройку QoS на маршрутизаторе MikroTik RouterOS 7.14+ при наличии трёх WAN-провайдеров (Multi-WAN). За роутером установлен CRS на RouterOS 7.14, который выступает DHCP-сервером для LAN. Конфигурация учитывает приоритизацию (VoIP/интерактив/обычный/bulk), справедливость между клиентами, и совместимость с PCC/ECMP балансировкой.
|
||||
|
||||
Важно: команды ниже предназначены для RouterOS CLI.
|
||||
|
||||
### Предпосылки и схема
|
||||
- Маршрутизатор MikroTik, RouterOS 7.14+
|
||||
- Три провайдера: `wan1`, `wan2`, `wan3` (например, `ether1`, `ether2`, `ether3`)
|
||||
- LAN за роутером: `bridge` (к CRS подключён аплинк, CRS — DHCP-сервер)
|
||||
- На CRS: DHCP для VLAN/LAN, желательно «trust DSCP» для сохранения приоритетов, если применимо
|
||||
|
||||
### Параметры для заполнения перед применением
|
||||
- Скорости провайдеров (чистые, после NAT/оверхеда):
|
||||
- `ISP1_UP`/`ISP1_DOWN`
|
||||
- `ISP2_UP`/`ISP2_DOWN`
|
||||
- `ISP3_UP`/`ISP3_DOWN`
|
||||
- Карта интерфейсов:
|
||||
- `wan1_if` = `ether1` (пример)
|
||||
- `wan2_if` = `ether2`
|
||||
- `wan3_if` = `ether3`
|
||||
- `lan_if` = `bridge`
|
||||
- Тип балансировки (PCC/ECMP/Policy routing) и есть ли уже `mangle`/марки маршрутизации
|
||||
- Список приоритетного трафика (VoIP/видеоконфы/игры/работа) и используемые порты/приложения
|
||||
|
||||
### Важные замечания
|
||||
- Для корректной работы QoS отключите FastTrack (или исключите из FastTrack трафик, который должен управляться QoS)
|
||||
- Очереди следует вешать на каждый WAN-интерфейс отдельно для upload и корректно обрабатывать download
|
||||
- В RouterOS 7.14 доступен `fq-codel` и PCQ. Если у вас есть `CAKE`, используйте его — он обеспечивает лучшую управляемость буферов. В примере есть ветка и для CAKE, и для fq_codel/PCQ
|
||||
|
||||
---
|
||||
|
||||
### 1) Отключение FastTrack для трафика под QoS
|
||||
Если FastTrack включён — отключите его целиком, либо исключите трафик, который должен QoS’иться. Проще и надёжнее — временно отключить целиком:
|
||||
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
set [find where chain=forward and action=fasttrack-connection] disabled=yes
|
||||
```
|
||||
|
||||
Альтернатива: добавить правило перед FastTrack, чтобы не fasttrack’ить приоритетные DSCP/маркеры (не рекомендуется как «первая настройка», сложнее отлаживать).
|
||||
|
||||
---
|
||||
|
||||
### 2) Проверка наличия CAKE и создание типов очередей
|
||||
|
||||
Проверка наличия CAKE:
|
||||
```rsc
|
||||
/queue type print where kind=cake
|
||||
```
|
||||
Если вывод пуст — используем `fq-codel`/PCQ (см. следующий подраздел). Если CAKE доступен, создаём типы:
|
||||
|
||||
```rsc
|
||||
# Пример: CAKE с diffserv4, учёт NAT и типичные задержки для WAN
|
||||
/queue type
|
||||
add name=cake-diffserv4 kind=cake cake-diffserv=diffserv4 cake-nat=yes cake-rtt=20ms
|
||||
```
|
||||
|
||||
Если CAKE недоступен — создаём `fq-codel` и PCQ типы:
|
||||
|
||||
```rsc
|
||||
/queue type
|
||||
add name=fqcodel kind=fq-codel target=5ms interval=100ms limit=1000 quantum=1514
|
||||
add name=pcq-upload kind=pcq pcq-classifier=src-address pcq-rate=0
|
||||
add name=pcq-download kind=pcq pcq-classifier=dst-address pcq-rate=0
|
||||
```
|
||||
|
||||
Примечание: `pcq-rate=0` означает «поделиться всей доступной полосой» между активными потоками.
|
||||
|
||||
---
|
||||
|
||||
### 3) Mangle: марки направлений и классов трафика
|
||||
|
||||
Цель: получить марки пакетов per-WAN и per-class. Для упрощения определим 4 класса: `voip`, `interactive`, `default`, `bulk`.
|
||||
|
||||
Марки направлений по интерфейсу (upload/download на каждом WAN):
|
||||
|
||||
```rsc
|
||||
/ip firewall mangle
|
||||
# Upload per-WAN (postrouting / out-interface)
|
||||
add chain=postrouting out-interface=<wan1_if> action=mark-packet new-packet-mark=pm_w1_up passthrough=no
|
||||
add chain=postrouting out-interface=<wan2_if> action=mark-packet new-packet-mark=pm_w2_up passthrough=no
|
||||
add chain=postrouting out-interface=<wan3_if> action=mark-packet new-packet-mark=pm_w3_up passthrough=no
|
||||
|
||||
# Download per-WAN (prerouting / in-interface)
|
||||
add chain=prerouting in-interface=<wan1_if> action=mark-packet new-packet-mark=pm_w1_down passthrough=no
|
||||
add chain=prerouting in-interface=<wan2_if> action=mark-packet new-packet-mark=pm_w2_down passthrough=no
|
||||
add chain=prerouting in-interface=<wan3_if> action=mark-packet new-packet-mark=pm_w3_down passthrough=no
|
||||
```
|
||||
|
||||
Классификация по приоритетам (используем DSCP и/или порты). Примерные правила:
|
||||
|
||||
```rsc
|
||||
# VoIP: DSCP EF/AF41 + SIP/RTP порты (примерные диапазоны, уточните под вашу телефонию)
|
||||
add chain=prerouting dscp=46 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting dscp=34 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting protocol=udp port=5060,5061 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting protocol=udp port=10000-20000 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
|
||||
# Interactive: SSH/RDP/видеоконференции (пример, при необходимости расширить)
|
||||
add chain=prerouting protocol=tcp port=22,3389 action=mark-packet new-packet-mark=pm_class_interactive passthrough=yes
|
||||
add chain=prerouting protocol=udp port=3478-3481 action=mark-packet new-packet-mark=pm_class_interactive passthrough=yes
|
||||
|
||||
# Bulk: торренты/бэкапы (примерные порты/DSCP)
|
||||
add chain=prerouting dscp=8 action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
add chain=prerouting protocol=tcp port=6881-6999 action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
|
||||
# Всё остальное — default (назначим позже через «fall-through» в очередях)
|
||||
```
|
||||
|
||||
Примечание: Мы установили отдельные метки для «направления» и «класса». В Queue Tree будем использовать перехват по комбинации через отдельные дочерние правила.
|
||||
|
||||
---
|
||||
|
||||
### 4) Queue Tree: корневые очереди на каждый WAN + дочерние классы
|
||||
|
||||
Создадим по корневой очереди для upload и download на каждом WAN. Затем — дочерние для классов. Параметры скоростей подставьте из ваших `ISP*_UP/DOWN`.
|
||||
|
||||
Вариант A: если доступен CAKE (рекомендуется):
|
||||
|
||||
```rsc
|
||||
# WAN1 Upload
|
||||
/queue tree
|
||||
add name=qt_w1_up parent=<wan1_if> packet-mark=pm_w1_up queue=cake-diffserv4 max-limit=<ISP1_UP>
|
||||
add name=qt_w1_up_voip parent=qt_w1_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w1_up_interactive parent=qt_w1_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w1_up_bulk parent=qt_w1_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
# WAN1 Download (вешаем на LAN или на WAN в режиме ingress; если ingress недоступен — см. примечание ниже)
|
||||
add name=qt_w1_down parent=<lan_if> packet-mark=pm_w1_down queue=cake-diffserv4 max-limit=<ISP1_DOWN>
|
||||
add name=qt_w1_down_voip parent=qt_w1_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w1_down_interactive parent=qt_w1_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w1_down_bulk parent=qt_w1_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
# Аналогично для WAN2/WAN3 (подставьте свои скорости)
|
||||
add name=qt_w2_up parent=<wan2_if> packet-mark=pm_w2_up queue=cake-diffserv4 max-limit=<ISP2_UP>
|
||||
add name=qt_w2_up_voip parent=qt_w2_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w2_up_interactive parent=qt_w2_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w2_up_bulk parent=qt_w2_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w2_down parent=<lan_if> packet-mark=pm_w2_down queue=cake-diffserv4 max-limit=<ISP2_DOWN>
|
||||
add name=qt_w2_down_voip parent=qt_w2_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w2_down_interactive parent=qt_w2_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w2_down_bulk parent=qt_w2_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w3_up parent=<wan3_if> packet-mark=pm_w3_up queue=cake-diffserv4 max-limit=<ISP3_UP>
|
||||
add name=qt_w3_up_voip parent=qt_w3_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w3_up_interactive parent=qt_w3_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w3_up_bulk parent=qt_w3_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w3_down parent=<lan_if> packet-mark=pm_w3_down queue=cake-diffserv4 max-limit=<ISP3_DOWN>
|
||||
add name=qt_w3_down_voip parent=qt_w3_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w3_down_interactive parent=qt_w3_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w3_down_bulk parent=qt_w3_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
```
|
||||
|
||||
Вариант B: если CAKE нет — используем `fq-codel` (корень) + PCQ (дети) или `fq-codel` везде:
|
||||
|
||||
```rsc
|
||||
# WAN1 Upload (fq-codel как корневой), дочерние классы
|
||||
/queue tree
|
||||
add name=qt_w1_up parent=<wan1_if> packet-mark=pm_w1_up queue=fqcodel max-limit=<ISP1_UP>
|
||||
add name=qt_w1_up_voip parent=qt_w1_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w1_up_interactive parent=qt_w1_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w1_up_bulk parent=qt_w1_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
# WAN1 Download — вешаем на LAN (см. примечание)
|
||||
add name=qt_w1_down parent=<lan_if> packet-mark=pm_w1_down queue=fqcodel max-limit=<ISP1_DOWN>
|
||||
add name=qt_w1_down_voip parent=qt_w1_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w1_down_interactive parent=qt_w1_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w1_down_bulk parent=qt_w1_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
# Аналогично WAN2/WAN3 (подставьте свои скорости)
|
||||
add name=qt_w2_up parent=<wan2_if> packet-mark=pm_w2_up queue=fqcodel max-limit=<ISP2_UP>
|
||||
add name=qt_w2_up_voip parent=qt_w2_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w2_up_interactive parent=qt_w2_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w2_up_bulk parent=qt_w2_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w2_down parent=<lan_if> packet-mark=pm_w2_down queue=fqcodel max-limit=<ISP2_DOWN>
|
||||
add name=qt_w2_down_voip parent=qt_w2_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w2_down_interactive parent=qt_w2_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w2_down_bulk parent=qt_w2_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w3_up parent=<wan3_if> packet-mark=pm_w3_up queue=fqcodel max-limit=<ISP3_UP>
|
||||
add name=qt_w3_up_voip parent=qt_w3_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w3_up_interactive parent=qt_w3_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w3_up_bulk parent=qt_w3_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w3_down parent=<lan_if> packet-mark=pm_w3_down queue=fqcodel max-limit=<ISP3_DOWN>
|
||||
add name=qt_w3_down_voip parent=qt_w3_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w3_down_interactive parent=qt_w3_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w3_down_bulk parent=qt_w3_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
```
|
||||
|
||||
Примечание по download: при отсутствии родителя «ingress на WAN» типичная практика — вешать «download-очереди» на `bridge` (LAN). Это позволяет ограничивать входящий трафик перед выдачей в LAN. Если вы используете VLAN на CRS, укажите `parent` соответствующего интерфейса/bridge, где трафик покидает маршрутизатор в сторону CRS.
|
||||
|
||||
---
|
||||
|
||||
### 5) Справедливость между клиентами (per-host fairness)
|
||||
Если нужна справедливость между клиентами, добавьте дочерние PCQ-очереди под каждую категорию вместо `fqcodel`/`cake` на детях. Пример для WAN1 upload:
|
||||
|
||||
```rsc
|
||||
/queue tree
|
||||
set [find where name=qt_w1_up_default] queue=pcq-upload
|
||||
```
|
||||
|
||||
Или создайте явные дочерние очереди с `queue=pcq-upload/pcq-download` и без `packet-mark`, чтобы PCQ делил полосу между IP-адресами внутри класса.
|
||||
|
||||
---
|
||||
|
||||
### 6) Сохранение DSCP/CoS на CRS
|
||||
На CRS, если используется `bridge` с VLAN, включите доверие DSCP/PCP и при необходимости настройте маппинг DSCP→PCP:
|
||||
|
||||
```rsc
|
||||
/interface bridge settings set use-ip-firewall=yes ;# при необходимости классифицировать на L3
|
||||
/interface bridge vlan set [find] ingress-filtering=yes ;# если используется VLAN filtering
|
||||
# Проверьте и настройте trust-dscp/pcp на нужных интерфейсах (CRS модели отличаются по возможностям)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7) Проверка
|
||||
- Откройте WinBox → Queues → Queue Tree и наблюдайте загрузку классов
|
||||
- Проверьте, что FastTrack не перехватывает ваш трафик
|
||||
- Тестируйте VoIP/видео и фоновые загрузки одновременно; `voip` и `interactive` должны иметь минимальную задержку/джиттер
|
||||
|
||||
---
|
||||
|
||||
### Что нужно уточнить, чтобы я выдал финальную, готовую подставить конфигурацию
|
||||
1) Как называются реальные интерфейсы: `wan1_if`, `wan2_if`, `wan3_if`, `lan_if`?
|
||||
2) Точные скорости (up/down) по каждому провайдеру и есть ли асимметрия?
|
||||
3) Какая балансировка используется сейчас (PCC/ECMP/Policy routing) и включён ли FastTrack?
|
||||
4) Какие именно сервисы/приложения нужно приоритизировать (VoIP-провайдер, видеоконфы: Zoom/Teams/Meet, игры — список)?
|
||||
5) Есть ли VLAN в LAN и на каком интерфейсе/bridge у маршрутизатора трафик уходит на CRS?
|
||||
6) Нужна ли per-user fairness (деление полосы поровну между клиентами внутри класса)?
|
||||
|
||||
После ответа на вопросы я подставлю значения и дам точный блок CLI-команд без плейсхолдеров.
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Готовая конфигурация под ваши параметры (RB5009 + CRS, 3×WAN)
|
||||
|
||||
- Интерфейсы:
|
||||
- `wan1_if = ether7` (1G/1G)
|
||||
- `wan2_if = ether1` (600M/600M)
|
||||
- `wan3_if = RTK-Internet` (PPPoE, 520M/520M, самые низкие пинги)
|
||||
- `lan_if = sfp-sfpplus1` (аплинк к CRS)
|
||||
|
||||
- Рекомендация по лимитам: выставить 90–95% от «чистой» скорости для борьбы с буферблоутом. Ниже приведены «бережные» значения, их можно подкорректировать после тестов:
|
||||
- WAN1: 950M up / 950M down
|
||||
- WAN2: 580M up / 580M down
|
||||
- WAN3: 500M up / 500M down
|
||||
|
||||
### 0) Отключение FastTrack
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
set [find where chain=forward and action=fasttrack-connection] disabled=yes
|
||||
```
|
||||
|
||||
### 1) Типы очередей: сначала пробуем CAKE, иначе fq_codel/PCQ
|
||||
```rsc
|
||||
/queue type
|
||||
add name=cake-diffserv4 kind=cake cake-diffserv=diffserv4 cake-nat=yes cake-rtt=20ms
|
||||
|
||||
# Fallback, если CAKE недоступен
|
||||
add name=fqcodel kind=fq-codel target=5ms interval=100ms limit=1000 quantum=1514
|
||||
add name=pcq-upload kind=pcq pcq-classifier=src-address pcq-rate=0
|
||||
add name=pcq-download kind=pcq pcq-classifier=dst-address pcq-rate=0
|
||||
```
|
||||
|
||||
### 2) Mangle: марки направлений (per-WAN) и классов
|
||||
Только `packet-mark` — не трогаем ваши `connection-mark`/policy routing.
|
||||
|
||||
```rsc
|
||||
/ip firewall mangle
|
||||
# Направления per-WAN
|
||||
add chain=postrouting out-interface=ether7 action=mark-packet new-packet-mark=pm_w1_up passthrough=no
|
||||
add chain=postrouting out-interface=ether1 action=mark-packet new-packet-mark=pm_w2_up passthrough=no
|
||||
add chain=postrouting out-interface=RTK-Internet action=mark-packet new-packet-mark=pm_w3_up passthrough=no
|
||||
|
||||
add chain=prerouting in-interface=ether7 action=mark-packet new-packet-mark=pm_w1_down passthrough=no
|
||||
add chain=prerouting in-interface=ether1 action=mark-packet new-packet-mark=pm_w2_down passthrough=no
|
||||
add chain=prerouting in-interface=RTK-Internet action=mark-packet new-packet-mark=pm_w3_down passthrough=no
|
||||
|
||||
# Классы
|
||||
# VoIP/TrueConf: приоритизируем; матчим DSCP EF/AF41, STUN/TURN и домены TrueConf (если используется облако)
|
||||
add chain=prerouting dscp=46 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting dscp=34 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting protocol=udp port=3478-3481 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting protocol=tcp tls-host=*.trueconf.net action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting protocol=tcp tls-host=*.trueconf.com action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
|
||||
# Interactive (SSH/RDP и пр.) — средний приоритет
|
||||
add chain=prerouting protocol=tcp port=22,3389 action=mark-packet new-packet-mark=pm_class_interactive passthrough=yes
|
||||
|
||||
# Steam загрузки — bulk (контент CDN и портовые диапазоны Steam)
|
||||
add chain=prerouting protocol=tcp tls-host=*.steamcontent.com action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
add chain=prerouting protocol=tcp tls-host=*.steamservercontent.com action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
add chain=prerouting protocol=tcp port=27014-27050 action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
|
||||
# Торренты — bulk (классический диапазон + опционально p2p=bittorrent)
|
||||
add chain=prerouting protocol=tcp port=6881-6999 action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
add chain=prerouting protocol=udp port=6881-6999 action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
# Опционально (может давать ложные срабатывания и нагрузку):
|
||||
# add chain=prerouting p2p=bittorrent action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
|
||||
# YouTube: не понижаем (оставляем default). Можно матчингово наблюдать:
|
||||
add chain=prerouting protocol=tcp tls-host=*.googlevideo.com action=mark-packet new-packet-mark=pm_class_default passthrough=yes
|
||||
```
|
||||
|
||||
Примечания:
|
||||
- `tls-host` не работает для QUIC (UDP/443). Для стабильной классификации YouTube можно временно отключать QUIC в браузере или не менять приоритет YouTube (как в примере).
|
||||
- Если TrueConf — on‑prem с нестандартными портами, подставьте их вместо доменов.
|
||||
|
||||
### 3) Queue Tree: корни per‑WAN и дочерние классы
|
||||
|
||||
Вариант A (CAKE доступен):
|
||||
```rsc
|
||||
/queue tree
|
||||
# WAN1 (ether7)
|
||||
add name=qt_w1_up parent=ether7 packet-mark=pm_w1_up queue=cake-diffserv4 max-limit=950M
|
||||
add name=qt_w1_up_voip parent=qt_w1_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w1_up_interactive parent=qt_w1_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w1_up_bulk parent=qt_w1_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w1_down parent=sfp-sfpplus1 packet-mark=pm_w1_down queue=cake-diffserv4 max-limit=950M
|
||||
add name=qt_w1_down_voip parent=qt_w1_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w1_down_interactive parent=qt_w1_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w1_down_bulk parent=qt_w1_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
# WAN2 (ether1)
|
||||
add name=qt_w2_up parent=ether1 packet-mark=pm_w2_up queue=cake-diffserv4 max-limit=580M
|
||||
add name=qt_w2_up_voip parent=qt_w2_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w2_up_interactive parent=qt_w2_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w2_up_bulk parent=qt_w2_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w2_down parent=sfp-sfpplus1 packet-mark=pm_w2_down queue=cake-diffserv4 max-limit=580M
|
||||
add name=qt_w2_down_voip parent=qt_w2_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w2_down_interactive parent=qt_w2_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w2_down_bulk parent=qt_w2_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
# WAN3 (RTK-Internet PPPoE)
|
||||
add name=qt_w3_up parent=RTK-Internet packet-mark=pm_w3_up queue=cake-diffserv4 max-limit=500M
|
||||
add name=qt_w3_up_voip parent=qt_w3_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w3_up_interactive parent=qt_w3_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w3_up_bulk parent=qt_w3_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w3_down parent=sfp-sfpplus1 packet-mark=pm_w3_down queue=cake-diffserv4 max-limit=500M
|
||||
add name=qt_w3_down_voip parent=qt_w3_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w3_down_interactive parent=qt_w3_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w3_down_bulk parent=qt_w3_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
```
|
||||
|
||||
Вариант B (fallback: fq_codel/PCQ):
|
||||
```rsc
|
||||
/queue tree
|
||||
# WAN1 (ether7)
|
||||
add name=qt_w1_up parent=ether7 packet-mark=pm_w1_up queue=fqcodel max-limit=950M
|
||||
add name=qt_w1_up_voip parent=qt_w1_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w1_up_interactive parent=qt_w1_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w1_up_bulk parent=qt_w1_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w1_down parent=sfp-sfpplus1 packet-mark=pm_w1_down queue=fqcodel max-limit=950M
|
||||
add name=qt_w1_down_voip parent=qt_w1_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w1_down_interactive parent=qt_w1_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w1_down_bulk parent=qt_w1_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
# WAN2 (ether1)
|
||||
add name=qt_w2_up parent=ether1 packet-mark=pm_w2_up queue=fqcodel max-limit=580M
|
||||
add name=qt_w2_up_voip parent=qt_w2_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w2_up_interactive parent=qt_w2_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w2_up_bulk parent=qt_w2_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w2_down parent=sfp-sfpplus1 packet-mark=pm_w2_down queue=fqcodel max-limit=580M
|
||||
add name=qt_w2_down_voip parent=qt_w2_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w2_down_interactive parent=qt_w2_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w2_down_bulk parent=qt_w2_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
# WAN3 (RTK-Internet PPPoE)
|
||||
add name=qt_w3_up parent=RTK-Internet packet-mark=pm_w3_up queue=fqcodel max-limit=500M
|
||||
add name=qt_w3_up_voip parent=qt_w3_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w3_up_interactive parent=qt_w3_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w3_up_bulk parent=qt_w3_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w3_down parent=sfp-sfpplus1 packet-mark=pm_w3_down queue=fqcodel max-limit=500M
|
||||
add name=qt_w3_down_voip parent=qt_w3_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w3_down_interactive parent=qt_w3_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w3_down_bulk parent=qt_w3_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
```
|
||||
|
||||
Опционально: справедливость per‑user. Замените дочерние очереди класса `default`/`bulk` на `pcq-upload`/`pcq-download`, чтобы делить полосу между IP‑адресами устройств.
|
||||
|
||||
### 4) (Опция) Отправлять TrueConf через самый «низкий пинг» WAN3
|
||||
Если хотите принудительно маршрутизировать TrueConf через `RTK-Internet`, добавьте метку маршрутизации для соответствующих соединений и policy routing в вашу таблицу `wan3`. Пример (адаптируйте к вашей схеме):
|
||||
|
||||
```rsc
|
||||
/ip firewall mangle
|
||||
add chain=prerouting protocol=tcp tls-host=*.trueconf.net action=mark-routing new-routing-mark=to_wan3 passthrough=yes
|
||||
add chain=prerouting protocol=tcp tls-host=*.trueconf.com action=mark-routing new-routing-mark=to_wan3 passthrough=yes
|
||||
add chain=prerouting protocol=udp port=3478-3481 action=mark-routing new-routing-mark=to_wan3 passthrough=yes
|
||||
|
||||
/ip route add dst-address=0.0.0.0/0 gateway=RTK-Internet routing-table=to_wan3 distance=1 check-gateway=ping
|
||||
```
|
||||
|
||||
Учтите: это вмешивается в ваш текущий policy routing. Добавляйте только если понимаете последствия в вашей схеме PCC/ECMP.
|
||||
|
||||
---
|
||||
|
||||
### Что такое PCQ и зачем он нужен (коротко)
|
||||
PCQ (Per Connection/Client Queue) — тип очереди, который автоматически делит доступную полосу между множеством «подочередей» (обычно по IP-адресам). В типовой схеме:
|
||||
- `pcq-upload` с `pcq-classifier=src-address` обеспечивает справедливость по исходящим IP клиентов (upload)
|
||||
- `pcq-download` с `pcq-classifier=dst-address` — по входящим IP клиентов (download)
|
||||
|
||||
Это предотвращает ситуацию, когда один пользователь/устройство забирает всю полосу в пределах класса (например, торренты или крупные загрузки Steam), сохраняя комфорт для остальных. В сочетании с приоритетами классов (VoIP/interactive/default/bulk) получается и приоритет, и справедливость.
|
||||
Reference in new issue
Block a user