Гайд по Simple Queues в Mikrotik

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

Упрощенные очереди — механизм деления пропускной способности канала и приоритеризации трафика привязанный к определенной цели (target). Входящий и исходящий трафик рассчитывается относительно цели.

Есть три варианта целей: ip, подсеть, интерфейс. Можно добавить несколько target для одного правила.


Теоретическая часть


Шейперы, Планировщики и Очереди

Скорость передачи данных измеряется в отношении переданной информации в битах за секунду времени — bit/sec. Бит единица небольшая, поэтому используют приставки кило (kbit/sec), мега (Mbit/sec), гига (Gbit/sec).

Скорость передачи пакетов по сетям связи всегда равна скорости передачи среды (например 100Mbit/sec для Ethernet 100BASE-TX). Если необходимо данную скорость уменьшить, то промежуточное устройство, например маршрутизатор, получая пакеты с одного интерфейса на максимальной скорости отправляет их с другого с определенной задержкой, если пакеты превышают установленный лимит скорости, они хранятся в очереди и отправляются по принципу First In, First Out (FIFO), если очередь заполнена (отсутствует или имеет нулевой размер), роутер отбрасывает пакеты.

Лимит (Limit) — административное ограничение скорости для трафика исходящего с интерфейса.
Шейпер (Shaper) — программный алгоритм задерживающий и отбрасывающий лишние пакеты.
Планировщик (Sheduler) — алгоритм, который решает каким образом хранить и отправлять пакеты выходящие за рамки лимита.
Очереди (Queues) — алгоритмы хранения и приоритизации для проходящего трафика.

Графические примеры работы шейпера и планировщика.

Использование шейпера без очереди

rk608_lhdbfv_zstsgrk0t_6rpq.png

Использование шейпера с планировщиком

lnryimsagc89acaf3pgjy9qollk.png


Simple Queues на Packet Flow

Simple Queues идут после Queues Tree, иногда простые очереди используют для быстрого ограничения трафика одному (или нескольким) пользователям, без вмешательства в Queues Tree.


Упрощенный Packet Flow для интересующихся

9kykvrkaxqkpncv_hjsqc3i9ssg.png


Механика работы очередей: none, pfifo, pcq

none — очередь отсутствует, при превышении лимита все новые пакеты отбрасываются.

pfifo — алгоритм fifo ориентированный на пакеты. Хранит указанное в настройках число пакетов. Используется по умолчанию в Simple Queues.

o-afgv9hsemh5ekrhrloakgatnm.png

pcq (Per Connection Queuing) — весь трафик разбивается на под-очереди в зависимости от набора условий. Из каждой под-очереди поочередно отправляется часть трафика. Освободившееся место занимает вновь прибывший трафик. Если место в под-очереди заканчивается, то пакеты предназначенные для нее отбрасываются.

0jya2iixjm_adtvot6x5cuoa00u.png

Рассмотрим небольшую часть настроек:
Rate: лимит скорости для каждой из под-очередей.
Limit: размер под-очереди в килобайтах.
Total limit: суммарный размер всех под-очередей в килобайтах.
Соотношение Limit/Total limit подбирается исходя из ситуации. По умолчанию 40 очередей (2000/50), при условии их максимального заполнения трафиком.
Burst: про него будет ниже.
Classifier: на основе чего разделять трафик по очередям.
Классификатор делить по очередям различные соединения (connections), если зайти [IP]→[Firewall]→[Connections], то можно отметить что большинство из соединений содержит адрес и порт получателя (src. address, src. port) и отправителя (dst. address, dst. port).

Мы обсуждаем простые очереди, так что для простоты будем считать что фильтруем только трафик исходящий с wan интерфейса, в таком случае относительно target исходящий (upload) трафик будет классифицироваться по src. address, а входящий (download) по dst. address.

Классификация по порту поможет избежать ситуации с забиванием очереди трафиком от одного приложения, если одно приложение плодит множество исходящий соединений (например torrent или web. browser с кучей вкладок), то у них будет отличаться src. port и трафик так же будет разбить по очередям.


Динамический шейпинг средствами PCQ

Если Rate задан жестко, то каждый под-поток будет иметь заданную скорость и не сможет ее превысить, пока суммарная скорость всех под-потоков не превысит вышестоящее ограничении (в Simple Queues это Total Limit), в таком случае скорость всех под-потоков будет уменьшаться пропорционально.

k8z4rbxttud1n5yzgb0iapcpvom.png

Если Rate задан как 0, то вышестоящее ограничение будет делиться между всеми под-потоками. Фактически это и есть динамический шейпинг.

g-igrm9quokfmrvbmot1fh5_g5e.png

Если Rate задан как 0 и не указан Total Limit для Simple Queues, то скорость между под-потоками будет делиться исходя из более вышестоящего лимита, если очереди не вложены, то это ограничение физического интерфейса. Если ваш тарифный план ниже, то часть трафика будет зарезаться на оборудовании провайдера и пользы от очередей не будет.

0kumi7g7yykezh0v0jlkcp3dd8u.png

У оставшихся типов очередей (SFQ, RED) есть свои особенности и сферы применения и их можно использовать в том числе для Simple Queues, но сейчас они нас не интересуют.


Маркировка пакетов

Да, в простых очередях можно использовать маркированный трафик. Это не обязательное условие (в отличии от Queue Tree), но позволяет отойти от ограничений target.

Маркировка трафика происходит в [IP]→[Firewall]→[Mangle], всего существует три типа меток: Connection, Packet, Route. Каждый пакет может содержать по одной метке каждого типа. Попадая в mangle, пакет проходит поочередно по всем правилам, если встречается два плавила устанавливающее метку, то более нижнее правило перезапишет метку от более верхнего. Для предотвращения перезаписи можно в первом правиле отключить прохождение пакета ниже по цепочке (passtrought=no).

При настройке очередей можно использовать только метки пакетов (action=mark-packet). Но для повышения производительности (метки соединений проверяются быстрее, чем изучение условий в каждом из пакетов) рекомендуется сначала маркировать соединения (action=mark-connection), а потом пакеты в данном соединении (action=mark-package). Правило с предварительной маркировкой соединений не всегда верно, но если вы дошли до этого понимания при построении очередей, то вам пора использовать Queue Tree.

Маркировать транзитный трафик можно в любой из цепочек Packet Flow, но в большинстве случаев я предпочитаю использовать forward, т.к. на данном этапе известны адреса получателя с отправителем и имена входящего и исходящего интерфейсов.


Пример маркировки трафика

4pfkkkzdf7nrl0eew8x7ckapnas.png

/ip firewall mangle 
add action=mark-connection chain=forward connection-state=new dst-port=5060,10000-20000 new-connection-mark=output-sip-and-rtp passthrough=yes protocol=udp src-address=192.168.100.0/24
add action=mark-packet chain=forward connection-mark=output-sip-and-rtp new-packet-mark=output-packet-sip-and-rtp passthrough=no


Что такое Burst

Обычно под ограничением скорости понимается некое статическое значение лимита в секунду при достижения которого пакеты отбрасываются или ставятся в очередь. Burst оперирует средним значением за единицу времени, это дает возможность использовать более высокие (пиковые) скорости в короткие промежутки времени и ограничивает скорость при постоянной нагрузке на канал.

Max Limit — основное ограничение.
Burst Limit — пиковая скорость, имеет приоритет над Max Limit при соблюдении заданной средней скорости.
Burst Threshold — скорость срабатывания ограничения.
Burst Time — время.

Target получает скорость из Burst Limit, но каждую секунду будет высчитываться средняя скорость за Burst time. Если средняя скорость за заданное время превысит Burst Threshold, то пользователь будет ограничен до Max Limit, если средняя скорость вернется в норму, то target опять получит Burst Limit.


Наглядный пример работы Burst

Правило Burst:

x8e6krcahevnrpazzw3eo1rlrv8.png

Блок-схема отображающая изменение скорости target:

ssu8_i_b8z-kbg9etldtnkzu9ga.png

И как выглядит изменение скорости у target:

avkzjbsh7wfduzsflatk8fqutqc.png

Если вас заинтересовала тема Burst, то рекомендую почитать информацию на wiki, там есть графики и таблицы исходя из которых станет лучше понятно как значения Threshold и Time влияют на ограничение скорости.


Различие Limit at и Max Limit

iin7jhchctr21e2n5i1jenft-my.png

Limit at — гарантированная скорость для правила. Желательно, что-бы сумма всех Limit at не превышала пропускную способность канала. Всегда меньше максимального.
Max Limit — максимальная скорость для правила. Если «бюджет» очереди позволяет, то будет выделена максимальная пропускная способность.

Обычно в упрощенных очередях указывают только Max Limit и работает это нормально, но в конфигурации с каскадными очередями следует указать оба лимита.


Практическая часть

Простые очереди настраиваются в [Queues]→[Simple Queues].
Правила обрабатываются поочередно сверху-вниз, к проходящему пакету применяется первое подходящее правило. Фактически из любого правила можно сделать «исключение» поместив более конкретное правило выше.


Ограничение скорости для конкретного хоста/подсети/интерфейса

Обычно используется когда надо зарезать скорость конкретному пользователю.
Name: любое имя
Target: адрес, подсеть или интерфейс.
Target Upload: лимит исходящей скорости.
Targer Download: лимит входящей скорости.

Ограничение скорости до 1Mbit/sec:

rj0ldymsyrl-ulstludlvz6uhty.png

/queue simple
add max-limit=1M/1M name=Limit-For-100.200 queue=default/default target=192.168.100.200/32

В Statistics можно посмотреть на текущую скорость для target, число пакетов в очереди и число отброшенных пакетов.


Ограничение скорости для удаленного ресурса

Вариант без маркировки пакетов.

В поле dst аналогично target могут быть указаны: ip, подсеть, интерфейс. В условиях современного интернета этого мало, но может пригодиться для небольших компаний и ограничения скорости между офисами.

jofiteubgejsubajjte9e26smj0.png

/queue simple
add dst=192.168.200.10/32 max-limit=10M/10M name=Limit-For-Fileserver target=192.168.100.0/24


Равноценное деление канала между участниками подсети (pcq)

Одно правило, которое спасет вашу домашнюю или офисную подсеть от монопольного захвата канала (в примере 50Mb/sec, подстроить под свой канал) одним пользователем.

w_nlmgmsen5nlddzajhh1jm3v0y.png

Указанные pcq очереди присутствуют в базовой конфигурации, но прикладываю скриншоты, на случай изменений.

kixk-svzxxq8i3c7ekpzj_tynyc.png

#Очереди
/queue type
add kind=pcq name=pcq-upload-default pcq-burst-rate=0 pcq-burst-threshold=0 pcq-burst-time=10s pcq-classifier=src-address pcq-dst-address-mask=32 pcq-dst-address6-mask=128 pcq-limit=50KiB pcq-rate=0 pcq-src-address-mask=32 pcq-src-address6-mask=128 pcq-total-limit=2000KiB
add kind=pcq name=pcq-download-default pcq-burst-rate=0 pcq-burst-threshold=0 pcq-burst-time=10s pcq-classifier=dst-address pcq-dst-address-mask=32 pcq-dst-address6-mask=128 pcq-limit=50KiB pcq-rate=0 pcq-src-address-mask=32 pcq-src-address6-mask=128 pcq-total-limit=2000KiB

#Правило Simple queues
/queue simple
add max-limit=50M/50M name=Limit-Equivalent queue=pcq-upload-default/pcq-download-default target=192.168.100.0/24

На вкладке Statistics можно посмотреть сколько pcq потоков сейчас в очереди.

yz8svfgkm1oz-veqdsihxt0t_lq.png


Маркированный трафик

Опция dst довольно ограничена и если хочется использовать доменные имена, либо списки адресов то придется прибегнуть к маркировке трафика. Например отменим ограничения для домена yandex.ru (да, там подключена куча cnd’ок и прочего и для нормальной работы потребуется добавить и их).

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

sq3hztxzt1qzmwfjeejb4seuzog.png

Маркировка http/https трафика (соединение и пакеты в соединении) для указанных адресов:

xv9e8ijrdum_l0owpnkri2mehs8.png

njhhxx9sgajhbqk2qixgosht3oi.png

z_hnxipzr3mhe3khsehfnb7l_gc.png

Правило в Simple Queue:

pk2pjxppbsgbxgcpblnvppzuv7k.png

#Заполнение списка адресов
/ip firewall address-list
add address=yandex.ru list=ForQueues
add address=yastatic.net list=ForQueues

#Маркировка соединений и пакетов
/ip firewall mangle 
add action=mark-connection chain=forward connection-state=new dst-address-list=ForQueues dst-port=80,443 new-connection-mark=Mark-ForQueues passthrough=yes protocol=tcp src-address=192.168.100.0/24
add action=mark-packet chain=forward connection-mark=Mark-ForQueues new-packet-mark=Mark-Packet-ForQueues passthrough=no

#Правило в Simple Queue
/queue simple
add max-limit=1M/1M name=Limit-For-Yandex packet-marks=Mark-Packet-ForQueues target=192.168.100.0/24


Каскадные очереди

Все что сказано выше относится к ограничению и делению скорости между участниками сети, пришло время затронуть тему приоретизации трафика. Обычно она требуется для интерактивного трафика (voip, vcs, ssh, rdp, …) в условиях ограниченного и загруженного канала.

За каскадные очереди отвечает параметр Parent, который ссылается на «родительскую» очередь. Для работы весь трафик из «дочерних» очередей должен захватываться родительской.

Параметр Priority отвечает за то какой трафик будет раньше добавлен в очередь, он работает только в дочерних очередях (либо в «родительских», если у них нет «дочерних»), может принимать значения от 1 (наивысший приоритет) до 8 и не имеет ничего общего с QoS (DSCP; TOS) метками.

Предварительная маркировка трафика:

3qajwjqsgfsk2rjyttjox_puw_q.png

/ip firewall mangle
add action=mark-connection chain=forward connection-state=related,new dst-port=5060,10000-20000 in-interface=br-lan new-connection-mark=mark-conn-voip passthrough=yes protocol=udp
add action=mark-packet chain=forward connection-mark=mark-conn-voip new-packet-mark=mark-pkg-voip passthrough=no
add action=mark-connection chain=forward connection-state=new dst-port=80,443 in-interface=br-lan new-connection-mark=mark-conn-web passthrough=yes protocol=tcp

Очереди в SimpleQueue:

__npf0bat-c1n1qzxtthgufnwnw.png

z61hktl_myep7moyk_l4tl4umji.png

puuuosqryi6zu8_userqrvlse50.png

otrcdvd-qjwvsk7gettmlv-1qma.png

0tgggaclbuc1ar18coyvqkffplg.png

/queue simple
add limit-at=24M/24M max-limit=25M/25M name=main target=10.10.10.0/24

add limit-at=5M/5M max-limit=8M/8M name=voip packet-marks=mark-pkg-voip parent=main priority=1/1 queue=pcq-upload-default/pcq-download-default target=""

add limit-at=10M/10M max-limit=20M/20M name=web packet-marks=mark-pkg-web parent=main priority=2/2 queue=pcq-upload-default/pcq-download-default target=""

add limit-at=10M/10M max-limit=20M/20M name=other packet-marks=mark-pkg-other parent=main priority=3/3 queue=pcq-upload-default/pcq-download-default target=""

Теперь, если понадобиться сделать ограничение для одного IP, просто поставьте правило перед каскадом очередей.


Послесловие

Simple Queues — это довольно интересный и функциональный инструмент для домашних и SOHO конфигураций, одним правилом (не прибегая к маркировке трафика) можно решить проблему с захватом канала одним устройством. Но, если вы используете FastTrack, то забудьте про очереди — трафик пойдет мимо них.

Для более сложных конфигураций есть Queues tree (деревья HTB).

© Habrahabr.ru