Архитектура multi-WAN: как это работает
Схема с несколькими интернет-каналами (multi-WAN) решает две задачи: сохранение доступа в сеть при падении одного из провайдеров (failover) и увеличение пропускной способности за счет распределения трафика (балансировка). В основе решения три компонента: nftables маркирует пакеты, policy routing через ip rule направляет их в нужные таблицы, а mwan3 управляет состоянием каналов и автоматически переключает маршруты при сбое.
Трафик из локальной сети попадает в цепочку nftables, где получает метку (fwmark). Ядро Linux, обрабатывая пакет, сверяется с правилами ip rule: метка определяет, через какую таблицу маршрутизации и через какой шлюз уйдет пакет. mwan3 работает уровнем выше: он отслеживает доступность каждого WAN-интерфейса через ping и при обнаружении отказа изменяет правила ip rule, исключая неработающий канал. Эта архитектура проверена на ядре 6.x, nftables 1.0.x и mwan3 2.x в 2026 году.
Роль nftables в маркировке трафика
Маркировка трафика (fwmark) - это присвоение пакету числовой метки, которую позже считывает ip rule. Без маркировки ядро использует единственную таблицу маршрутизации main, и все пакеты уходят через шлюз по умолчанию. nftables позволяет гибко назначать метки: по IP-адресу источника, по входящему интерфейсу, по порту назначения или комбинации этих параметров.
Пример правила, которое помечает все пакеты от хоста 192.168.1.100 меткой 1:
table inet mangle {
chain PREROUTING {
type filter hook prerouting priority mangle; policy accept;
ip saddr 192.168.1.100 counter meta mark set 0x1
}
}
Метка 0x1 позже используется в ip rule для выбора таблицы маршрутизации первого провайдера. Аналогично создаются правила для других подсетей или типов трафика.
Policy routing с ip rule: разделение трафика по провайдерам
Policy routing в Linux строится на правилах (ip rule) и дополнительных таблицах маршрутизации. По умолчанию существуют таблицы local, main и default. Для multi-WAN создаются отдельные таблицы под каждого провайдера. Правила ip rule определяют, при каких условиях пакет направляется в ту или иную таблицу.
Создание таблиц начинается с правки файла /etc/iproute2/rt_tables:
100 ISP1
200 ISP2
Теперь правило ip rule, направляющее трафик с меткой 1 в таблицу ISP1:
ip rule add fwmark 1 table ISP1
Приоритет правил важен: чем меньше число, тем выше приоритет. Правила с конкретными метками должны иметь более высокий приоритет, чем общее правило для балансировки или fallback-маршрут в таблице main.
mwan3 как оркестратор отказоустойчивости и балансировки
mwan3 - это демон, который управляет состоянием WAN-интерфейсов и динамически корректирует маршрутизацию. Он оперирует тремя сущностями: интерфейсы (interfaces), участники (members) и политики (policies). Интерфейс описывает WAN-соединение и способ проверки его доступности. Member связывает интерфейс с весом для балансировки. Policy объединяет members в сценарий: failover (основной + резервный) или balance (распределение с весами).
Преимущество mwan3 перед самописными скриптами - встроенная система отслеживания каналов. Демон периодически отправляет ping на указанные адреса (track_ip) и при превышении порога потерь помечает интерфейс как недоступный. Правила ip rule автоматически обновляются: трафик перенаправляется на резервный канал без разрыва активных сессий, если настроены sticky-сессии. mwan3 тесно интегрирован с nftables и ip rule: он не заменяет их, а управляет правилами на основе состояния каналов.
Подготовка системы: требования и исходные данные
Перед началом настройки убедитесь, что система соответствует требованиям. Необходимые пакеты: nftables (версия 1.0.0 и выше), iproute2, mwan3 (версия 2.10 и выше). На Debian mwan3 устанавливается из стороннего репозитория или собирается из исходников. На OpenWrt пакет доступен в стандартном репозитории: opkg install mwan3.
Схема сети для этой инструкции:
- LAN: 192.168.1.0/24, интерфейс eth0
- WAN1 (основной): интерфейс eth1, шлюз 10.0.0.1, IP провайдера 10.0.0.2
- WAN2 (резервный): интерфейс eth2, шлюз 192.168.100.1, IP провайдера 192.168.100.2
Отключите NetworkManager и другие сервисы, управляющие сетью, - они могут перезаписывать правила маршрутизации и настройки интерфейсов. На Debian используйте systemd-networkd или ручную настройку через /etc/network/interfaces. На OpenWrt все настройки выполняются через UCI.
Настройка nftables для маркировки трафика
Маркировка трафика - первый этап обработки пакета. Правила nftables должны быть атомарными и загружаться одной транзакцией через nft -f /etc/nftables.conf. Ниже приведена конфигурация для двух провайдеров с маркировкой по подсетям источника.
Базовая конфигурация nftables для двух WAN
#!/usr/sbin/nft -f
table inet mangle {
chain PREROUTING {
type filter hook prerouting priority mangle; policy accept;
# Трафик от бухгалтерии (подсеть .10.0/24) - через WAN1, метка 1
ip saddr 192.168.10.0/24 counter meta mark set 0x1
# Трафик от разработчиков (подсеть .20.0/24) - через WAN2, метка 2
ip saddr 192.168.20.0/24 counter meta mark set 0x2
# Остальной трафик - без метки, пойдет через балансировку
}
chain POSTROUTING {
type nat hook postrouting priority srcnat; policy accept;
# SNAT для WAN1
oifname "eth1" counter masquerade
# SNAT для WAN2
oifname "eth2" counter masquerade
}
}
Цепочка PREROUTING срабатывает до принятия решения о маршрутизации. Пакеты от указанных подсетей получают метки 0x1 или 0x2. Цепочка POSTROUTING выполняет Source NAT (masquerade) - подмену исходного адреса на IP исходящего интерфейса. Без SNAT ответные пакеты от внешних хостов не вернутся на роутер.
Проверка маркировки: инструменты и типичные ошибки
Проверить, что метки присваиваются корректно, можно командой nft monitor. Запустите её в одной сессии, а из LAN инициируйте трафик (ping до внешнего адреса):
nft monitor trace
В выводе будет видно, какое правило сработало и какая метка присвоена. Альтернативный способ - tcpdump на исходящем интерфейсе с фильтром по метке, но tcpdump не показывает fwmark напрямую. Косвенно проверка выполняется через ip rule и traceroute: трафик от хоста из подсети .10.0 должен уходить через WAN1.
Частые ошибки: опечатки в именах интерфейсов (eth1 вместо eth2), неправильный порядок правил (более специфичные правила должны идти раньше общих), отсутствие хука prerouting в цепочке. Если метка не присваивается, проверьте, что таблица inet mangle загружена: nft list tables.
Policy routing: настройка ip rule и таблиц маршрутизации
После того как nftables пометил пакеты, ip rule направляет их в соответствующие таблицы маршрутизации. Каждая таблица содержит маршрут по умолчанию через своего провайдера.
Создание дополнительных таблиц маршрутизации
Добавьте именованные таблицы в /etc/iproute2/rt_tables. Имена произвольны, но должны быть понятны:
100 ISP1
200 ISP2
Теперь заполните таблицы маршрутами. Для ISP1 (WAN1):
ip route add 10.0.0.0/24 dev eth1 src 10.0.0.2 table ISP1
ip route add default via 10.0.0.1 dev eth1 table ISP1
Для ISP2 (WAN2):
ip route add 192.168.100.0/24 dev eth2 src 192.168.100.2 table ISP2
ip route add default via 192.168.100.1 dev eth2 table ISP2
Первый маршрут в каждой таблице обеспечивает локальную связность с подсетью провайдера. Без него роутер не сможет общаться со шлюзом провайдера напрямую.
Настройка правил ip rule для failover и балансировки
Правила ip rule связывают метки nftables с таблицами:
ip rule add fwmark 1 table ISP1 priority 100
ip rule add fwmark 2 table ISP2 priority 101
Для балансировки трафика без меток используется правило с несколькими nexthop в таблице main:
ip route add default scope global \
nexthop via 10.0.0.1 dev eth1 weight 1 \
nexthop via 192.168.100.1 dev eth2 weight 1
Веса (weight) определяют пропорцию распределения трафика. При равных весах ядро распределяет соединения по алгоритму round-robin на основе хеша от адресов источника и назначения. Это обеспечивает равномерную нагрузку и предотвращает асимметричную маршрутизацию в рамках одного соединения.
Проверьте итоговую конфигурацию:
ip rule show
ip route show table ISP1
ip route show table ISP2
Управление каналами с mwan3: failover и балансировка
Статические правила ip rule не учитывают состояние каналов. Если WAN1 упадет, трафик с меткой 1 все равно пойдет в таблицу ISP1 и будет потерян. mwan3 решает эту проблему, динамически управляя правилами на основе доступности интерфейсов.
Конфигурация mwan3 для автоматического переключения (failover)
Конфигурационный файл /etc/config/mwan3 (OpenWrt) или /etc/mwan3.conf (Debian) состоит из секций interfaces, members, policies и rules. Пример конфигурации для failover:
config interface 'wan1'
option enabled '1'
option family 'ipv4'
option track_method 'ping'
list track_ip '8.8.8.8'
list track_ip '1.1.1.1'
option interval '5'
option timeout '2'
option down '3'
option up '2'
config interface 'wan2'
option enabled '1'
option family 'ipv4'
option track_method 'ping'
list track_ip '8.8.4.4'
list track_ip '1.0.0.1'
option interval '5'
option timeout '2'
option down '3'
option up '2'
config member 'wan1_member'
option interface 'wan1'
option metric '1'
config member 'wan2_member'
option interface 'wan2'
option metric '2'
config policy 'failover_policy'
list use_member 'wan1_member'
list use_member 'wan2_member'
config rule 'default_rule'
option dest_ip '0.0.0.0/0'
option proto 'all'
option use_policy 'failover_policy'
Параметры отслеживания: interval - интервал между проверками в секундах, timeout - таймаут ожидания ответа на ping, down - количество неудачных проверок для признания канала упавшим, up - количество успешных для восстановления. При down=3 и interval=5 канал будет признан недоступным через 15 секунд после сбоя.
Настройка балансировки нагрузки с mwan3
Для балансировки создается политика с типом balance и несколькими members с разными весами:
config member 'wan1_bal'
option interface 'wan1'
option metric '1'
option weight '2'
config member 'wan2_bal'
option interface 'wan2'
option metric '1'
option weight '1'
config policy 'balance_policy'
option type 'balance'
list use_member 'wan1_bal'
list use_member 'wan2_bal'
option sticky '1'
option sticky_timeout '600'
Вес 2 у WAN1 означает, что через него пойдет в два раза больше соединений, чем через WAN2. Параметр sticky=1 включает привязку сессий: все пакеты одного соединения пойдут через тот же WAN, даже если балансировщик выбрал бы другой. Это предотвращает разрыв сессий и проблемы с асимметричной маршрутизацией. Таймаут sticky (600 секунд) определяет, как долго сохраняется привязка после завершения соединения.
Мониторинг и отладка mwan3
Основная команда для проверки состояния - mwan3 status. Вывод показывает все интерфейсы, их статус (online/offline) и статистику переключений:
mwan3 status
Детальная информация по интерфейсам:
mwan3 interfaces
Логи mwan3 находятся в syslog. Включите расширенное логирование для отладки:
option loglevel 'debug'
Типичные проблемы: неправильные метрики интерфейсов (metric в member должен соответствовать приоритету в ip rule), конфликт с другими правилами ip rule (mwan3 ожидает, что управляет правилами сам), недоступность track_ip (если оба адреса для проверки недоступны, интерфейс будет считаться упавшим).
Особенности настройки на OpenWrt и Debian
Процесс настройки различается в зависимости от дистрибутива. OpenWrt предоставляет интегрированный стек с LuCI и UCI, Debian требует ручной сборки компонентов.
Multi-WAN на OpenWrt: использование LuCI и консоли
На OpenWrt mwan3 устанавливается из репозитория и интегрируется с LuCI. После установки в веб-интерфейсе появляется раздел Network → MultiWAN Manager. Через LuCI можно настроить интерфейсы, участников, политики и правила без правки конфигурационных файлов вручную.
При использовании консоли конфигурация хранится в /etc/config/mwan3. После правки файла примените изменения:
/etc/init.d/mwan3 restart
Сетевые интерфейсы WAN настраиваются в /etc/config/network стандартным образом. mwan3 использует имена интерфейсов из этого файла. Убедитесь, что в конфигурации интерфейса нет опции metric, конфликтующей с метриками mwan3.
Multi-WAN на Debian: пошаговая настройка без панели управления
На Debian mwan3 устанавливается из исходников или через сторонний репозиторий. Последовательность действий:
- Установите зависимости: nftables, iproute2, iptables (для совместимости)
- Соберите mwan3 из исходников или подключите репозиторий
- Создайте конфигурационный файл /etc/mwan3.conf по аналогии с OpenWrt
- Настройте systemd-сервис для автозапуска
Правила nftables и ip rule на Debian настраиваются вручную, как описано в предыдущих разделах. Для сохранения правил после перезагрузки создайте systemd-сервис, который загружает конфигурацию nftables и применяет ip rule. Пример юнита:
[Unit]
Description=Multi-WAN routing
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/nft -f /etc/nftables.conf
ExecStart=/bin/bash /etc/network/ip-rules.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Именование интерфейсов на Debian может отличаться от OpenWrt. Используйте предсказуемые имена (enp0s3) вместо eth0/eth1 или создайте правила udev для переименования.
Тестирование отказоустойчивости и балансировки
После настройки проведите контролируемое тестирование. Не обрывайте физический кабель - используйте программные методы для имитации сбоя.
Имитация сбоя WAN-канала
Отключите интерфейс программно:
ip link set eth1 down
Или заблокируйте исходящий трафик через nftables, чтобы сохранить интерфейс активным, но сделать шлюз недоступным:
nft add rule inet mangle PREROUTING oifname "eth1" drop
После блокировки проверьте статус mwan3 - интерфейс должен перейти в offline в течение заданного интервала (down * interval). Трафик должен автоматически переключиться на WAN2.
Анализ потери пакетов при переключении
Запустите непрерывный ping с хоста в LAN до внешнего адреса (например, 8.8.8.8) и одновременно отключите основной WAN:
ping -c 100 8.8.8.8
Количество потерянных пакетов покажет время переключения. При interval=5 и down=3 максимальное время обнаружения сбоя - 15 секунд. Для минимизации потерь уменьшите эти значения, но учтите, что слишком агрессивные настройки могут вызвать ложные срабатывания при кратковременных флуктуациях.
Для проверки балансировки выполните curl ifconfig.me с разных хостов LAN. Хосты из разных подсетей должны показать разные внешние IP-адреса (WAN1 и WAN2 соответственно). Хосты без привязки к конкретному WAN должны показывать оба адреса в пропорции, заданной весами.
Устранение типичных проблем
Даже при точном следовании инструкции могут возникнуть проблемы. Ниже - наиболее частые сценарии и способы их решения.
Трафик идет не через тот WAN
Симптом: хост из подсети, привязанной к WAN1, выходит в интернет через WAN2. Проверьте по порядку:
- Присваивается ли метка: nft list table inet mangle - счетчики (counter) должны увеличиваться
- Есть ли правило ip rule: ip rule show | grep fwmark - должно быть правило с нужной меткой
- Содержит ли таблица маршрут по умолчанию: ip route show table ISP1
- Не переопределяет ли mwan3 правила: mwan3 status покажет, какая политика активна
Частая причина - mwan3 управляет правилами ip rule и удаляет статические правила, добавленные вручную. Настройте правила через конфигурацию mwan3, а не через ip rule add напрямую.
mwan3 не видит отказ канала
Симптом: интерфейс физически отключен, но mwan3 показывает его как online. Причины:
- track_ip недоступен всегда - mwan3 не может определить состояние. Используйте несколько адресов для проверки (минимум два)
- Слишком большой interval или down - сбой не успевает зафиксироваться. Уменьшите значения
- Проверка идет через сам проверяемый интерфейс, а не через другую таблицу маршрутизации. Убедитесь, что ping до track_ip действительно уходит через нужный WAN
Проверьте логи: logread | grep mwan3. В дебаг-режиме видно каждый ping и его результат.
Если после восстановления канала трафик не возвращается на основной WAN, проверьте параметр up в конфигурации интерфейса. При up=2 потребуется две успешные проверки подряд, прежде чем интерфейс снова станет активным.