Mikrotik Load Balancer easy way или два говноинтернета в один
@b4zedIntro
Вобщем в̶н̶е̶з̶а̶п̶н̶о̶ наша компания решила передислоцироваться из одного офиса в другой. Конечно радости админа не было предела, так как главная "фишка" нового офиса в том, что там нет "нормального" по сегодняшим меркам Интернета в виде оптического канала. Есть только ADSL на 10Mbit/s и наш переносной 4G модем с altel 20-30Mbit/s. Пришлось изворачиваться и делать из г̶о̶в̶н̶а̶ ̶и̶ ̶п̶а̶л̶о̶к̶ того что есть, какой то вменяемый Интернет, чтобы последний техно микс @determination нормально стримился с саундклауда... благо Mikrotik решает такие проблемы на раз два!

Ресурсы:
- Mikrotik RB951G-2Hnd -1шт.
- ADSL модем провайдера 1. (10Мбит/c входящяя скорость 0.6Мбит/c исходящая скорость. )
- LTE модем провайдера 2. (20-30Мбит/c входящяя скорость 15-20Мбит/c исходящая скорость. )
Цель:
- Распределение нагрузки каналов Интернета входящего и исходящего трафика.
- Failover в режиме реального времени.

На хабре уже есть отличная статья о реализации Load Balancing решений на RouterOS. Советую начать знакомство оттуда.
Вкратце чтобы вы были в курсе в RouterOS есть несколько возможностей реализовать LB.
- ECMP (Equal Cost Multi-Path Routing) - балансировка на основе стоимости маршрута.
- Nth Load Balancing - Н-ая балансировка по соединениям и по пакетам.
- PCC - Per Connection Classifier - балансировка по соединениям.
- Bandwidth based/Firewall marking - балансировка на основе правил фаервола и загруженности каналов.
- Bonding - обьединение двух интерфейсов в один виртуальный.
У каждого из методов есть как плюсы так и минусы. Методы отличаются возможностью распределять трафик по-пакетно (per-packet) или по соединениям (per-connection). Ниже представлена таблица методов реализации Load Balancing.

В поиске готовых конфигураций я наткнулся на 2 хорошие работы 2012 года как настроить LB. От Стива и от Томаса. Стив описывает все виды настройки LB на RouterOS и описывает все плюсы и минусы и выбирает PCC. Томас также описывает все способы и выбирает PCC с добавлением скриптов для распределения нагрузки на основе загруженности (Bandwidth-based) канала.
Я попробовал оба варианта и оба нормально не заработали в 2017ом. (Возможно у кого то кривые руки...) В варианте от Стива трафик ходил преимущественно через первый канал, хотя в настройках mangle приоритет был выставлен для второго канала, путем дублирования правила.
В методе Томаса трафик вообще не переключался на второй канал. (Попробуйте может быть получится у вас.) Да и настройка по этим мануалам довольно сложная и требует ресурсов оборудования. Вобщем пробуя разные методы оказалось, что можно все сделать гораздо проще используя Nth метод, используя меньше правил и меньше нагружая CPU роутера.

Ок, приступим к настройке!
# Переименуем наши интерфейсы ether1 и lte1 на WAN1 и WAN2

# Настроим сети провайдеров:
/ip address add address=192.168.1.2/24 interface=WAN1 /ip address add address=192.168.8.2/24 interface=WAN2
# Настроим локальный интерфейс
/ip address add address=192.168.10.1/24 interface=LAN
#Настроим лист для локальных адресов
/ip firewall address-list add address=192.168.10.0/24 list=LAN
# Настроим NAT
/ip firewall nat add out-interface=WAN1 action=masquerade chain=srcnat /ip firewall nat add out-interface=WAN2 action=masquerade chain=srcnat
#Пометим каждый первый пакет из каждых двух на отсылку через WAN1, исключая UDP трафик
chain=prerouting action=mark-connection new-connection-mark=WAN1 protocol=!udp dst-address-type=!local src-address-list=LAN nth=2,1 passthrough=yes connection-state=new
#Пометим каждый второй пакет ,также исключая UDP трафик.
chain=prerouting action=mark-connection new-connection-mark=WAN2 protocol=!udp dst-address-type=!local src-address-list=LAN nth=2,2 passthrough=yes connection-state=new
#Ставим роут марку outWAN1 на помеченый трафик WAN1 и исключаем LAN адрес лист
chain=prerouting action=mark-routing new-routing-mark=WAN1 src-address-list=LAN dst-address-list=!LAN connection-mark=outWAN1 passthrough=yes
#Ставим роут марку outWAN2 на помеченый трафик WAN2 и исключаем LAN адрес лист
chain=prerouting action=mark-routing new-routing-mark=WAN2 src-address-list=LAN dst-address-list=!LAN connection-mark=WAN2 passthrough=yes
#Добавим default gateway в каждую из промаркированных для LAN трафика таблиц маршрутизации:
/ip route add distance=1 gateway=192.168.1.1 routing-mark=outWAN1 check-gateway=ping /ip route add distance=1 gateway=192.168.8.1 routing-mark=outWAN2 check-gateway=ping
#Настроим failover через второго провайдера если первый будет недоступен
/ip route add distance=2 gateway=192.168.8.1
Вот и всё.
Приоритезация трафика:
Если нужно настроить приоритет для второго канала то нужно добавить еще одно правило в mangle и изменить nth 2,1 2,2 на nth 3,1 3,2 3,3
chain=prerouting action=mark-connection new-connection-mark=WAN1 protocol=!udp dst-address-type=!local src-address-list=LAN nth=3,1 passthrough=yes connection-state=new chain=prerouting action=mark-connection new-connection-mark=WAN2 protocol=!udp dst-address-type=!local src-address-list=LAN nth=3,2 passthrough=yes connection-state=new chain=prerouting action=mark-connection new-connection-mark=WAN2 protocol=!udp dst-address-type=!local src-address-list=LAN nth=3,2 passthrough=yes connection-state=new
Outro:
Мы не создавали правила Mangle для входящих (input) и исходящих (output) соединений через тот же интерфейс как это было описано из статьи на хабре, так как на деле это работает плохо, в этом нет необходимости и больше правил требуют больше ресурсов.
В итоге суммарная скорость Интернет соединения складывается из скорости обоих провайдеров, что нам и требовалось получить.

Также из правил был исключен весь UDP трафик, так как видео потоки очень сильно начинают "тормозить", так как трафик идет через разные интерфейсы. Также мы исключили из правил трафик из списка адресов "LAN" в "LAN".
Бонусом ко всему мы настроили простейший Failover который проверяет доступность "пингуя" локальный шлюз. Можно настроить его на "пинг" внешнего ip, для более достоверной проверки состояния Интернет и отправлять уведомления в телеграм бот если один из каналов падает, но это уже "плюшки" и тема другой статьи.
P.S.
В этой статье описан частный эксперимент в реализации Load Balancing, который я нашел наиболее эффективным на данный момент. Эксперименты продолжаются...