Делим Интернет или QoS на Mikrotik
Делим Интернет или QoS на Mikrotik
Принцип деления есть во всем, что нас окружает. В большинстве случаев объекты делятся в равных пропорциях, ведь доставшаяся кому-то неравная часть может стать причиной недовольства остальных участников процесса. Это можно отнести и к современным информационным технологиям передачи данных, в которых также можно применять алгоритмы деления и не дать устройствам возможности взять больше дозволенного.
Самым ярким представителем информационных технологий в сфере передачи данных является интернет, который за последние годы для большинства людей превратился во что-то простое и обыденное, хотя поначалу был удивительным и редким. Далее мы расскажем, как организовать деление интернет канала в операционной системе RouterOS Mikrotik. В статье будет подробно рассказано о настройках данной системы, чтобы администраторы могли избежать ошибок и им легче было разобраться в алгоритмах работы.
Теоретические основы
Перед тем, как перейти к описанию практических случаев, рассмотрим теоретические основы технологии, ограничивающей скорость и качество доступа в интернет (шейпинга), а также важных понятий, которые пригодятся нам в дальнейшем.
Шейпер – алгоритм управления очередностью пакетов, позволяющий отсеивать пакеты, которые не удовлетворяют определенным условиям.
Schedulers – алгоритм для управления движением пакетов внутри шейпера. Его принцип действия основан на формировании очередей по приоритету пакетов, адресам источников и другим параметрам. PFIFO, BFIFO,SFQ, PCQ, RED как раз являются такими алгоритмами.
Подочередь – сформированная из пакетов по разным признакам очередь.
Queuing discipline (qdisc – дисциплина очереди) – алгоритм для захвата пакетов и определения точного порядка их передвижения.
HTB
Основой шейпинга в Mikrotik служит HTB – дисциплина очереди, которая реализована во многих Linux-системах. Важно изучить ее, чтобы умело управляться с данным алгоритмом.
Можно выделить основные возможности управления трафиком в Mikrotik, основанные на данной дисциплине.
Ограничение скорости по разным параметрам, включая порты, время суток, подсети, IP-адреса и другое.
Ограничение P2P-трафика с выставлением приоритетов одних потоков пакетов над другими.
Применение пиковых скоростей, что позволяет поддерживать быстрый WEB-браузинг.
Разделение канала на равные или неравные пропорции между пользователями.
Задание гарантированного показателя скорости потока.
В дисциплине HTB ключевым понятием является класс (правило). Схематический пример иерархии классов представлен на изображении ниже. В данном случае из файервола (Filter) поступают пакеты с данными, которые распределяются в локальные очереди (Self Feed) или отправляются в очереди родительских классов (Inner Feed), что зависит от приоритета, загрузки канала и параметров классов. Отметим, что обычно на нулевом уровне иерархии находятся классы , не имеющие дочерних правил, их можно назвать клиентами. Именно такими классами в первую очередь захватывается трафик, которые затем передается родительским классам. У двух или более классов с одним прямым родителем одинаковый уровень и подсоединение к одной локальной выходной очереди.
Схематическое изображение структуры HTB
У каждого из классов могут быть следующие параметры:
limit-at – гарантированная скорость;
max-limit – ограничение скорости;
priority – приоритет класса.
Также у них есть три разных состояния.
Зеленый, при котором верхней границей для пропускной способности правила является параметр limit-at и движение пакетов осуществляется согласно приоритетам сразу в выходной поток своего уровня, без движения вверх по иерархии.
Желтый, при котором у пропускной способности правила значение превышает limit-at, но находится ниже уровня max-limit. В данном случае выполняется отключение правила от выходного потока его уровня с подключением к родительскому классу.
Красный, при котором идет превышение значения пропускной способности правила в сравнении с параметром max-limit и отключение правила от родительского класса с подключением к локальной очереди.
Есть в Mikrotik еще и два типа правил, которые разнесены на различные закладки в утилите Winbox, позволяющей настраивать конфигурацию операционной системы из под Windows – Simple Queues и Queue Trees.
Про эти правила пойдет речь чуть позже, а сейчас приведем примеры работы НТВ с созданием нескольких правил.
[admin@MikroTik] queue tree> add name=ClassA parent=Local max-limit=2048000
[admin@MikroTik] queue tree> add name=ClassB parent=ClassA max-limit=1024000
[admin@MikroTik] queue tree> add name=Leaf1 parent=ClassA max-limit=2048000
… limit-at=1024000 packet-mark=packet_mark1 priority=8
[admin@MikroTik] queue tree> add name=Leaf2 parent=ClassB max-limit=1024000
… limit-at=256000 packet-mark=packet_mark2 priority=7
[admin@MikroTik] queue tree> add name=Leaf3 parent=ClassB max-limit=1024000
… limit-at=768000 packet-mark=packet_mark3 priority=8
[admin@MikroTik] queue tree> print
Flags: X – disabled, I – invalid
0 name=ClassA parent=Local packet-mark="" limit-at=0 queue=default
priority=8 max-limit=2048000 burst-limit=0 burst-threshold=0
burst-time=0s 1 name=ClassB parent=ClassA packet-mark="" limit-at=0 queue=default
priority=8 max-limit=1024000 burst-limit=0 burst-threshold=0
burst-time=0s
2 name=Leaf1 parent=ClassA packet-mark=packet_mark1 limit-at=1024000
queue=default priority=8 max-limit=2048000 burst-limit=0
burst-threshold=0 burst-time=0s
3 name=Leaf2 parent=ClassB packet-mark=packet_mark2 limit-at=256000
queue=default priority=7 max-limit=1024000 burst-limit=0
burst-threshold=0 burst-time=0s
4 name=Leaf3 parent=ClassB packet-mark=packet_mark3 limit-at=768000
queue=default priority=8 max-limit=1024000 burst-limit=0
burst-threshold=0 burst-time=0s
[admin@MikroTik] queue tree>
1. В первом случае передача данных клиентами 1 и 2 осуществляется с меньшей скоростью, чем значение параметра limit-at, а клиент 3 не работает. В этом случае пакеты с данными от клиентов 1 и 2 выстраиваются в локальную очередь по своим приоритетам, не передавая данные в родительские классы.
2. В данном случае при передаче данных клиентом leaf2 данные передаются с высшей скоростью в сравнении с limit-at, нос меньшей скоростью в сравнении с max-limit в его параметрах и меньше, чем параметр limit-at для родительского класса ClassB. У leaf1 передача данных осуществляется на скорости не выше собственного limit-at. В данной ситуации у leaf1 больший приоритет в сравнении с leaf2, несмотря на указание большего приоритета для последнего в параметрах. Дело в том, что при передаче данных с превышающей limit-at скоростью клиент 2 подключается к родительскому классу с приоритетом 8. В то же время действует правило, согласно которому приоритет пакетов на нижних уровнях при одинаковых условиях выше, чем на верхних.
3. В данном случае есть превышение скорости передачи данных клиента 1 в сравнении с допустимым max-limit, а у клиента 2 данные передаются со скоростью в диапазоне больше limit-at и меньше max-limit. У третьего клиента скорость передачи данных ниже значения limit-at. В такой ситуации получается, что ClassA перегружается данными от первого клиента, из-за чего у ClassB нет разрешения на передачу и работоспособным остается только третий клиент, который подключается к локальной очереди на нулевом уровне.
4. Возможен и такой вариант, когда данные одновременно передаются клиентами leaf1, leaf2, leaf3, ClassB становится желтым, а ClassA – зеленым. В такой ситуации первым в очереди на втором уровне по праву наибольшего приоритета становится leaf2. Для клиентов 1 и 3 при этом устанавливается случайный выбор, определяющий порядок следования.
Гибкость и универсальность алгоритма работы НТВ позволяют создавать на его основе любые иерархии правил с точным разграничением и управлением потоками данных.
Bursts
Не редки ситуации, когда требуется выдача пиковой скорости клиенту на заданный временной интервал. Либо необходимо с максимальной скоростью осуществлять отправку запросов и принимать данные. В таких случаях требуется защитить остальных пользователей от проблем в работе интернета, для чего в Mikrotik есть все необходимые инструменты.
burst-limit – параметр, задающий скорость, доступную сразу при подключении.
burst-threshold – показывает среднюю скорость за последние burst-time секунд;
burst-time – время, необходимое для подсчета burst-threshold.
С этими параметрами и, используя limit-at с max-limit, можно задать правила для выдачи клиенту максимальной скорости. Например, установим limit-at=128000/128000, max-limit=256000/256000, burst-limit=512000/512000, burst-treshold=192000/192000, burst-time=8 и понаблюдаем за графиком загрузки канала от одного клиента, который характерен для случаев с закачкой больших файлов по протоколу http.
После первой секунды показатель средней загрузки канала равен (0+0+0+0+0+0+0+512)/8=64 kbps, что не превышает параметр burst-threshold. После второй секунды средняя скорость будет равна (0+0+0+0+0+0+512+512)/8=128kbps. После третьей секунды показатель средней скорости уже выше burst-threshold, и она резко падает до max-limit, удерживаясь на этом уровне до достижения меньшего значения средней скорости загрузки канала в сравнении с параметром burst-threshold.
Как только это произойдет, burst снова выдается скорость.
Schedulers
Алгоритмы Schedulers обычно используются вместе с шейперами, но они так же могут обладать функциями ограничения скорости. По сути, Scheduler является предшественником шейпера, предоставляя ему уже подготовленную очередь из пакетов с заданием соответствующих ограничений.
PFIFO/BFIFO
Packet/Bytes (FIFO) – основанный на принципе первенства (первый пришел – первый ушел) алгоритм. Для его конфигурирования используется только один параметр pfifo-limit (bfifo-limit), указывающий на количество байт, допустимых для хранения в выходном буфере. Если пакеты в буфер не попали, они разрушаются. Ниже приведена графическая схема работы данного алгоритма.
SFQ
SFQ (Stochastic Fairness Queuing) –алгоритм для предоставления всем TCP/UDP-подключениям одинаковой возможность по передаче данных. Данный алгоритм применим для случаев с сильной загрузкой канала, когда необходимо предоставить приложениям одинаковые возможности по передаче данных. Но на практике он почти не используется, поэтому не будет рассматривать его подробно.
Есть еще и частный случай SFQ в виде алгоритма PCQ (Per Connection Queuing), который отвечает за формирование потоков в подочереди по заданным правилам. В теории, такой алгоритм мог бы равномерно распределять скорость между участниками, независимо от числа открытых подключений, разделяя пропускную способность в равных пропорциях между классами или клиентами, что дает возможность организации динамического шейпинга. Но эффективная реализация такого алгоритма именно с точки зрения динамического шейпинга пока еще не была придумана. Тем не менее, благодаря PCQ можно с помощью всего пары правил разделить в равных пропорциях и входящий, и исходящий канал.
RED (Random Early Detection) – алгоритм, предназначенный для выравнивания пропускной способности и сглаживания скачков с контролем среднего размера очереди. При достижении размера очереди значения red-min-threshold происходит удаление случайно выбранного пакета. Чем больше средний размер очереди, тем больше будет случайно удаленных пакетов. При достижении значения red-max-threshold происходит удаление всех пакетов. Такой алгоритм используется редко, а при UDP-трафике его применение крайне нежелательно, так как данные при передаче могут не доходить до адресата.
Практическое применение
Теоретическое введение закончено, теперь давайте перейдем к практике.
Для начала остановимся на особом типе очередей Queue Trees, с помощью которого можно выстраивать иерархию правил и управлять пакетами на самом низком уровне.
Рассмотрим основные элементы управления в Queue Trees:
burst-limit (целое) – параметр, отвечающий за максимальную burst-скорость;
burst-threshold (целое) – отвечающий за среднюю загрузка канала параметр, при котором разрешается выдавать burst-limit;
burst-time (время) – используемый для подсчета средней загрузки канала элемент;
flow (text) – поток, маркированный в /ip firewall mangle;
limit-at (целое) – значение гарантированной скорости;
max-limit (целое) – показатель максимальной скорости;
name (text) – имя очереди;
parent (text) – родитель в иерархии классов HTB;
priority (целое: 1..8) – приоритет очереди;
queue (text) – тип очереди. Задается в /queue type.
Примеры.
I. Создадим правило, по которому клиенты локальной или виртуальной сети подключаются к условному сайту www.test.ru с максимальной скоростью и минимальным временем отклика, при этом скорость делится между ними в равной мере.
1. Сначала помечаются все пакеты, идущие от пользователей на условный адрес сайта 11.222.33.44 и обратно, для чего необходимо создание 4 правил. Два из них будут помечать прямые и обратные подключения, а еще два будут помечать непосредственно пакеты в данных подключениях. Важно помнить, что очереди выстраиваются именно из пакетов, а не работают с помеченными подключениями. Поэтому, чтобы все заработало, правила должны выглядеть следующим образом:
/ip firewall mangle add chain=forward src-address=192.168.11.0/24 dst-address=11.222.33.44/32 action=mark-connection new-connection-mark=users-con-up
/ip firewall mangle add connection-mark=users-con-up action=mark-packet
new-packet-mark=users-up chain=forward
/ip firewall mangle add chain=forward src-address=11.222.33.44/32
action=mark-connection new-connection-mark=users-con-down
/ip firewall mangle add connection-mark=users-con-down action=mark-packet
new-packet-mark=users-down chain=forward
2. Затем создается два типа PCQ очередей, с классификацией по входящему и исходящему адресу:
/queue type add name=pcq-download kind=pcq pcq-classifier=dst-address
/queue type add name=pcq-upload kind=pcq pcq-classifier=src-address
3. После этого создаются очереди, отвечающие за входящий и исходящий трафик:
/queue tree add name=Download parent=Local max-limit=10240000 burst-limit=200000 burst-time=10
/queue tree add parent=Download queue=pcq-download packet-mark=users-down
/queue tree add name=Upload parent=Public max-limit=160000 burst-limit=200000 burst-time=10
/queue tree add parent=Upload queue=pcq-upload packet-mark=users-up
Из примера видно, что всего нескольких правил хватило для реализации столь сложной задачи, как динамический шейпинг для определенных адресов, которым предоставляется пиковая скорость. В большинстве случаев, на практике все происходит сложнее с большим числом сочетающихся между собой правил.
В Queue Trees, фактически, все действия выстраиваются на ограничении скорости, а адреса источников, порты, протоколы и другие параметры заносятся в раздел Mangle-фаервола. Этот способ позволяет обеспечить хороший пинг на определенные адреса даже в тех случаях, когда есть серьезная загрузка канала.
Приведем пример таких правил для условного сервера www.ptimer.ru.
В Firewall необходимо прописать четыре правила, в первом из которых именем primer-connection-up помечаются все подключения с адресом получателя 111.333.22.44. Второе правило помечает пакеты в подключениях primer-connection-up именем primer-packet.up. Также пометим все подключения с адресом источника 111.333.22.44 и