mikrotik-wiki.ru
Главная
Загрузка...

Два провайдера на MikroTik — failover и балансировка

RouterOS 7.xIP13 мин230 мар. 2026 г.
TelegramVK

Подключение двух интернет-провайдеров к одному MikroTik — одна из самых востребованных задач в малом и среднем бизнесе. Потеря интернета даже на 10 минут означает простой IP-телефонии, CRM, платёжных терминалов и удалённого доступа. В этом руководстве разберём три способа организации резервирования: простой failover, recursive routing и балансировку нагрузки через PCC.

Инструкция актуальна для RouterOS 7.x и подходит для любых моделей с двумя и более Ethernet-портами: hAP ax2, hAP ax3, RB5009, CCR2004, hex S и других.

Зачем два провайдера

Один провайдер — одна точка отказа. Причины падения разнообразны: обрыв кабеля при строительных работах, авария на стороне провайдера, плановое обслуживание, DDoS-атака на инфраструктуру, проблемы с DNS или BGP. Даже провайдер с SLA 99.9% допускает до 8 часов простоя в год — и эти 8 часов обычно приходятся на самый неподходящий момент.

В офисе с IP-телефонией, облачной CRM или платёжными терминалами даже 5 минут без интернета — это потерянные звонки, недовольные клиенты и упущенная выручка. Второй канал стоит сравнительно недорого, а MikroTik позволяет настроить автоматическое переключение без дополнительного оборудования.

Второй канал решает эту проблему. В зависимости от требований вы можете настроить:

  • Failover — основной канал работает постоянно, резервный включается автоматически при падении основного. Самый простой и надёжный вариант.
  • Recursive routing — улучшенный failover с проверкой доступности не шлюза, а реального хоста в интернете. Обнаруживает проблемы, которые обычный check-gateway пропускает.
  • Load balancing (PCC) — трафик распределяется между двумя каналами одновременно. Максимальная утилизация каналов, но есть ограничения.

Подготовка: два WAN-интерфейса

Предположим следующую топологию:

  • ether1 — ISP1 (основной), получает адрес 10.0.1.100/24, шлюз 10.0.1.1
  • ether2 — ISP2 (резервный), получает адрес 172.16.0.100/24, шлюз 172.16.0.1
  • bridge-LAN — локальная сеть 192.168.88.0/24

Назначим адреса на WAN-интерфейсы (если провайдер не выдаёт адрес по DHCP):

[admin@MikroTik] >
/ip/address
add address=10.0.1.100/24 interface=ether1 comment="ISP1"
add address=172.16.0.100/24 interface=ether2 comment="ISP2"

Если один или оба провайдера выдают адрес по DHCP:

[admin@MikroTik] >
/ip/dhcp-client
add interface=ether1 add-default-route=no comment="ISP1-DHCP"
add interface=ether2 add-default-route=no comment="ISP2-DHCP"

Обратите внимание на add-default-route=no — маршруты по умолчанию мы будем создавать вручную, чтобы контролировать приоритеты и проверку доступности.

Способ 1 — Failover через distance и check-gateway

Это самый простой и понятный метод. Создаём два маршрута по умолчанию с разными значениями distance. Маршрут с меньшим distance имеет приоритет. Параметр check-gateway=ping заставляет RouterOS периодически пинговать шлюз — если он не отвечает, маршрут деактивируется и трафик переключается на резервный канал.

[admin@MikroTik] >
/ip/route
add dst-address=0.0.0.0/0 gateway=10.0.1.1 distance=1 check-gateway=ping comment="ISP1-primary"
add dst-address=0.0.0.0/0 gateway=172.16.0.1 distance=2 check-gateway=ping comment="ISP2-backup"

Проверяем таблицу маршрутизации:

[admin@MikroTik] >
/ip/route print where dst-address=0.0.0.0/0

Вы должны увидеть оба маршрута. Маршрут через ISP1 будет active (distance=1), маршрут через ISP2 — в резерве (distance=2).

Как это работает: RouterOS отправляет ICMP-запросы на адрес шлюза каждые 10 секунд. Если три запроса подряд остаются без ответа, маршрут помечается как unreachable, и трафик переключается на следующий маршрут с минимальным distance. Когда шлюз снова отвечает — маршрут восстанавливается.

Недостаток: check-gateway проверяет только доступность шлюза провайдера. Если шлюз отвечает на ping, но интернет за ним недоступен (проблема на магистрали, ошибка маршрутизации у провайдера), переключение не произойдёт. Для решения этой проблемы используйте recursive routing.

Способ 2 — Recursive routing (более надёжный)

Recursive routing решает главную проблему простого failover: он проверяет доступность не шлюза, а реального хоста в интернете. Идея в том, чтобы создать «цепочку» маршрутов — сначала маршрут до контрольного хоста через шлюз провайдера, затем маршрут по умолчанию через этот контрольный хост.

Выбираем два надёжных хоста для проверки. Используем публичные DNS-серверы — они имеют высокую доступность:

  • 1.1.1.1 (Cloudflare DNS) — для проверки ISP1
  • 8.8.4.4 (Google DNS) — для проверки ISP2

Шаг 1: Создаём маршруты до контрольных хостов через шлюзы провайдеров.

[admin@MikroTik] >
/ip/route
add dst-address=1.1.1.1/32 gateway=10.0.1.1 scope=10 comment="Check-ISP1"
add dst-address=8.8.4.4/32 gateway=172.16.0.1 scope=10 comment="Check-ISP2"

Шаг 2: Создаём маршруты по умолчанию, которые используют контрольные хосты в качестве gateway. Параметр target-scope должен быть больше или равен значению scope из шага 1.

[admin@MikroTik] >
/ip/route
add dst-address=0.0.0.0/0 gateway=1.1.1.1 distance=1 target-scope=11 check-gateway=ping comment="ISP1-recursive"
add dst-address=0.0.0.0/0 gateway=8.8.4.4 distance=2 target-scope=11 check-gateway=ping comment="ISP2-recursive"

Как это работает: RouterOS пингует 1.1.1.1 через ISP1. Если 1.1.1.1 недоступен (шлюз упал, провайдер потерял связность, магистраль легла) — первый маршрут по умолчанию деактивируется и трафик переходит на ISP2 через 8.8.4.4. Это надёжнее, чем проверка шлюза, потому что мы проверяем реальную связность с интернетом.

Проверяем, что маршруты активны:

[admin@MikroTik] >
/ip/route print detail where dst-address=0.0.0.0/0

Важно: не используйте один и тот же контрольный хост для обоих провайдеров. Если выбрать 1.1.1.1 для обоих — трафик до 1.1.1.1 всегда пойдёт через ISP1 (из-за маршрута с dst-address=1.1.1.1/32), и проверка ISP2 будет некорректной.

Важно: убедитесь, что значения scope и target-scope настроены правильно. По умолчанию scope маршрутов — 30, а target-scope — 10. Для recursive routing нужно, чтобы target-scope рекурсивного маршрута (11) был >= scope маршрута до контрольного хоста (10).

Способ 3 — Load balancing через PCC

Per Connection Classifier (PCC) распределяет соединения между двумя каналами на основе хеша адресов и портов. Каждое новое соединение «прикрепляется» к одному из каналов и продолжает использовать его до завершения. Это обеспечивает балансировку нагрузки с сохранением целостности сессий.

Предупреждение: PCC разбивает трафик по соединениям, а не по пакетам. Однако некоторые сервисы привязывают сессию к IP-адресу: интернет-банкинг, VPN-подключения, некоторые системы авторизации (OAuth). При балансировке через PCC запросы одного пользователя могут приходить с разных IP-адресов, что приводит к разрывам сессий и блокировкам. Для большинства пользователей простой failover или recursive routing — более безопасный выбор. Используйте PCC только если вам действительно нужна балансировка и вы готовы обрабатывать исключения.

Шаг 1: Маркируем соединения. Mangle-правила распределяют трафик из LAN 50/50 по двум каналам.

[admin@MikroTik] >
/ip/firewall/mangle
add chain=prerouting src-address=192.168.88.0/24 in-interface=bridge-LAN \
    connection-state=new per-connection-classifier=both-addresses:2/0 \
    action=mark-connection new-connection-mark=ISP1-conn passthrough=yes \
    comment="PCC-mark-ISP1"
add chain=prerouting src-address=192.168.88.0/24 in-interface=bridge-LAN \
    connection-state=new per-connection-classifier=both-addresses:2/1 \
    action=mark-connection new-connection-mark=ISP2-conn passthrough=yes \
    comment="PCC-mark-ISP2"

Шаг 2: Маркируем маршруты на основе меток соединений.

[admin@MikroTik] >
/ip/firewall/mangle
add chain=prerouting connection-mark=ISP1-conn in-interface=bridge-LAN \
    action=mark-routing new-routing-mark=to-ISP1 passthrough=no \
    comment="PCC-route-ISP1"
add chain=prerouting connection-mark=ISP2-conn in-interface=bridge-LAN \
    action=mark-routing new-routing-mark=to-ISP2 passthrough=no \
    comment="PCC-route-ISP2"

Шаг 3: Создаём маршруты для каждой метки и общий маршрут failover.

[admin@MikroTik] >
/ip/route
add dst-address=0.0.0.0/0 gateway=10.0.1.1 routing-mark=to-ISP1 distance=1 check-gateway=ping comment="PCC-ISP1"
add dst-address=0.0.0.0/0 gateway=172.16.0.1 routing-mark=to-ISP2 distance=1 check-gateway=ping comment="PCC-ISP2"
add dst-address=0.0.0.0/0 gateway=10.0.1.1 distance=1 check-gateway=ping comment="Fallback-ISP1"
add dst-address=0.0.0.0/0 gateway=172.16.0.1 distance=2 check-gateway=ping comment="Fallback-ISP2"

Два последних маршрута без routing-mark обеспечивают failover для трафика самого роутера (DNS-запросы, NTP, обновления) и для ситуаций, когда один из каналов падает.

NAT для двух провайдеров

При использовании двух WAN-интерфейсов необходимо настроить masquerade или src-nat для каждого из них. Если использовать одно правило masquerade без привязки к интерфейсу, пакеты могут уходить с неправильным source-адресом.

Вариант с masquerade (проще, подходит для динамических адресов):

[admin@MikroTik] >
/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=masquerade comment="NAT-ISP1"
add chain=srcnat out-interface=ether2 action=masquerade comment="NAT-ISP2"

Вариант с src-nat (эффективнее, подходит для статических адресов):

[admin@MikroTik] >
/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=src-nat to-addresses=10.0.1.100 comment="SNAT-ISP1"
add chain=srcnat out-interface=ether2 action=src-nat to-addresses=172.16.0.100 comment="SNAT-ISP2"

Рекомендация: если адрес от провайдера статический — используйте src-nat. Он работает быстрее, потому что не тратит ресурсы на определение исходящего адреса. Для DHCP — используйте masquerade, так как адрес может измениться.

DNS при failover

Проблема: если вы используете DNS-серверы только одного провайдера, при его падении DNS-разрешение перестанет работать даже при переключении на резервный канал. Решение — использовать публичные DNS-серверы.

[admin@MikroTik] >
/ip/dns
set servers=1.1.1.1,8.8.8.8,8.8.4.4,1.0.0.1 allow-remote-requests=yes cache-size=4096KiB

Если вы используете recursive routing с контрольными хостами 1.1.1.1 и 8.8.4.4, добавьте дополнительные DNS-серверы, которые не совпадают с контрольными хостами, или убедитесь, что маршруты до DNS-серверов корректны.

Также полезно увеличить размер кэша DNS. При переключении провайдера кэш сохранит часть записей и ускорит работу в переходный период.

Для надёжности можно настроить DNS-over-HTTPS (DoH) в RouterOS 7:

[admin@MikroTik] >
/ip/dns
set use-doh-server=https://cloudflare-dns.com/dns-query verify-doh-cert=yes

Перед включением DoH импортируйте корневые сертификаты:

[admin@MikroTik] >
/tool/fetch url=https://curl.se/ca/cacert.pem
/certificate import file-name=cacert.pem passphrase=""

Netwatch для мониторинга и уведомлений

Netwatch — встроенный инструмент мониторинга, который выполняет заданные скрипты при изменении доступности хоста. Используем его для логирования переключений и отправки уведомлений.

Базовый мониторинг ISP1:

[admin@MikroTik] >
/tool/netwatch
add host=1.1.1.1 interval=30s timeout=1000ms type=icmp \
    up-script="/log warning \"ISP1: link restored\"" \
    down-script="/log error \"ISP1: link down, switching to ISP2\"" \
    comment="Monitor-ISP1"

Базовый мониторинг ISP2:

[admin@MikroTik] >
/tool/netwatch
add host=8.8.4.4 interval=30s timeout=1000ms type=icmp \
    up-script="/log warning \"ISP2: link restored\"" \
    down-script="/log error \"ISP2: link down\"" \
    comment="Monitor-ISP2"

Расширенный мониторинг с уведомлением по email:

Сначала настройте SMTP (используйте app password для Gmail):

[admin@MikroTik] >
/tool/e-mail
set server=smtp.gmail.com port=587 start-tls=yes \
    from=router@yourdomain.com user=your@gmail.com password="app-password"

Затем создайте Netwatch с отправкой email при падении:

[admin@MikroTik] >
/tool/netwatch
add host=1.1.1.1 interval=30s timeout=1000ms type=icmp \
    down-script={
        /log error "ISP1 DOWN - failover activated"
        /tool e-mail send to="admin@yourdomain.com" \
            subject="[MikroTik] ISP1 DOWN" \
            body="Primary ISP is unreachable. Failover to ISP2 activated."
    } \
    up-script={
        /log warning "ISP1 UP - primary link restored"
        /tool e-mail send to="admin@yourdomain.com" \
            subject="[MikroTik] ISP1 UP" \
            body="Primary ISP is back online. Traffic restored to ISP1."
    } \
    comment="Monitor-ISP1-email"

Мониторинг с проверкой HTTP (RouterOS 7.1+):

[admin@MikroTik] >
/tool/netwatch
add host=1.1.1.1 type=http-get http-code-min=200 http-code-max=399 \
    interval=60s timeout=3000ms \
    down-script="/log error \"ISP1: HTTP check failed\"" \
    comment="Monitor-ISP1-HTTP"

Скрипт автопереключения

Для более сложных сценариев можно использовать скрипт, который проверяет доступность интернета через каждый канал и управляет маршрутами. Это полезно, если recursive routing по какой-то причине не подходит.

Создаём скрипт:

[admin@MikroTik] >
/system/script
add name="failover-check" policy=read,write,test source={
    :local pingTarget1 "1.1.1.1"
    :local pingTarget2 "8.8.4.4"
    :local isp1Gateway "10.0.1.1"
    :local isp2Gateway "172.16.0.1"
    :local isp1Interface "ether1"
    :local isp2Interface "ether2"

    # Проверяем ISP1 — пингуем через конкретный интерфейс
    :local isp1Status [/ping $pingTarget1 count=3 interface=$isp1Interface]
    :local isp2Status [/ping $pingTarget2 count=3 interface=$isp2Interface]

    # Получаем текущее состояние маршрутов
    :local route1Active [/ip/route find where gateway=$isp1Gateway dst-address=0.0.0.0/0 distance=1]
    :local route2Active [/ip/route find where gateway=$isp2Gateway dst-address=0.0.0.0/0 distance=2]

    :if ($isp1Status = 0) do={
        :if ([/ip/route get $route1Active disabled] = false) do={
            /ip/route set $route1Active disabled=yes
            /log error "Failover script: ISP1 down, disabling primary route"
        }
    } else={
        :if ([/ip/route get $route1Active disabled] = true) do={
            /ip/route set $route1Active disabled=no
            /log warning "Failover script: ISP1 restored, enabling primary route"
        }
    }

    :if ($isp2Status = 0) do={
        :if ([/ip/route get $route2Active disabled] = false) do={
            /ip/route set $route2Active disabled=yes
            /log error "Failover script: ISP2 down, disabling backup route"
        }
    } else={
        :if ([/ip/route get $route2Active disabled] = true) do={
            /ip/route set $route2Active disabled=no
            /log warning "Failover script: ISP2 restored, enabling backup route"
        }
    }
}

Настраиваем запуск по расписанию каждые 30 секунд:

[admin@MikroTik] >
/system/scheduler
add name="failover-scheduler" interval=30s \
    on-event="/system/script/run failover-check" \
    policy=read,write,test comment="Run failover check every 30s"

Проверка работы

После настройки важно убедиться, что failover работает корректно. Вот пошаговый план тестирования.

1. Проверяем текущие маршруты:

[admin@MikroTik] >
/ip/route print where dst-address=0.0.0.0/0

Убедитесь, что основной маршрут (distance=1) активен, резервный (distance=2) — в таблице, но не активен как preferred.

2. Проверяем NAT:

[admin@MikroTik] >
/ip/firewall/nat print

Должны быть правила masquerade или src-nat для обоих WAN-интерфейсов.

3. Трассировка через каждый канал:

[admin@MikroTik] >
/tool/traceroute 8.8.8.8

Первый хоп должен быть шлюзом ISP1 (10.0.1.1). Запомните маршрут.

4. Имитируем падение ISP1:

Физически отключите кабель из ether1, или программно:

[admin@MikroTik] >
/interface/disable ether1

Подождите 30-40 секунд (время на обнаружение и переключение) и проверьте:

[admin@MikroTik] >
/ip/route print where dst-address=0.0.0.0/0
/tool/traceroute 8.8.8.8

Теперь первый хоп должен быть шлюзом ISP2 (172.16.0.1). Проверьте лог:

[admin@MikroTik] >
/log print where topics~"warning|error"

5. Восстанавливаем ISP1:

[admin@MikroTik] >
/interface/enable ether1

Через 10-20 секунд трафик должен вернуться на ISP1. Проверьте трассировкой.

6. Проверяем скорость обратного переключения:

Засеките время между включением интерфейса и появлением маршрута. Для check-gateway=ping это обычно 10-30 секунд. Для recursive routing — до 60 секунд в зависимости от настроек интервала.

7. Мониторинг в реальном времени:

[admin@MikroTik] >
/tool/torch interface=ether1
/tool/torch interface=ether2

Torch показывает трафик в реальном времени. При переключении вы увидите, как трафик пропадает на одном интерфейсе и появляется на другом.

8. Проверяем обратное переключение при PCC:

Если вы настроили PCC, отключите поочерёдно каждый канал и убедитесь, что весь трафик уходит через оставшийся. Проверьте, что после восстановления обоих каналов балансировка возобновляется:

[admin@MikroTik] >
/ip/firewall/mangle print stats where comment~"PCC"

Счётчики пакетов и байтов покажут, как распределяется нагрузка. В идеале значения должны быть примерно равными (точное соотношение 50/50 не гарантируется — это зависит от характера трафика).

Connection tracking и failover

При переключении между провайдерами существующие соединения (TCP-сессии) обрываются, потому что меняется source IP. Это нормальное поведение. Новые соединения установятся через резервный канал автоматически.

Для ускорения восстановления можно уменьшить таймауты connection tracking:

[admin@MikroTik] >
/ip/firewall/connection/tracking
set tcp-established-timeout=3600s tcp-close-wait-timeout=10s tcp-time-wait-timeout=10s

Если нужно принудительно сбросить все соединения после переключения (чтобы приложения быстрее переподключились):

[admin@MikroTik] >
/ip/firewall/connection/remove [find]

Эту команду можно добавить в down-script Netwatch, чтобы она выполнялась автоматически при падении канала.

Дополнительно стоит учитывать UDP-трафик. В отличие от TCP, UDP не имеет механизма повторной передачи, поэтому VoIP-звонки и видеоконференции прерываются мгновенно при переключении. Приложения должны самостоятельно переустановить соединение. Для SIP-телефонии рекомендуется уменьшить registration timeout на телефонных аппаратах до 60-120 секунд — так телефоны быстрее перерегистрируются через новый канал.

Правила Firewall при двух WAN

При двух WAN-интерфейсах не забудьте обновить правила firewall. Типичная ошибка — защитить только один WAN-интерфейс.

Создайте interface list для удобства:

[admin@MikroTik] >
/interface/list
add name=WAN
/interface/list/member
add interface=ether1 list=WAN
add interface=ether2 list=WAN

Используйте interface list в правилах firewall вместо указания конкретного интерфейса:

[admin@MikroTik] >
/ip/firewall/filter
add chain=input in-interface-list=WAN connection-state=established,related action=accept
add chain=input in-interface-list=WAN protocol=icmp action=accept comment="Allow ICMP from WAN"
add chain=input in-interface-list=WAN action=drop comment="Drop all from WAN"

add chain=forward in-interface-list=WAN connection-state=established,related action=accept
add chain=forward in-interface-list=WAN connection-state=new action=drop comment="Drop new from WAN to LAN"

Такой подход гарантирует, что при добавлении третьего провайдера вам достаточно добавить интерфейс в list WAN — правила firewall обновятся автоматически. Не придётся дублировать каждое правило для каждого интерфейса.

Типичные ошибки

1. Забыли NAT для второго провайдера. Самая частая ошибка. Трафик переключается на ISP2, но пакеты уходят с source-адресом сети ISP1. Провайдер их отбрасывает (RPF/BCP38). Решение: отдельное правило masquerade для каждого WAN-интерфейса.

2. DHCP-клиент создаёт маршрут автоматически. Если провайдер выдаёт адрес по DHCP, клиент создаёт маршрут по умолчанию с distance=1 по умолчанию. Это конфликтует с вашими ручными маршрутами. Решение: add-default-route=no в настройках DHCP-клиента.

3. Одинаковый distance на обоих маршрутах. Если оба маршрута имеют distance=1, RouterOS будет использовать ECMP (Equal-Cost Multi-Path) — это не failover и не контролируемая балансировка. Убедитесь, что distance различается.

4. check-gateway без gateway на одном L2-домене. Если шлюз провайдера доступен на канальном уровне (ARP отвечает), но не маршрутизирует трафик — check-gateway=ping покажет шлюз как доступный. Используйте recursive routing для таких случаев.

5. Не обновили DNS. При использовании DNS-серверов провайдера ISP1 — после переключения на ISP2 DNS перестаёт работать. Используйте публичные DNS (1.1.1.1, 8.8.8.8) или настройте DoH.

6. Не настроили firewall на втором WAN. Второй WAN-интерфейс — это ещё одна точка входа для атак. Используйте interface list WAN и применяйте правила фильтрации ко всем WAN-интерфейсам.

7. PCC без понимания последствий. PCC ломает сервисы, привязанные к IP: банковские приложения разлогинивают пользователей, VPN-туннели обрываются, OAuth-авторизация не проходит. Если вы не уверены — используйте простой failover.

8. Неправильные scope и target-scope в recursive routing. Если target-scope рекурсивного маршрута меньше scope маршрута до контрольного хоста — маршрут не активируется. Проверяйте: target-scope >= scope.

9. Контрольный хост стал недоступен. Если 1.1.1.1 или 8.8.4.4 временно упал (крайне редко, но возможно), failover сработает ложно. Для минимизации этого риска можно использовать скрипт, который проверяет несколько хостов и принимает решение по большинству.

10. Слишком агрессивные таймауты. Если поставить interval=5s в Netwatch или check-gateway, при кратковременных потерях пакетов будут постоянные переключения (flapping). Рекомендуемый интервал — 20-30 секунд для Netwatch, а check-gateway использует фиксированный 10-секундный интервал с порогом в 3 потери.

Итоговая рекомендация

Для большинства сценариев рекомендуем recursive routing — это оптимальный баланс между надёжностью и простотой. Он обнаруживает проблемы, которые обычный check-gateway пропускает, и не имеет побочных эффектов PCC.

Минимальная конфигурация для production:

[admin@MikroTik] >
# Маршруты до контрольных хостов
/ip/route
add dst-address=1.1.1.1/32 gateway=10.0.1.1 scope=10 comment="Probe-ISP1"
add dst-address=8.8.4.4/32 gateway=172.16.0.1 scope=10 comment="Probe-ISP2"

# Рекурсивные маршруты по умолчанию
/ip/route
add dst-address=0.0.0.0/0 gateway=1.1.1.1 distance=1 target-scope=11 check-gateway=ping comment="Default-ISP1"
add dst-address=0.0.0.0/0 gateway=8.8.4.4 distance=2 target-scope=11 check-gateway=ping comment="Default-ISP2"

# NAT для обоих провайдеров
/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=masquerade comment="NAT-ISP1"
add chain=srcnat out-interface=ether2 action=masquerade comment="NAT-ISP2"

# DNS — публичные серверы
/ip/dns set servers=1.1.1.1,8.8.8.8,1.0.0.1,8.8.4.4 allow-remote-requests=yes

# Мониторинг
/tool/netwatch
add host=1.1.1.1 interval=30s timeout=1000ms type=icmp \
    up-script="/log warning \"ISP1 restored\"" \
    down-script="/log error \"ISP1 down\""
add host=8.8.4.4 interval=30s timeout=1000ms type=icmp \
    up-script="/log warning \"ISP2 restored\"" \
    down-script="/log error \"ISP2 down\""

Эта конфигурация обеспечивает автоматическое переключение на резервный канал при любых проблемах с основным провайдером, корректный NAT для обоих каналов, DNS-резольвинг через публичные серверы и мониторинг с записью событий в лог.

Не забудьте также настроить firewall для обоих WAN-интерфейсов (см. раздел выше) и проверить работу по пошаговому плану из раздела «Проверка работы». После настройки рекомендуется экспортировать конфигурацию для резервного копирования:

[admin@MikroTik] >
/export file=failover-config
/system/backup/save name=failover-backup encryption=aes-sha256

Храните резервную копию за пределами роутера. В случае аппаратного сбоя вы сможете быстро восстановить конфигурацию на новом устройстве.

[admin@MikroTik] >
/ip/address
add address=10.0.1.100/24 interface=ether1 comment="ISP1"
add address=172.16.0.100/24 interface=ether2 comment="ISP2"
/ip/dhcp-client
add interface=ether1 add-default-route=no comment="ISP1-DHCP"
add interface=ether2 add-default-route=no comment="ISP2-DHCP"
/ip/route
add dst-address=0.0.0.0/0 gateway=10.0.1.1 distance=1 check-gateway=ping comment="ISP1-primary"
add dst-address=0.0.0.0/0 gateway=172.16.0.1 distance=2 check-gateway=ping comment="ISP2-backup"
/ip/route print where dst-address=0.0.0.0/0
/ip/route
add dst-address=1.1.1.1/32 gateway=10.0.1.1 scope=10 comment="Check-ISP1"
add dst-address=8.8.4.4/32 gateway=172.16.0.1 scope=10 comment="Check-ISP2"
/ip/route
add dst-address=0.0.0.0/0 gateway=1.1.1.1 distance=1 target-scope=11 check-gateway=ping comment="ISP1-recursive"
add dst-address=0.0.0.0/0 gateway=8.8.4.4 distance=2 target-scope=11 check-gateway=ping comment="ISP2-recursive"
/ip/route print detail where dst-address=0.0.0.0/0
/ip/firewall/mangle
add chain=prerouting src-address=192.168.88.0/24 in-interface=bridge-LAN \
    connection-state=new per-connection-classifier=both-addresses:2/0 \
    action=mark-connection new-connection-mark=ISP1-conn passthrough=yes \
    comment="PCC-mark-ISP1"
add chain=prerouting src-address=192.168.88.0/24 in-interface=bridge-LAN \
    connection-state=new per-connection-classifier=both-addresses:2/1 \
    action=mark-connection new-connection-mark=ISP2-conn passthrough=yes \
    comment="PCC-mark-ISP2"
/ip/firewall/mangle
add chain=prerouting connection-mark=ISP1-conn in-interface=bridge-LAN \
    action=mark-routing new-routing-mark=to-ISP1 passthrough=no \
    comment="PCC-route-ISP1"
add chain=prerouting connection-mark=ISP2-conn in-interface=bridge-LAN \
    action=mark-routing new-routing-mark=to-ISP2 passthrough=no \
    comment="PCC-route-ISP2"
/ip/route
add dst-address=0.0.0.0/0 gateway=10.0.1.1 routing-mark=to-ISP1 distance=1 check-gateway=ping comment="PCC-ISP1"
add dst-address=0.0.0.0/0 gateway=172.16.0.1 routing-mark=to-ISP2 distance=1 check-gateway=ping comment="PCC-ISP2"
add dst-address=0.0.0.0/0 gateway=10.0.1.1 distance=1 check-gateway=ping comment="Fallback-ISP1"
add dst-address=0.0.0.0/0 gateway=172.16.0.1 distance=2 check-gateway=ping comment="Fallback-ISP2"
/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=masquerade comment="NAT-ISP1"
add chain=srcnat out-interface=ether2 action=masquerade comment="NAT-ISP2"
/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=src-nat to-addresses=10.0.1.100 comment="SNAT-ISP1"
add chain=srcnat out-interface=ether2 action=src-nat to-addresses=172.16.0.100 comment="SNAT-ISP2"
/ip/dns
set servers=1.1.1.1,8.8.8.8,8.8.4.4,1.0.0.1 allow-remote-requests=yes cache-size=4096KiB
/ip/dns
set use-doh-server=https://cloudflare-dns.com/dns-query verify-doh-cert=yes
/tool/fetch url=https://curl.se/ca/cacert.pem
/certificate import file-name=cacert.pem passphrase=""
/tool/netwatch
add host=1.1.1.1 interval=30s timeout=1000ms type=icmp \
    up-script="/log warning \"ISP1: link restored\"" \
    down-script="/log error \"ISP1: link down, switching to ISP2\"" \
    comment="Monitor-ISP1"
/tool/netwatch
add host=8.8.4.4 interval=30s timeout=1000ms type=icmp \
    up-script="/log warning \"ISP2: link restored\"" \
    down-script="/log error \"ISP2: link down\"" \
    comment="Monitor-ISP2"
/tool/e-mail
set server=smtp.gmail.com port=587 start-tls=yes \
    from=router@yourdomain.com user=your@gmail.com password="app-password"
/tool/netwatch
add host=1.1.1.1 interval=30s timeout=1000ms type=icmp \
    down-script={
        /log error "ISP1 DOWN - failover activated"
        /tool e-mail send to="admin@yourdomain.com" \
            subject="[MikroTik] ISP1 DOWN" \
            body="Primary ISP is unreachable. Failover to ISP2 activated."
    } \
    up-script={
        /log warning "ISP1 UP - primary link restored"
        /tool e-mail send to="admin@yourdomain.com" \
            subject="[MikroTik] ISP1 UP" \
            body="Primary ISP is back online. Traffic restored to ISP1."
    } \
    comment="Monitor-ISP1-email"
/tool/netwatch
add host=1.1.1.1 type=http-get http-code-min=200 http-code-max=399 \
    interval=60s timeout=3000ms \
    down-script="/log error \"ISP1: HTTP check failed\"" \
    comment="Monitor-ISP1-HTTP"
/system/script
add name="failover-check" policy=read,write,test source={
    :local pingTarget1 "1.1.1.1"
    :local pingTarget2 "8.8.4.4"
    :local isp1Gateway "10.0.1.1"
    :local isp2Gateway "172.16.0.1"
    :local isp1Interface "ether1"
    :local isp2Interface "ether2"

    # Проверяем ISP1 — пингуем через конкретный интерфейс
    :local isp1Status [/ping $pingTarget1 count=3 interface=$isp1Interface]
    :local isp2Status [/ping $pingTarget2 count=3 interface=$isp2Interface]

    # Получаем текущее состояние маршрутов
    :local route1Active [/ip/route find where gateway=$isp1Gateway dst-address=0.0.0.0/0 distance=1]
    :local route2Active [/ip/route find where gateway=$isp2Gateway dst-address=0.0.0.0/0 distance=2]

    :if ($isp1Status = 0) do={
        :if ([/ip/route get $route1Active disabled] = false) do={
            /ip/route set $route1Active disabled=yes
            /log error "Failover script: ISP1 down, disabling primary route"
        }
    } else={
        :if ([/ip/route get $route1Active disabled] = true) do={
            /ip/route set $route1Active disabled=no
            /log warning "Failover script: ISP1 restored, enabling primary route"
        }
    }

    :if ($isp2Status = 0) do={
        :if ([/ip/route get $route2Active disabled] = false) do={
            /ip/route set $route2Active disabled=yes
            /log error "Failover script: ISP2 down, disabling backup route"
        }
    } else={
        :if ([/ip/route get $route2Active disabled] = true) do={
            /ip/route set $route2Active disabled=no
            /log warning "Failover script: ISP2 restored, enabling backup route"
        }
    }
}
/system/scheduler
add name="failover-scheduler" interval=30s \
    on-event="/system/script/run failover-check" \
    policy=read,write,test comment="Run failover check every 30s"
/ip/route print where dst-address=0.0.0.0/0
/ip/firewall/nat print
/tool/traceroute 8.8.8.8
/interface/disable ether1
/ip/route print where dst-address=0.0.0.0/0
/tool/traceroute 8.8.8.8
/log print where topics~"warning|error"
/interface/enable ether1
/tool/torch interface=ether1
/tool/torch interface=ether2
/ip/firewall/mangle print stats where comment~"PCC"
/ip/firewall/connection/tracking
set tcp-established-timeout=3600s tcp-close-wait-timeout=10s tcp-time-wait-timeout=10s
/ip/firewall/connection/remove [find]
/interface/list
add name=WAN
/interface/list/member
add interface=ether1 list=WAN
add interface=ether2 list=WAN
/ip/firewall/filter
add chain=input in-interface-list=WAN connection-state=established,related action=accept
add chain=input in-interface-list=WAN protocol=icmp action=accept comment="Allow ICMP from WAN"
add chain=input in-interface-list=WAN action=drop comment="Drop all from WAN"

add chain=forward in-interface-list=WAN connection-state=established,related action=accept
add chain=forward in-interface-list=WAN connection-state=new action=drop comment="Drop new from WAN to LAN"
# Маршруты до контрольных хостов
/ip/route
add dst-address=1.1.1.1/32 gateway=10.0.1.1 scope=10 comment="Probe-ISP1"
add dst-address=8.8.4.4/32 gateway=172.16.0.1 scope=10 comment="Probe-ISP2"

# Рекурсивные маршруты по умолчанию
/ip/route
add dst-address=0.0.0.0/0 gateway=1.1.1.1 distance=1 target-scope=11 check-gateway=ping comment="Default-ISP1"
add dst-address=0.0.0.0/0 gateway=8.8.4.4 distance=2 target-scope=11 check-gateway=ping comment="Default-ISP2"

# NAT для обоих провайдеров
/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=masquerade comment="NAT-ISP1"
add chain=srcnat out-interface=ether2 action=masquerade comment="NAT-ISP2"

# DNS — публичные серверы
/ip/dns set servers=1.1.1.1,8.8.8.8,1.0.0.1,8.8.4.4 allow-remote-requests=yes

# Мониторинг
/tool/netwatch
add host=1.1.1.1 interval=30s timeout=1000ms type=icmp \
    up-script="/log warning \"ISP1 restored\"" \
    down-script="/log error \"ISP1 down\""
add host=8.8.4.4 interval=30s timeout=1000ms type=icmp \
    up-script="/log warning \"ISP2 restored\"" \
    down-script="/log error \"ISP2 down\""
/export file=failover-config
/system/backup/save name=failover-backup encryption=aes-sha256
IP / Два провайдера на MikroTik — failover и балансировка