ИТ-аутсорсинг от компании АйТиарт, полезные статьи
14.02.2019

Делим Интернет или 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 именем primer-connection-from и пакеты в этих подключениях именем primer-packet-from.


/ip firewall mangle add chain=prerouting dst-address=111.333.22.44 action=mark-connection new-connection-mark= primer-connection-up passthrough=yes/ip firewall mangle add chain=forward connection-mark= primer-connection-up action=mark-packet new-packet-mark= primer-packet-up passthrough=yes


/ip firewall mangle add chain=prerouting src-address=111.333.22.44 action=mark-connection new-connection-mark= primer-connection-from passthrough=yes

/ip firewall mangle add chain=forward connection-mark= primer-connection-from action=mark-packet new-packet-mark= primer-packet-from passthrough=yes


Затем создается два правила в Queue Trees для входящего и исходящего потоков

/queue tree add name=queue1 parent=global-out packet-mark= primer-packet limit-at=0
queue=default priority=1 max-limit=50000 burst-limit=0 burst-threshold=0
burst-time=0s /queue tree add name=queue2 parent=global-in packet-mark= primer-packet-from limit-at=0 queue=default priority=1 max-limit=50000 burst-limit=0 burst-threshold=0
burst-time=0s


Благодаря таким правилам приходящие и уходящие с адреса 111.333.22.44 пакеты направляются в приоритетные очереди и всегда имеют гарантированную скорость 50 Kbit/s. С помощью такой схемы, например, можно установить фиксированную гарантированную скорость для онлайн-игр, распределив пропускную способность в равной мере между всеми участниками сети.

Simple Queues

Очереди Simple Queues являются упрощенными, так как при их использовании не требуется применение помеченных пакетов из Firewall. Но и высокая гибкость в настройках теряется. Основными параметрами для создания правил здесь выступают адреса источника и получателя.

Можно выделить список основных возможностей простых очередей.

·         Возможность работы с Р2Р-трафиком.

·         Использование очередей для определенных временных интервалов.

·         Возможность задавать приоритеты потокам.

·         Использование в виде параметров нескольких цепочек пакетов, отмеченных в /ip firewall mangle.

·         Создание одного правила для исходящего и входящего потока.

 

Также в Simple Queues можно указывать параметр Parent, что позволяет строить иерархию классов почти такую же, как и в Queue Trees. Разница в том, что здесь используются адреса, а не пакеты и потоки. При этом Simple Queues всегда были и остаются частным случаем Queue Trees. А значит, при создании новых правил в простых очередях, следует проверять наличие подобных правил с теми же портами, адресами или другими параметрами в Queue Trees. При сходстве правил приоритет остается за Queue Trees и простые очереди не работают.

Когда вы приступаете к созданию правил в Simple Queues, помните, что есть исходящий и входящий трафик для клиентов, роутера и провайдера. Приведем схематически на рисунке направление потоков трафика от провайдера к роутеру, от роутера к клиенту и в обратную сторону. Получается, что исходящий трафик клиента является входящим для роутера и наоборот.


Ниже представлен список параметров для конфигурации простых очередей в Mikrototik: 
   burst-limit (целое) – максимальная burst-скорость;
   burst-threshold (целое) – средняя загрузка канала при которой разрешено выдать burst-limit;
   burst-time (время) – используется для подсчета средней загрузки канала;
   dst-address (IP адрес/маска) – адрес назначения;
   dst-netmask (netmask) – маска подсети для dst-address;
   interface (text) – интерфейс, для которого предназначается правило;
   limit-at (целое/целое) – гарантированный канал;
   max-limit (целое/целое) – максимальная величина канала;
   name (text) – имя правила;
   p2p (any | all-p2p | bit-torrent | blubster | direct-connect | edonkey | fasttrack | gnutella | soulseek | winmx) – тип P2P-трафика;
   packet-marks (name; по умолчанию: «») – цепочка пакетов, промаркированных в /ip firewall mangle;
   parent (name) – имя родительской очереди;
   priority (целое: 1..8) – приоритет. 1- больший, 8-самый маленький;
   queue (name/name; default: default/default) – имя очереди из /queue type;
   target-addresses (IP address/netmask) – исходный адрес;
   time (time-time,sat | fri | thu | wed | tue | mon | sun{+}; по умолчанию: «») – применить очередь к временному интервалу;
   total-burst-limit (целое) – максимальная burst скорость в очереди global-total;•    total-burst-threshold (целое) – средняя скорость в очереди global-total;
   total-burst-time (time) – используется для подсчета средней загрузки канала в очереди global-total;
   total-limit-at (целое) – гарантированная скорость в очереди global-total (входящий+исходящий каналы);
   total-max-limit (целое) – максимальная скорость передачи данных в очереди global-total.

Отметим, что наличие возможности управлять входящим и исходящим трафиком позволяет клиентам максимально эффективно использовать канал.

Примеры

Представим канал для клиента со скоростью 128/64 kbit/s, при гарантированной скорости 64/32 kbit/s в будние дни. А также канал со скоростью 512/256 kbit/s с гарантированной скоростью 128/128 kbit/s в выходные.

Результатом нашей работы будет два правила:

/queue simple add target-addresses=192.168.11.1/32 limit-at=64000/32000 max-limit=128000/64000 time=00:00:00-00:00:00,mon,tue,wed,thu,fri/queue simple add target-addresses=192.168.11.1/32 limit-at=128000/128000 max-limit=512000/256000 time=00:00:00-00:00:00,sat,sun

В паре 32000/32000 первая цифра отвечает за входящий канал для клиента, а вторая за исходящий. Если хотите обеспечить быстрое открытие страниц, добавляете burst-limit и burst-time.

Также возможно видоизменение данного правила с целью разделения указанной скоростью между всей сетью 192.168.11.0.24. В данной ситуации параметру queue необходимо указать тип очереди pcq-download, который приводился выше в примере с Queue Trees. 

Благодаря простым очередям легко можно реализовать предоставление на определенные адреса неограниченной скорости. Например, согласно следующему правилу клиент с адресом 192.168.11.1 получает на скорости от 1 до 2 мегабит доступ к адресу 88.205.221.123


/queue simple add target-addresses=192.168.11.1/32 dst-address=88.205.221.123 limit-at=1024000/1024000 max-limit=2048000/2048000


Если выделяется гарантированная пропускная способность для отдельного клиента, следует помнить о том, что сумма limit-at всех клиентов не может превышать значение пропускной способности всего канала.

Можно отметить наличие в Mikrotik встроенной возможности синхронизировать время с внешним источником, что актуально для случаев с неправильно установленными часами или севшей батарейкой на материнской плате.

Также нет возможности напрямую прописывать URI-адрес в поле ввода IP-адреса, хотя в этом появляется необходимость из-за наличия динамических адресов у сайтов. Данная проблема решается с помощью прописывания требуемого адреса ресурса в разделе /ip firewall address-list с присвоением ему имени, по которому в будущем можно обращаться.


Заключение

В Mikrotik реализованы большие возможности по управлению трафиком, что позволяет данной системе встать в один ряд с популярными аппаратными решениями от Cisco, а в чем-то даже превзойти их. Благодаря объединению Mikrotik и биллинга с поддержкой протокола Radius получается мощная система, которая может работать и в качестве раздающего интернет сервера внутри локальной сети, и в сети среднего провайдера. Благодаря описанным в статье возможностям шейпинга можно не только разделять доступ в интернет, но и создавать резервные каналы связи. Добавление беспроводных технологий RouterOS позволяет превратить несколько беспроводных сетевых карт и немного «железа» в мощную систему Wi-Fi, предоставляющую гарантированную полосу пропускания клиентам с разделением доступа.

Форма заказа звонка

Мы перезвоним и ответим
на все интересующие вас вопросы
  • Даю согласие на обработку
    персональных данных