diff --git a/bgp_gateway_failover.md b/bgp_gateway_failover.md
new file mode 100644
index 0000000..f63f847
--- /dev/null
+++ b/bgp_gateway_failover.md
@@ -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
home.rt.shx.su]
+ BGP[BGP Routes]
+ FILTER[Route Filter
swe-hiphost]
+ FAILOVER[Failover Logic]
+ end
+
+ subgraph "Швеция"
+ SWE[SWE-HIPHOST
swe.hiphost.rt.shx.su]
+ BFD_SWE[BFD Session]
+ end
+
+ subgraph "Финляндия"
+ FIN[FIN-HIPHOST
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 вернется к нему.
\ No newline at end of file
diff --git a/dynamic_routing_with_ospf_bfd.md b/dynamic_routing_with_ospf_bfd.md
new file mode 100644
index 0000000..aa55b54
--- /dev/null
+++ b/dynamic_routing_with_ospf_bfd.md
@@ -0,0 +1,412 @@
+# Динамическое управление маршрутами через OSPF и BFD
+
+## Проблема
+
+У вас есть статические маршруты с gateway `swe-hiphost`, которые настраиваются через routing rules, и нужно, чтобы они динамически изменялись в зависимости от активности туннеля через OSPF и BFD.
+
+## Решение: Динамические маршруты через OSPF redistribute
+
+### Архитектура решения
+
+```mermaid
+graph TB
+ subgraph "HOME"
+ HOME[HOME
home.rt.shx.su]
+ RT[Routing Table
YouTube]
+ RR[Routing Rules]
+ end
+
+ subgraph "Москва"
+ IHOR[MSK-IHOR
msk.ihor.rt.shx.su]
+ OSPF[OSPF Instance
redistribute=static]
+ end
+
+ subgraph "Швеция"
+ SWE[SWE-HIPHOST
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.
\ No newline at end of file
diff --git a/gre_site_to_site_shats_malinin.md b/gre_site_to_site_shats_malinin.md
new file mode 100644
index 0000000..b6cbd0f
--- /dev/null
+++ b/gre_site_to_site_shats_malinin.md
@@ -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.
+
+
diff --git a/multiwan_mikrotik_setup.md b/multiwan_mikrotik_setup.md
index 04f82f2..42b2fb4 100644
--- a/multiwan_mikrotik_setup.md
+++ b/multiwan_mikrotik_setup.md
@@ -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
```
diff --git a/ospf_bgp_automatic_failover.md b/ospf_bgp_automatic_failover.md
new file mode 100644
index 0000000..3420188
--- /dev/null
+++ b/ospf_bgp_automatic_failover.md
@@ -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
home.rt.shx.su]
+ BGP[BGP Routes
12,000 маршрутов]
+ OSPF[OSPF Instance]
+ RT[Routing Table
BGP-Routes]
+ SCRIPT[Auto Script
BGP→OSPF]
+ end
+
+ subgraph "Швеция"
+ SWE[SWE-HIPHOST
swe.hiphost.rt.shx.su]
+ OSPF_SWE[OSPF
redistribute=bgp]
+ BFD_SWE[BFD Session]
+ end
+
+ subgraph "Финляндия"
+ FIN[FIN-HIPHOST
fin.hiphost.rt.shx.su]
+ OSPF_FIN[OSPF
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 в зависимости от доступности!
\ No newline at end of file
diff --git a/ospf_gateway_failover.md b/ospf_gateway_failover.md
new file mode 100644
index 0000000..a5c36af
--- /dev/null
+++ b/ospf_gateway_failover.md
@@ -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
home.rt.shx.su]
+ BGP[BGP Routes]
+ OSPF[OSPF Instance]
+ RT[Routing Table]
+ end
+
+ subgraph "Швеция"
+ SWE[SWE-HIPHOST
swe.hiphost.rt.shx.su]
+ OSPF_SWE[OSPF
redistribute=static]
+ BFD_SWE[BFD Session]
+ end
+
+ subgraph "Финляндия"
+ FIN[FIN-HIPHOST
fin.hiphost.rt.shx.su]
+ OSPF_FIN[OSPF
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.
\ No newline at end of file
diff --git a/ospf_ihor_bgp_failover.md b/ospf_ihor_bgp_failover.md
new file mode 100644
index 0000000..a8b78e7
--- /dev/null
+++ b/ospf_ihor_bgp_failover.md
@@ -0,0 +1,380 @@
+# OSPF на IHOR/VPSVILLE с BGP маршрутами и автоматическим failover
+
+## Правильная архитектура
+
+```mermaid
+graph TB
+ subgraph "HOME"
+ HOME[HOME
home.rt.shx.su]
+ RT[Routing Table
BGP-Routes]
+ end
+
+ subgraph "Москва"
+ IHOR[MSK-IHOR
msk.ihor.rt.shx.su]
+ VPSVILLE[MSK-VPSVILLE
msk.vpsville.rt.shx.su]
+ BGP[BGP Routes
12,000 маршрутов]
+ OSPF[OSPF Instance
redistribute=bgp]
+ BFD_SWE[BFD → SWE]
+ BFD_FIN[BFD → FIN]
+ end
+
+ subgraph "Швеция"
+ SWE[SWE-HIPHOST
swe.hiphost.rt.shx.su]
+ end
+
+ subgraph "Финляндия"
+ FIN[FIN-HIPHOST
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 маршруты продолжат работать через резервный шлюз!
\ No newline at end of file
diff --git a/shx-network/qos_multiwan_mikrotik_ros7.md b/shx-network/qos_multiwan_mikrotik_ros7.md
new file mode 100644
index 0000000..b8c76a3
--- /dev/null
+++ b/shx-network/qos_multiwan_mikrotik_ros7.md
@@ -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= action=mark-packet new-packet-mark=pm_w1_up passthrough=no
+add chain=postrouting out-interface= action=mark-packet new-packet-mark=pm_w2_up passthrough=no
+add chain=postrouting out-interface= action=mark-packet new-packet-mark=pm_w3_up passthrough=no
+
+# Download per-WAN (prerouting / in-interface)
+add chain=prerouting in-interface= action=mark-packet new-packet-mark=pm_w1_down passthrough=no
+add chain=prerouting in-interface= action=mark-packet new-packet-mark=pm_w2_down passthrough=no
+add chain=prerouting in-interface= 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= packet-mark=pm_w1_up queue=cake-diffserv4 max-limit=
+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= packet-mark=pm_w1_down queue=cake-diffserv4 max-limit=
+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= packet-mark=pm_w2_up queue=cake-diffserv4 max-limit=
+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= packet-mark=pm_w2_down queue=cake-diffserv4 max-limit=
+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= packet-mark=pm_w3_up queue=cake-diffserv4 max-limit=
+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= packet-mark=pm_w3_down queue=cake-diffserv4 max-limit=
+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= packet-mark=pm_w1_up queue=fqcodel max-limit=
+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= packet-mark=pm_w1_down queue=fqcodel max-limit=
+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= packet-mark=pm_w2_up queue=fqcodel max-limit=
+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= packet-mark=pm_w2_down queue=fqcodel max-limit=
+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= packet-mark=pm_w3_up queue=fqcodel max-limit=
+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= packet-mark=pm_w3_down queue=fqcodel max-limit=
+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) получается и приоритет, и справедливость.