Обновлено: 23.03.2026

MultiWAN — Интернет через несколько провайдеров

MultiWANFailoverPCCLoad Balancing

Сценарии MultiWAN

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

ℹ️
Перед настройкой MultiWAN определите основную задачу: резервирование (failover), балансировка нагрузки (load balancing) или маршрутизация по политикам (policy routing). Каждый сценарий требует своего подхода.
ПодходОписаниеСложностьКогда использовать
FailoverОсновной + резервный канал. Трафик идёт через ISP1, при падении переключается на ISP2НизкаяНужна надёжность, не нужна агрегация полосы
PCCPer-Connection Classifier распределяет соединения между ISP на основе хешаСредняяНужна агрегация полосы, много клиентов
ECMPEqual Cost Multi-Path — несколько маршрутов с одинаковой метрикойНизкаяПростая балансировка без строгих требований
Policy RoutingМаршрутизация конкретного трафика через конкретного ISPСредняяVoIP через ISP1, загрузки через ISP2

Базовая настройка двух WAN

Типовая схема: ether1 — ISP1 (DHCP-клиент), ether2 — ISP2 (статический IP или PPPoE), ether3-ether5 — LAN (bridge). Ниже приведена базовая конфигурация, которая является основой для всех последующих сценариев.

# --- Интерфейсы LAN ---
/interface/bridge
add name=bridge-lan

/interface/bridge/port
add bridge=bridge-lan interface=ether3
add bridge=bridge-lan interface=ether4
add bridge=bridge-lan interface=ether5

# --- IP для LAN ---
/ip/address
add address=192.168.1.1/24 interface=bridge-lan

# --- ISP1: DHCP-клиент на ether1 ---
/ip/dhcp-client
add interface=ether1 add-default-route=no use-peer-dns=no

# --- ISP2: статический IP на ether2 ---
/ip/address
add address=203.0.113.2/30 interface=ether2

# --- Альтернатива: ISP2 через PPPoE ---
# /interface/pppoe-client
# add interface=ether2 name=pppoe-isp2 user="login" password="pass"

# --- Routing Tables ---
/routing/table
add name=to-ISP1 fib
add name=to-ISP2 fib

# --- DNS ---
/ip/dns
set servers=8.8.8.8,1.1.1.1 allow-remote-requests=yes

# --- DHCP сервер для LAN ---
/ip/pool
add name=pool-lan ranges=192.168.1.100-192.168.1.254

/ip/dhcp-server
add name=dhcp-lan interface=bridge-lan address-pool=pool-lan

/ip/dhcp-server/network
add address=192.168.1.0/24 gateway=192.168.1.1 dns-server=192.168.1.1RouterOS CLI
⚠️
Параметр add-default-route=no в DHCP-клиенте важен: маршруты по умолчанию мы создаём вручную с нужными параметрами (distance, routing-mark, check-gateway). Если оставить add-default-route=yes, DHCP-клиент создаст свой маршрут, который может конфликтовать с вашей настройкой.

Failover (резервирование)

Простейший сценарий MultiWAN: весь трафик идёт через ISP1 (основной). При падении ISP1 трафик автоматически переключается на ISP2 (резервный). Для этого используются маршруты с разным distance и параметром check-gateway=ping.

# Основной маршрут через ISP1 (distance=1)
/ip/route
add dst-address=0.0.0.0/0 gateway=192.168.100.1     distance=1 check-gateway=ping comment="ISP1 primary"

# Резервный маршрут через ISP2 (distance=2)
add dst-address=0.0.0.0/0 gateway=203.0.113.1     distance=2 check-gateway=ping comment="ISP2 backup"

# NAT для обоих провайдеров
/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=masquerade
add chain=srcnat out-interface=ether2 action=masqueradeRouterOS CLI
💡
check-gateway=ping проверяет доступность только шлюза провайдера. Если шлюз отвечает, но интернет за ним недоступен, переключения не произойдёт. Для надёжного failover используйте Netwatch.

Netwatch позволяет проверять доступность внешнего хоста (например, 8.8.8.8) и управлять маршрутами в зависимости от результата:

# Netwatch: мониторим 8.8.8.8 через ISP1
# Сначала добавим маршрут для проверки через ISP1
/ip/route
add dst-address=8.8.8.8/32 gateway=192.168.100.1     comment="probe via ISP1"

/tool/netwatch
add host=8.8.8.8 interval=10s timeout=2s     up-script="
/ip/route/set [find comment=\"ISP1 primary\"] disabled=no
/ip/route/set [find comment=\"ISP2 backup\"] disabled=no
:log warning \"MultiWAN: ISP1 UP - primary route restored\"
"     down-script="
/ip/route/set [find comment=\"ISP1 primary\"] disabled=yes
:log error \"MultiWAN: ISP1 DOWN - switched to ISP2\"
"RouterOS CLI
ℹ️
При срабатывании Netwatch маршрут ISP1 отключается, и трафик автоматически переходит на ISP2, так как его маршрут с distance=2 становится единственным активным. При восстановлении ISP1 маршрут включается обратно и перехватывает трафик благодаря меньшему distance.

Балансировка через PCC

Per-Connection Classifier (PCC) — механизм, который хеширует параметры каждого нового соединения (src/dst адреса, src/dst порты) и на основе остатка от деления определяет, через какой канал пойдёт это соединение. Все пакеты одного соединения всегда идут через один и тот же ISP.

Параметр per-connection-classifier имеет формат: тип:делитель/остаток. Например, both-addresses-and-ports:2/0 означает: хешируем src+dst адреса и порты, делим на 2, если остаток = 0 — это группа ISP1. Остаток 1 — группа ISP2.

PCC для двух провайдеров (50/50)

# --- Маркировка входящих соединений от провайдеров ---
/ip/firewall/mangle
add chain=input in-interface=ether1 action=mark-connection     new-connection-mark=ISP1-conn passthrough=yes
add chain=input in-interface=ether2 action=mark-connection     new-connection-mark=ISP2-conn passthrough=yes

# --- PCC: распределение новых соединений из LAN ---
add chain=prerouting in-interface=bridge-lan     connection-state=new dst-address-type=!local     per-connection-classifier=both-addresses-and-ports:2/0     action=mark-connection new-connection-mark=ISP1-conn     passthrough=yes
add chain=prerouting in-interface=bridge-lan     connection-state=new dst-address-type=!local     per-connection-classifier=both-addresses-and-ports:2/1     action=mark-connection new-connection-mark=ISP2-conn     passthrough=yes

# --- Маркировка маршрутов на основе connection-mark ---
add chain=prerouting connection-mark=ISP1-conn     in-interface=bridge-lan action=mark-routing     new-routing-mark=to-ISP1
add chain=prerouting connection-mark=ISP2-conn     in-interface=bridge-lan action=mark-routing     new-routing-mark=to-ISP2

# --- Маршрут ответного трафика через правильный ISP ---
add chain=output connection-mark=ISP1-conn     action=mark-routing new-routing-mark=to-ISP1
add chain=output connection-mark=ISP2-conn     action=mark-routing new-routing-mark=to-ISP2

# --- Маршруты ---
/ip/route
add dst-address=0.0.0.0/0 gateway=192.168.100.1     routing-table=to-ISP1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=203.0.113.1     routing-table=to-ISP2 check-gateway=ping

# Default route для трафика самого роутера
add dst-address=0.0.0.0/0 gateway=192.168.100.1 distance=1     check-gateway=ping
add dst-address=0.0.0.0/0 gateway=203.0.113.1 distance=2     check-gateway=ping

# --- NAT для каждого ISP ---
/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=masquerade
add chain=srcnat out-interface=ether2 action=masqueradeRouterOS CLI

PCC для трёх провайдеров (33/33/33)

# Для 3 ISP меняется делитель: 3/0, 3/1, 3/2
/ip/firewall/mangle
add chain=input in-interface=ether1 action=mark-connection     new-connection-mark=ISP1-conn passthrough=yes
add chain=input in-interface=ether2 action=mark-connection     new-connection-mark=ISP2-conn passthrough=yes
add chain=input in-interface=ether3 action=mark-connection     new-connection-mark=ISP3-conn passthrough=yes

add chain=prerouting in-interface=bridge-lan     connection-state=new dst-address-type=!local     per-connection-classifier=both-addresses-and-ports:3/0     action=mark-connection new-connection-mark=ISP1-conn     passthrough=yes
add chain=prerouting in-interface=bridge-lan     connection-state=new dst-address-type=!local     per-connection-classifier=both-addresses-and-ports:3/1     action=mark-connection new-connection-mark=ISP2-conn     passthrough=yes
add chain=prerouting in-interface=bridge-lan     connection-state=new dst-address-type=!local     per-connection-classifier=both-addresses-and-ports:3/2     action=mark-connection new-connection-mark=ISP3-conn     passthrough=yes

# Маркировка маршрутов и routing tables — аналогично двум ISP
# Добавьте routing-table to-ISP3 и маршрут через ISP3 gateway

/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=masquerade
add chain=srcnat out-interface=ether2 action=masquerade
add chain=srcnat out-interface=ether3 action=masqueradeRouterOS CLI
⚠️
PCC не гарантирует точного распределения 50/50. Распределение зависит от хеша параметров соединений. При небольшом количестве клиентов перекос может быть значительным. PCC работает лучше при большом числе одновременных соединений.

Policy Routing

Policy Routing позволяет направлять определённый трафик через конкретного провайдера. Например, VoIP-трафик — через ISP1 (с низкой задержкой), а загрузки — через ISP2 (с широким каналом).

Маршрутизация по dst-port (VoIP через ISP1)

# SIP и RTP-трафик через ISP1
/ip/firewall/mangle
add chain=prerouting in-interface=bridge-lan     protocol=udp dst-port=5060-5061     action=mark-routing new-routing-mark=to-ISP1     passthrough=no comment="SIP via ISP1"
add chain=prerouting in-interface=bridge-lan     protocol=udp dst-port=10000-20000     action=mark-routing new-routing-mark=to-ISP1     passthrough=no comment="RTP via ISP1"RouterOS CLI

Маршрутизация по src-address (определённые хосты через ISP2)

# Сервер загрузок — через ISP2
/ip/firewall/mangle
add chain=prerouting src-address=192.168.1.50     in-interface=bridge-lan     action=mark-routing new-routing-mark=to-ISP2     passthrough=no comment="Download server via ISP2"RouterOS CLI

Маршрутизация по address-list

# Создаём address-list для VoIP-клиентов
/ip/firewall/address-list
add list=voip-clients address=192.168.1.10
add list=voip-clients address=192.168.1.11
add list=voip-clients address=192.168.1.12

# Address-list для серверов, трафик к которым идёт через ISP2
add list=isp2-destinations address=198.51.100.0/24
add list=isp2-destinations address=203.0.113.128/25

# Mangle-правила
/ip/firewall/mangle
add chain=prerouting in-interface=bridge-lan     src-address-list=voip-clients     action=mark-routing new-routing-mark=to-ISP1     passthrough=no
add chain=prerouting in-interface=bridge-lan     dst-address-list=isp2-destinations     action=mark-routing new-routing-mark=to-ISP2     passthrough=noRouterOS CLI
💡
Правила Policy Routing должны стоять выше правил PCC в таблице mangle. Параметр passthrough=no гарантирует, что после совпадения пакет не будет обработан следующими правилами mangle.

ECMP (Equal Cost Multi-Path)

ECMP — самый простой способ балансировки нагрузки между несколькими провайдерами. Достаточно создать несколько маршрутов по умолчанию с одинаковым distance. RouterOS автоматически распределит трафик между ними.

# ECMP: два маршрута с одинаковым distance
/ip/route
add dst-address=0.0.0.0/0 gateway=192.168.100.1     distance=1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=203.0.113.1     distance=1 check-gateway=ping

# NAT для обоих ISP
/ip/firewall/nat
add chain=srcnat out-interface=ether1 action=masquerade
add chain=srcnat out-interface=ether2 action=masqueradeRouterOS CLI
ХарактеристикаECMPPCC
Сложность настройкиМинимальная — только маршруты и NATСредняя — mangle, routing tables, маршруты
ГранулярностьPer-packet или per-flow (зависит от версии)Per-connection (все пакеты одного соединения идут через один ISP)
Совместимость с HTTPSВозможны проблемы с сессиямиПолная совместимость
FailoverАвтоматический при check-gatewayТребует дополнительной настройки
Неравная балансировкаНет (только равное распределение)Да (можно настроить 2/3 + 1/3 через PCC)
КонтрольМинимальныйПолный контроль через connection marks
🚨
ECMP в RouterOS 7 может перебрасывать пакеты одного TCP-соединения между разными ISP, что приводит к разрыву сессий. Для HTTPS, VoIP и других stateful-протоколов рекомендуется использовать PCC вместо ECMP.

Мониторинг каналов

Надёжный MultiWAN требует постоянного мониторинга состояния каждого WAN-канала. Netwatch позволяет отслеживать доступность внешних хостов через конкретные интерфейсы и выполнять скрипты при изменении состояния.

# --- Маршруты для проверки через каждый ISP ---
/ip/route
add dst-address=8.8.8.8/32 gateway=192.168.100.1     comment="probe-ISP1"
add dst-address=1.1.1.1/32 gateway=203.0.113.1     comment="probe-ISP2"

# --- Netwatch для ISP1 ---
/tool/netwatch
add host=8.8.8.8 interval=15s timeout=3s     up-script="
:if ([/ip/route/get [find comment=\"ISP1 primary\"] disabled]) do={
    /ip/route/set [find comment=\"ISP1 primary\"] disabled=no
    :log warning \"MONITOR: ISP1 restored\"
}
"     down-script="
/ip/route/set [find comment=\"ISP1 primary\"] disabled=yes
:log error \"MONITOR: ISP1 down - failover activated\"
"     comment="Monitor ISP1"

# --- Netwatch для ISP2 ---
add host=1.1.1.1 interval=15s timeout=3s     up-script="
:if ([/ip/route/get [find comment=\"ISP2 backup\"] disabled]) do={
    /ip/route/set [find comment=\"ISP2 backup\"] disabled=no
    :log warning \"MONITOR: ISP2 restored\"
}
"     down-script="
/ip/route/set [find comment=\"ISP2 backup\"] disabled=yes
:log error \"MONITOR: ISP2 down\"
"     comment="Monitor ISP2"RouterOS CLI

Скрипт для отображения текущего состояния каналов (можно запускать вручную или по расписанию):

# Скрипт статуса MultiWAN
/system/script
add name=multiwan-status source="
:local isp1 \"DOWN\"
:local isp2 \"DOWN\"
:if ([:len [/ip/route/find where comment=\"ISP1 primary\" active=yes]] > 0) do={
    :set isp1 \"UP\"
}
:if ([:len [/ip/route/find where comment=\"ISP2 backup\" active=yes]] > 0) do={
    :set isp2 \"UP\"
}
:log info \"=== MultiWAN Status ===\"
:log info (\"ISP1 (ether1): \" . \$isp1)
:log info (\"ISP2 (ether2): \" . \$isp2)
:local activeRoute [/ip/route/find where dst-address=\"0.0.0.0/0\" active=yes]
:log info (\"Active default routes: \" . [:len \$activeRoute])
"RouterOS CLI
💡
Для получения уведомлений при смене канала добавьте в Netwatch-скрипты отправку email или Telegram-сообщений через /tool/fetch. Пример: /tool/fetch url="https://api.telegram.org/bot.../sendMessage?chat_id=...&text=ISP1+DOWN" keep-result=no

Типичные проблемы

Асимметричная маршрутизация

Проблема: пакет уходит через ISP1, а ответ приходит через ISP2. Провайдер ISP2 отбрасывает пакет, так как source IP не принадлежит его сети (RPF check).

Решение: обязательно маркируйте входящие соединения в chain=input для каждого WAN-интерфейса (как показано в разделе PCC). Ответный трафик будет уходить через тот же ISP, через который пришёл запрос.

# Маркировка входящих для корректного обратного пути
/ip/firewall/mangle
add chain=input in-interface=ether1     action=mark-connection new-connection-mark=ISP1-conn
add chain=input in-interface=ether2     action=mark-connection new-connection-mark=ISP2-conn
add chain=output connection-mark=ISP1-conn     action=mark-routing new-routing-mark=to-ISP1
add chain=output connection-mark=ISP2-conn     action=mark-routing new-routing-mark=to-ISP2RouterOS CLI

DNS Leaks

Проблема: DNS-запросы от роутера всегда идут через основной маршрут (main routing table), независимо от PCC. Клиенты могут получать DNS-ответы через другой ISP, что вызывает задержки или блокировки.

Решение: используйте DNS-серверы, доступные через любого провайдера (8.8.8.8, 1.1.1.1). Или настройте DNS-сервер роутера для использования обоих ISP:

/ip/dns
set servers=8.8.8.8,8.8.4.4,1.1.1.1,1.0.0.1     allow-remote-requests=yesRouterOS CLI

Connection Tracking и несколько WAN

Проблема: при переключении с ISP1 на ISP2 существующие соединения в conntrack сохраняют старый source IP. Новые пакеты уходят через ISP2, но с source IP от ISP1 — провайдер ISP2 их отбрасывает.

Решение: после переключения очистите connection tracking:

# Очистка conntrack при failover (добавьте в Netwatch down-script)
/ip/firewall/connection/remove [find]
# Или для точечной очистки — только соединения через упавший ISP:
/ip/firewall/connection/remove [find connection-mark=ISP1-conn]RouterOS CLI
⚠️
Команда /ip/firewall/connection/remove [find] разрывает все текущие соединения. Это приведёт к кратковременному сбросу всех сессий (TCP, VoIP, VPN). Используйте точечную очистку по connection-mark, если возможно.

FastTrack и MultiWAN

Проблема: FastTrack обходит mangle-таблицу, поэтому PCC-маркировка не работает для established/related-соединений, обработанных FastTrack.

Решение: отключите FastTrack при использовании PCC или Policy Routing:

# Удалить или отключить FastTrack
/ip/firewall/filter
remove [find action=fasttrack-connection]

# Если нужна производительность — используйте FastTrack
# только для simple failover (без PCC/mangle)RouterOS CLI
🚨
FastTrack несовместим с PCC, Policy Routing и любыми mangle-правилами. При включённом FastTrack маркировка соединений не будет работать для established-трафика. Для простого failover (без mangle) FastTrack можно оставить.