Балансировка двух LTE модемов в Mikrotik. Часть 2

С выхода прошлой заметки про балансировку двух LTE модемов прошло много времени. Однако проводной Интернет так и не добрался до моего дома, а это значит для выхода в Интернет я все еще использую LTE модемы и RouterOS. Да, некоторое время я применял простое резервирование одного LTE модема через второй LTE модем, но, в итоге вернулся к использованию двух модемов одновременно и правилу 50/50.

В этой заметке я бы хотел рассказать о своем опыте работы с Mikrotik с двумя LTE модемами и некоторых особенностях подобной схемы.

Введение

Основная идея балансировки заключается в том, чтобы маркировать соединения и, в зависимости от метки, осуществлять маршрутизацию на внутренний или внешний модемы. С помощью правил маршрутизации трафик (соединения) распределяются между модемами равномерно или пропорционально их пропускной способности. В итоге, в таком режиме максимальная скорость “скачивания” не будет равна сумме скоростей двух модемов, но будет она выше скорости каждого из модемов по отдельности.

Примерно год назад я отказался от Huawei E8372H-153 в пользу DW5821e-eSIM Snapdragon X20 LT (в примерах ниже это lte3). В качестве основного модема по-прежнему выступает Quectel EG12 LTE (lte1), встроенный в Mikrotik Chateau LTE12.

Настройка

В моем случае, на обоих модемах условно “безлимитные” тарифные планы с примерно одинаковым допустимым объемом трафика, поэтому новые соединения обрабатываются по простому правилу 50/50. Важный момент который нужно учесть, что маршрут для ранее открытого соединения не должен меняться. Это особенно важно, если вы используете виртуальные каналы связи, например, туннель к Cloudflare или VPN до офиса.

Все настройки удобно делать через Winbox, актуальная версия всегда доступна на сайте производителя. Первым делом создаем отдельные таблицы маршрутизации: LTE-INT и LTE-EXT (для внутреннего и внешнего модемов соответственно, впрочем вы можете задавать любые понятые вам имена): Rounting -> Tables

/routing/table/add name=LTE-INT fib=yes
/routing/table/add name=LTE-EXT fib=yes

В результате получится что-то подобное

На скриншоте выше видны еще две таблицы: WG и ZT. Дело в том, что в своей работе я использую Wireguard и Zerotier, но для их корректной работы нужно отслеживать соответствующие соединения отдельно, а значит создать отдельные правила и таблицы. Если вы используете подобные решения, создайте отдельные таблицы, в противном случае достаточно только LTE-INT и LTE-EXT.

Следующий шаг – внести второй модем (в моем случае lte3) в список интерфейсов WAN:

/interface/list/member/add list=WAN interface=lte3

Или через Winbox: Interfaces вкладка Interface List и далее добавить.

Добавление второго модема в список WAN интерфейсов
Добавление второго модема в список WAN интерфейсов

В результате списки интерфейсов должны выглядеть примерно следующим образом

Список WAN интерфейсов с двумя модемами
Список WAN интерфейсов с двумя модемами

Переходим на вкладку LTE и далее в разделе LTE APNs увеличиваем значение Default Route Distance в APN до 15 для профиля default.

/interface/lte/apn/set [find name="default"] default-route-distance=15

Для второго модема я рекомендую создать отдельный профиль и в нем установить значение Route Distance большее чем дефолтный профиль, если приоритет второго модема меньше чем у первого и наоборот. В моем случае первый модем в приоритете, поэтому для второго модема у меня установлено значение 20. Значение APN должно соответствовать настройкам вашего провайдера или оставьте пункт Use Network APN.

Настройка Default Route Distance в LTE APN

Теперь нужно промаркировать соединения, а для этого нужно создать правила mangle. Создать правила можно через Winbox, но для этого потребовалось бы сделать несколько скриншотов на одно правило, а правил несколько, что в итоге получилось бы громоздко и неудобно…

Список правил для работы через два LTE модема

Поэтому я приведу команды для ввода через консоль. Все команды можно использовать методом CTRL+C/CTRL+V , но помните возможные отличия (например, название интерфейса внешнего модема).

Маркировку начнем с локальных соединений. В принципе, этого можно было и не делать, но мне так было проще =) Для этого создадим список адресов локальной сети и далее будем маркировать соединения по IP адресу. Команды будут иметь примерно следующий вид (подсеть в примере взята типовая, но в вашем случае она может отличаться).

/ip/firewall/address-list/add list=Local address=192.168.1.0/24 comment="LOCAL Network"
/ip/firewall/mangle/add chain=prerouting dst-address-list=local connection-mark=no-mark action=mark-connection new-connection-mark=LOCAL passthrough=yes comment="Mark LOCAL"

Если вы используете внешние подключения, например, к Wireguard, то эти соединения нужно маркировать отдельно. По аналогии с локальной сетью нужно создать соответствующий список для WG. Предположим что WG использует диапазон 10.0.1.0/24, тогда команда создания списка WG будет иметь следующий вид

/ip/firewall/address-list/add list=WG address=10.0.1.0/24 comment="Wireguard Network"

После создания списка, мы можем использовать этот список для маркировки соединений к WG:

/ip/firewall/mangle/add chain=prerouting dst-address-list=WG connection-mark=no-mark action=mark-connection new-connection-mark=WG passthrough=yes comment="Mark WG"

Аналогично нужно промаркировать соединения других внешних сервисов, если они используются (Zerotier, Cloudflare и т.п.).

Теперь нужно промаркировать входящие соединения для внешнего и внутреннего модемов:

/ip/firewall/mangle/add chain=prerouting in-interface=lte1 connection-mark=no-mark action=mark-connection new-connection-mark=LTE-INT passthrough=yes comment="Mark IN LTE-INT"

/ip/firewall/mangle/add chain=prerouting in-interface=lte3 connection-mark=no-mark action=mark-connection new-connection-mark=LTE-EXT passthrough=yes comment="Mark IN LTE-EXT"

Осталось добавить правило для маркировки новых исходящих соединений. Делать будем это в соответствии с простым правилом “1 к 1”: одно соединение через LTE-INT, одно – через LTE-EXT (всего два, поэтому дальше цикл повторяется). Конечно, можно изменить это соотношение, использовать, например, 2 к 1 или 2 к 3. Все зависит от вашего сценария и условий.

/ip/firewall/mangle/add chain=prerouting dst-address-list=!Local connection-mark=no-mark per-connection-classifier=both-addresses:2/1 dst-address-type=!local action=mark-connection new-connection-mark=LTE-INT passthrough=yes comment="Mark OUT LTE-INT"

/ip/firewall/mangle/add chain=prerouting dst-address-list=!Local connection-mark=no-mark per-connection-classifier=both-addresses:2/2 dst-address-type=!local action=mark-connection new-connection-mark=LTE-EXT passthrough=yes comment="Mark OUT LTE-EXT"

Соединения помечены, осталось применить соответствующие маршруты. Делаем это с помощью правил, представленных ниже. Если вы используете внешние сервисы, например, WG, то сначала добавляем их.

/ip/firewall/mangle/add chain=prerouting connection-mark=WG action=mark-routing new-routing-mark=WG passthrough=no comment="Route WG"

Далее добавляем обработку маршрутов для внутреннего и внешнего модемов соответственно.

/ip/firewall/mangle/add chain=prerouting connection-mark=LTE-INT action=mark-routing new-routing-mark=LTE-INT passthrough=no comment="Route LTE-INT Connections"

/ip/firewall/mangle/add chain=prerouting connection-mark=LTE-EXT action=mark-routing new-routing-mark=LTE-EXT passthrough=no comment="Route LTE-EXT Connections"

Последний штрих. Остается добавить маршруты, чтобы задействовать созданные в самом начале таблицы маршрутизации.

/ip/route/add dst-address=0.0.0.0/0 gateway=lte1 distance=10 routing-table=LTE-INT comment="Route via LTE-INT"

/ip/route/add dst-address=0.0.0.0/0 gateway=lte3 distance=10 routing-table=LTE-EXT comment="Route via LTE-EXT"

Если все сделано верно, то в Winbox в разделе Ip -> Routes можно будет увидеть примерно следующую картину:

Настроенные маршруты в Winbox

В принципе все. С этого момента трафик будет направляться как через внутренний, так и через внешний модем в соответствии с правилами.

Заключение

В таком режиме мой роутер работает последние полтора года и за это время я не нашел для себя каких-то проблем при реализации такой схемы.

Для тех кому интересны цифры, то ниже несколько скриншотов с замерами входящей и исходящей скорости через популярный сервис speedtest.net

Входящая скорость при работе через два модема
Исходящая скорость при работе через два модема

А вот так выглядит этот тест на мониторинге в Grafana: видно что во время замеров оба модема загружаются равномерно, но обеспечивают разную пропускную способность.

Мониторинг трафика через LTE модемы в Grafana

Очевидно, что подобные преимущества достигаются только если используются множественные соединения. Если рассматривать соединения точка-точка, например, передача файлов по SSH, то скорость будет ограничена пропускной способностью того модема, через который было установлено соединение.

А на этом все. Надеюсь кому-то данный материал будет полезен.