LINUX.ORG.RU

Автоматический WAN failover для OpenWrt на 8-МБ роутере: wanmon вместо mwan3

 , mwan3, networkfailover, , wanmon


1

1

Написал легковесный демон для OpenWrt, который переключает default route по качеству канала (latency, loss, jitter). Влезает в 8 МБ flash, где mwan3 со всеми зависимостями уже не помещается.


Проблема:

Есть роутер Xiaomi Mi Router 4C (8 МБ flash, 64 МБ RAM) на OpenWrt r24550-f909059b74. Нужно автоматически переключаться с проводного интернета на Wi-Fi точку доступа с телефона при падении основного канала.

Файловая система:

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                 6912      6912         0 100% /rom
tmpfs                    28584       336     28248   1% /tmp
/dev/mtdblock9            5760      5628       132  98% /overlay
overlayfs:/overlay        5760      5628       132  98% /

Свободно ~130 КБ. mwan3 со всеми зависимостями (iptables, conntrack, LuCI) сюда уже не влезает.


Существующие решения

mwan3 — стандартный инструмент для multi-WAN в OpenWrt. Умеет балансировку, policy-based routing, трекинг через ICMP/DNS/ARP. Но:

  • требует установки iptables, kmod-ipt-conntrack-extra, luci-app-mwan3 и пр. — цепочка зависимостей разрастается до 1–2 МБ.
  • держит persistent-демон, трекеры, нагружает conntrack — на 64 МБ RAM под нагрузкой это ощутимо.
  • конфигурация сложная (интерфейсы, члены, политики) для задачи «переключить маршрут при деградации».

Другие варианты типа ifplugd не умеют оценивать качество канала — только up/down.


Мое решение: легковесная служба wanmon на скриптах

Написал свой демон на POSIX shell. Три независимых стадии:

  1. Измерение (wm-state.sh) — ICMP-пинги до заданного хоста через каждый интерфейс, сбор RTT, loss, jitter.

  2. Решение (wm-select.sh) — вычисляет score для каждого интерфейса:

   score = (latency + jitter) + (loss² / loss_divisor) + bias

Выбирает интерфейс с минимальным score. Применяет сглаживание (smooth window) и гистерезис, чтобы избежать флаппинга.

  1. Применение (wm-apply.sh) — обновляет таблицу маршрутизации: основной default route через выбранный интерфейс, резервный — через первый из оставшихся с увеличенной метрикой.

Демон (wm-daemon.sh) — служба, которая непрерывно проверяет состояние сетевых интерфейсов, запуская вышеупомянутые скрипты в цикле с заданным интервалом. При необходимости она переключает соединение на более предпочтительное.

Философия: связность — не бинарное состояние. Канал может быть «up», но непригоден для работы. wanmon трактует качество как непрерывную cost-функцию, а не флаг достижимости.


Сравнение с mwan3

Параметрmwan3wanmon
Занимаемое место≥1–2 МБ (с зависимостями)<100 КБ
Использование RAMУмеренное (демон + conntrack + трекеры)Минимальное (fork-exec цикл)
КонфигурацияСложная (политики, члены, трекеры)Один JSON-файл
Основное назначениеБалансировка + failoverТолько failover
Критерий выбораДоступность (up/down)Latency + loss + jitter
Web-интерфейсПолноценный LuCIОдна HTML-страница или вкладка в LuCI
Policy-based routingЕстьНет
Per-connection trackingЕстьНет
МодифицируемостьСложно (C/shell)Просто (shell)

Честно: wanmon не замена mwan3 во всех сценариях. Это сознательный трейд-офф: отказ от гибкости в пользу минимализма и работы в ограниченном окружении.


Как работает на практике

Поднял на роутере два интерфейса:

  • wan — проводной
  • wwan — Wi-Fi точка доступа с телефона

В ifaces.json выставил bias для проводного интерфейса ниже (предпочтительнее). При падении качества проводного канала (потеря пакетов, рост задержки) score растёт, после пересечения порога гистерезиса маршрут переключается на wwan. При восстановлении — переключается обратно.

Веб-интерфейс по адресу http://<router_ip>/wanmon.html (или через раздел «Службы» → «WAN Monitor» в LuCI) показывает статус, текущий маршрут, scores и телеметрию, позволяет переключить вручную.


Ссылки


Вывод

Для маломощных роутеров (8 МБ flash, 64 МБ RAM) wanmon — рабочая альтернатива mwan3, когда нужен только failover по качеству канала. Простая архитектура, минимальный вес, прозрачная логика. Если у вас более мощное железо и нужна балансировка/политики — берите mwan3. wanmon для узких мест.



Проверено: dataman ()
Последнее исправление: cetjs2 (всего исправлений: 2)

В wm-apply.sh скорее всего ещё нужен echo f > /proc/net/nf_conntrack
Либо выборочный flush типа описанного тут.

MirandaUser2 ★★
()

не хватает двух тегов, от автора и нейрослоп

gagarin0
()

Свободно ~130 КБ. mwan3 со всеми зависимостями (iptables, conntrack, LuCI) сюда уже не влезает.

Всё равно же понадобится что-либо ещё доустановить в прошивку роутера со временем. Почему ты не хочешь заменить микросхему энергонезависимой памяти на более ёмкую? Последовательность действий по замене микросхемы может быть следующей:

  1. Считать работающую прошивку программатором-прищепкой;
  2. Загрузить эту считанную прошивку в новую вместительную микросхему программатором-прищепкой;
  3. Строительным феном либо паяльником и иголкой выпаять свою маленькую микросхему и таким же образом запаять новую более вместительную микросхему.
Enthusiast ★★★☆
()
Ответ на: комментарий от Enthusiast

Почему ты не хочешь заменить микросхему энергонезависимой памяти на более ёмкую?
2. Загрузить эту считанную прошивку в новую вместительную микросхему программатором-прищепкой;

А каждый ли роутер «в состоянии понять», что у него стало больше доступной ему памяти?..

Somebody ★★★★
()
Последнее исправление: Somebody (всего исправлений: 1)
Ответ на: комментарий от Somebody

ну думаю этот вопрос решается в U-boot. В любом случае перед началом работ нужно убедится что имеются истории успеха.

я лично увеличивал память на HAME A-15 роутерах.

Nurmukh ★★★★
()

Для таких случаев делается кастомный билд openwrt именно с тем что нужно тебе минимальный под твой роутер, но с некоторыми стандартными вещами убранными, которые занимают место. Хотя конечно свои костыли всегда теплее и приятнее…

Делается примерно так (пакеты и модель роутера заменяешь под нужные):

make image PROFILE=tl-wr941nd-v4 PACKAGES="dnscrypt-proxy 6in4 curl sudo -ppp -ppp-mod-pppoe -opkg -kmod-gpio-button-hotplug"
anonymous_sama ★★★★★
()
Ответ на: комментарий от Nurmukh

ну думаю этот вопрос решается в U-boot.

Не знаком с таким. :)

В любом случае перед началом работ нужно убедится что имеются истории успеха.

Да, это разумно. Но, к сожалению, для лежащего у меня D-Link DIR-651 никакой «магии» в сети не нашёл... А жаль: «поц-и-ент»-то рабочий, только «дохленький»... И жаль, что не проапгрейдить...

В любом случае, спасибо за ответ!.. :)

Somebody ★★★★
()

Спасибо, надо попробовать, mwan3 я так и не смог настроить для стабильной работы с фэйловером на несколько awg соединений:(

lomaster
()

Проверка только по одному хосту - такое себе. Нужно десятка два хостов пинговать и сравнивать среднее по больнице. Плюс что там с 3 и более wan?

Khnazile ★★★★★
()

легковесный демон для OpenWrt, который переключает default route по качеству канала (latency, loss, jitter). Влезает в 8 МБ flash

кто влезает ? легковесный демон влезает ?? да он толстожопое чудовище если столько весит :-)

MKuznetsov ★★★★★
()

Свободно ~130 КБ. mwan3 со всеми зависимостями (iptables, conntrack, LuCI) сюда уже не влезает.

А если включить их в прошивку, в squashfs-образ, с помощью https://firmware-selector.openwrt.org/?

Сборка завершается успешно, файл получается размером в 6 357 271 байт, должно поместиться.

ValdikSS ★★★★★
()
Ответ на: комментарий от Enthusiast

выпаять свою маленькую микросхему и таким же образом запаять

У меня целый склад девайсов, которые так и умерли. Мне вещей тоньше конденсатора на 1000 мФ доверять нельзя.

ng256
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.