MultiWAN — Интернет через несколько провайдеров
Сценарии MultiWAN
MultiWAN — подключение роутера к нескольким интернет-провайдерам одновременно. Это позволяет повысить отказоустойчивость, увеличить суммарную пропускную способность или направлять определённый трафик через конкретного провайдера. RouterOS 7 предоставляет несколько механизмов для реализации MultiWAN.
| Подход | Описание | Сложность | Когда использовать |
|---|---|---|---|
| Failover | Основной + резервный канал. Трафик идёт через ISP1, при падении переключается на ISP2 | Низкая | Нужна надёжность, не нужна агрегация полосы |
| PCC | Per-Connection Classifier распределяет соединения между ISP на основе хеша | Средняя | Нужна агрегация полосы, много клиентов |
| ECMP | Equal 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
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
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
Балансировка через 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
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
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
| Характеристика | ECMP | PCC |
|---|---|---|
| Сложность настройки | Минимальная — только маршруты и NAT | Средняя — mangle, routing tables, маршруты |
| Гранулярность | Per-packet или per-flow (зависит от версии) | Per-connection (все пакеты одного соединения идут через один ISP) |
| Совместимость с HTTPS | Возможны проблемы с сессиями | Полная совместимость |
| Failover | Автоматический при check-gateway | Требует дополнительной настройки |
| Неравная балансировка | Нет (только равное распределение) | Да (можно настроить 2/3 + 1/3 через PCC) |
| Контроль | Минимальный | Полный контроль через connection marks |
Мониторинг каналов
Надёжный 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
Типичные проблемы
Асимметричная маршрутизация
Проблема: пакет уходит через 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
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