Refactor multiwan_mikrotik_setup.md to improve clarity and consistency in configuration. Renamed PPPoE client interface to 'RTK-Internet', updated routing table entries for failover and health checks in the main routing table, and adjusted connection marking rules for better readability. Added commands for monitoring routes in the main table.

This commit is contained in:
2025-08-13 22:05:52 +07:00
parent 52ff4437c0
commit 5c2e569e26
8 changed files with 2979 additions and 5 deletions
+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.
+25 -5
View File
@@ -58,8 +58,8 @@ add address=192.168.88.254/24 interface=br-lan comment="LAN"
# PPPoE для Ростелеком
/interface pppoe-client
add name=pppoe-rtk interface=ether8 user=your_username password=your_password
add address=87.103.241.8/32 interface=pppoe-rtk comment="Ростелеком"
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
@@ -95,7 +95,7 @@ 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="Эл.Город основной"
@@ -106,6 +106,12 @@ add distance=253 gateway=109.174.26.1 comment="МТС основной"
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)
@@ -115,7 +121,7 @@ add gateway=109.174.26.1 routing-table=rtab-mts comment="МТС таблица"
```bash
# Маркировка соединений по входящим интерфейсам
/ip firewall mangle
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=pppoe-rtk new-connection-mark=con-rtk passthrough=yes comment="Маркировка Ростелеком"
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="Маркировка МТС"
```
@@ -149,6 +155,11 @@ 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
@@ -165,6 +176,12 @@ add address=8.8.8.8 interval=10s name=ping-mts
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 соединений
@@ -213,6 +230,9 @@ add action=mark-connection chain=prerouting connection-mark=no-mark in-interface
/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. Проверка маркировки
@@ -249,7 +269,7 @@ add action=memory topics=firewall
```bash
# Мониторинг состояния интерфейсов
/interface monitor-traffic interface=pppoe-rtk
/interface monitor-traffic interface=RTK-Internet
/interface monitor-traffic interface=ether1
/interface monitor-traffic interface=ether7
```
+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) получается и приоритет, и справедливость.