Compare commits

...
2 Commits
8 changed files with 3243 additions and 0 deletions

No files matched your search

+412
View File
@@ -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 вернется к нему.
+412
View File
@@ -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.
+313
View File
@@ -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.
+289
View File
@@ -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
+459
View File
@@ -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 в зависимости от доступности!
+562
View File
@@ -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.
+380
View File
@@ -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 маршруты продолжат работать через резервный шлюз!
+416
View File
@@ -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) получается и приоритет, и справедливость.