Сегодня мы с вами попробуем поговорить о настройке Load Balancing (балансировки нагрузки) в Mikrotik. Как вы уже знаете по предыдущим постам у меня есть "подопытный" Mikrotik 951G-2HnD, который я и "кручу" в разных конфигурациях. Сегодня мне привалило счастье в виде второго канала в 100 Mbit от Билайн за 1 руб. в месяц (для тех кто не в курсе новая линейка мобильных тарифов "Всё" в некоторых регионах подразумевает подключение домашнего интернета и ТВ за 1 руб., т.е. к примеру, если вы или кто-либо из ваших родственников, как было в моем случае, пользуется тарифом "Всё за 800", то доплатив всего-лишь 1 руб. к "телефонному тарифу" вы получаете "бесплатный интернет" и ТВ) ... глупо было не воспользоваться подобным предложением - т.к. второй высокоскоростной канал в интернет за 1 руб. вещь достаточно полезная. Ну например, можно легко настроить failover, т.е. вариант, когда основной канал в интернет по каким-либо причинам недоступен, а весь траффик идет по второму каналу, или же, load balancing (балансировку нагрузки), когда вы сами выбираете что и через какой канал у вас идет. Таким образом мы имеем двух провайдеров - Ростелеком, который предоставляет доступ в интернет через PPPoE и Билайн, который использует L2TP соответственно.
Прежде чем я буду рассказывать о том что у меня получилось и как - приведу несколько полезных ссылок, которые помогли мне в процессе экпериментов:
Прежде чем я буду рассказывать о том что у меня получилось и как - приведу несколько полезных ссылок, которые помогли мне в процессе экпериментов:
- Mikrotik. Failover. Load Balancing - статья иллюстрирующая различные конфигурации построение failover и load balancing на Mikrotik. На всякий случай оффлайн-версия ее же в формате PDF.
- Официальный мануал Mikrotik по PCC (per-connection-classifier) в котором наглядно показано как можно делить трафик между двумя подключениями.
Для меня был интересен вариант настройки Load Balancing, в котором пропускная способность обоих каналов суммировалась бы при использовании торрент-клиента. Т.е. говоря проще, я решил сделать "торрентокачалку" на 200 Mbit ;) Зачем? Это скорее риторический вопрос, раз есть резервный канал в интернет на 100 Mbit - неплохо было бы использовать его мощность на 100%. Получилось у меня примерно следующее:
Как видно из скриншотов - суммарная скорость при скачивании популярных раздач на торренте оказалась около 14.2 Mb/sec, т.е. 137,8 Mbit (показаны мгновенные значения скоростей). При этом весь входящий трафик автоматически "поделился" между Билайн (bee-internet) и Ростелеком (dml-internet) в соотношении ~70.5 Mbps и 67.3 Mbps. При этом загрузка CPU у Mikrotik'а составила ~100% :( Именно по этой причине не удалось выжать из приведенной конфигурации больше 140 Mbit. Здесь также следует учитывать и множество других факторов, например, то что оба провайдера предоставляют подключение на скорости до 100 Mbit, т.е. никто не гарантирует "честную сотню", исходящую скорость источников трафика и т.п.
Как оказалось впоследствии, причиной такой нагрузки на CPU были вовсе не правила PCC, а нагрузка из-за L2TP туннеля. Т.е. если оставить одно подключение к Билайну через L2TP и загрузить канал на 100% - то загрузка CPU также возрастает до 100%. Буквально перед тем как написать эти строки я наткнулся на информацию об обновлении Mikrotik 6.35 (2016-Apr-14 12:55), в котором одним из нововведений отмечался fastpath для l2tp туннелей: "implemented l2tp and lns fastpath/fasttrack support", однако, протестировать эту возможность я пока не успел. Итак, получившаяся у меня конфигурация (здесь я буду рассматривать только те правила, которые касаются непосредственно PCC, рассматривать как поднимать соединение с L2TP и PPPoE мы не будем):
# настройка правил PCC в Firewall'е
/ip firewall mangle
# помечаем пришедшие соединения согласно интерфейсу
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=dml-internet new-connection-mark=conn_Rostelecom
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=bee-internet new-connection-mark=conn_Beeline
# помечаем соедиенния на 80,443,110,25 TCP порты, как относящиеся к Билайну (т.е. веб-серфинг и почта только через Билайн)
add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-type=!local dst-port=80,443,110,25 in-interface=bridge new-connection-mark=conn_Beeline protocol=tcp
# непосредственно PCC
add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-type=!local in-interface=bridge new-connection-mark=conn_Rostelecom per-connection-classifier=both-addresses:2/0
add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-type=!local in-interface=bridge new-connection-mark=conn_Beeline per-connection-classifier=both-addresses:2/1
# назначаем routing mark согласно меткам соединений
add action=mark-routing chain=prerouting connection-mark=conn_Rostelecom in-interface=bridge new-routing-mark=rout_Rostelecom
add action=mark-routing chain=prerouting connection-mark=conn_Beeline in-interface=bridge new-routing-mark=rout_Beeline
# таблица маршрутизации
/ip route
add distance=1 gateway=bee-internet routing-mark=rout_Beeline
add distance=1 gateway=dml-internet routing-mark=rout_Rostelecom
add distance=1 gateway=dml-internet,bee-internet routing-mark=rout_Mixed
# обязательно должен быть маршрут по-умолчанию без меток, в данном случае ECMP
add distance=1 gateway=dml-internet,bee-internet
При этом оба соединения и L2TP (bee-internet), и PPPoE (dml-internet) у меня созданы с галкой Add default route и Default Route Distance 3, т.е. в итоге таблица маршрутизации у меня выглядит следующим образом при двух поднятых соединениях:
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, B - blackhole, U - unreachable, P - prohibit
Т.е. автоматически добавленные маршруты по-умолчанию и для того, и для другого соединения у нас имеют Distance - 3, и за счет того что мы прописали свой маршрут по-умолчанию на для немаркированных пакетов на основе ECMP с Distance - 1 - они неактивны. Как видно, в таблице маршрутов напротив автоматически созданных маршрутов стоят флаги DS и не стоит A.
Таким образом мы получаем следующее, соединения которые у нас промаркированы как conn_Rostelecom получают метку маршрута rout_Rostelecom и уходят через соединение dml-internet, а соединения промаркированные как conn_Beeline получают метку маршрута rout_Beeline и уходят через интерфейс bee-internet. Соединения не имеющие метки не получают никакую метку маршрута и уходят согласно активному маршруту по-умолчанию без меток.
Продолжение следует ...