Настройка multi-WAN: балансировка и отказоустойчивость с nftables и mwan3 | AdminWiki

Настройка multi-WAN: балансировка и отказоустойчивость с nftables и mwan3

22 июля 2026 11 мин. чтения
Содержание статьи

Архитектура 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 устанавливается из исходников или через сторонний репозиторий. Последовательность действий:

  1. Установите зависимости: nftables, iproute2, iptables (для совместимости)
  2. Соберите mwan3 из исходников или подключите репозиторий
  3. Создайте конфигурационный файл /etc/mwan3.conf по аналогии с OpenWrt
  4. Настройте 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 потребуется две успешные проверки подряд, прежде чем интерфейс снова станет активным.

Поделиться:
Сохранить гайд? В закладки браузера