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) получается и приоритет, и справедливость.