Главная » Хабрахабр » Гайд по Simple Queues в Mikrotik

Гайд по Simple Queues в Mikrotik

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

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

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

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

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

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

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

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

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

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

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

Simple Queues на Packet Flow

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/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 — время.

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

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

Правило Burst:

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

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

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

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

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

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

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

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

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

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

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

/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, подсеть, интерфейс.

/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, подстроить под свой канал) одним пользователем.

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

#Очереди
/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 потоков сейчас в очереди.

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

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

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

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

Правило в Simple Queue:

#Заполнение списка адресов
/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) метками.

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

/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:

/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, просто поставьте правило перед каскадом очередей.

Послесловие

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

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


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

В России приступили к тестированию отечественного нейроинтерфейса «Нейрочат»

Эта система предназначена для пациентов с ограниченными физическими способностями. В конце прошлого года компания Neurotrand разработала вместе с партнерами программно-аппаратный комплекс с нейрогарнитурой. Это могут быть пациенты клиник, перенесшие инсульт, военные с тяжелыми ранениями, люди, получившие травму на производстве. Она ...

Зрители не могут отличить нативную картинку 4K от интерполяции

Такие выводы можно сделать из результатов российского исследования, проведённого холдингом «Ромир». Человеческого зрения недостаточно, чтобы отличить настоящее видео 4K от картинки, которую получили из изображения HDTV с помощью интерполяции. Опрошенным показывали на телеэкране фрагменты двух видеороликов и спрашивали о восприятии ...