Дерево очередейИсточники:
Руководства:Очередь (Queue)Mikrotik-Qos Приоритезация по типу трафика и деление скоростиВозьму простой случай: локальная сеть небольшого предприятия.
30 рабочих мест в локалке, пять удалённых филиалов по L2TP, канал 6 МБита.
Откровенно говоря,
для работы шести мегабит должно хватать.
На деле канал сразу забивается каким-то HTTP-потоком на один компьютер.
И есть у меня сильное подозрение, что это всё таки котэ...
Мне нужно распределить весь поток по виду трафика, а полученные струи равномерно распределить между всеми компьютерами.
Микротик умеет различать 8 уровней важности очередей (priority=1...8).
Вышеозначенное руководство предлагает делать так:
- Флагманские сервисы (Priority=1)
- Пользовательские запросы (Priority=3)
- Коммуникационные сервисы (Priority=5)
- Сервисы закачек (Priority=7)
- Сервисы P2P (Priority=8)
Prior_Plan.png
Пойдём по порядку.
1. Флагманские сервисы (Priority=1): DNS, SSH, ICMP, Telnet, HTTP request.
Я позволил себе вычеркнуть HTTPS: четверть сайтов в интернете использует его вместо HTTP в том числе и для закачек. Не вижу причин придавать ему такую важность.
При всей своей важности, в обычном случае этого трафика не может быть много (если это не затопление). Полосы в 32 kbps на каждый компьютер будет достаточно.
2. Пользовательские запросы. В статье это различные он-лайн игры. Но статься написана для провайдера, раздающего интернет по квартирам. Я же говорю об офисе, где игры не в почёте.
Этот трафик я буду просто блокировать.
3. Коммуникационные сервисы (Priority=3): различная видео и голосовая связь (VoIP, Skype), а так же шифрованные туннели (VPN, HTTPS).
Объём здесь может быть изрядным, но давать больше 0,5 МБита на компьютер можно только если канал свободен:
limit-at=512kbps
max-limit=2Mbps
4. Сервисы закачек (Priority=5): HTTP download, FTP, SFTP. Они похожа на P2P тем, что даже один пользователь может с лёгкостью забить весь канал. Но есть и одно важное отличие: для пользователя они служат показателем отзывчивости. Скачивая файл в сети P2P вы даже не заметите, что скорость постоянно скачет, а иногда и вовсе замирает на несколько минут.
А вот нажав на ссылку вы хотите что бы желаемая страница открывалась мгновенно. Здесь нам и пригодится ведро.
Пусть файлы размером до 1 МБайта скачиваются на максимальной скорости, а всё, что больше - уже на малой, потихоньку:
limit-at=1Mbps
max-limit=2Mbps
burst-limit=2Mbps
burst-threshold=512kbps
burst-time=16s
5. Ну и, наконец, сервисы P2P (Priority=8). Тут всплески бессмысленны, а канал им нужно выдавать лишь при простое.
limit-at=0Mbps
max-limit=2Mbps
Начнём, помолясь...
Шаг 1. Выделение потоков.Код: Выделить всё
0 ;;; Mark input ROS connection
chain=input action=mark-connection new-connection-mark=ROS_conn passthrough=yes
1 ;;; Mark response ROS packets to Prio_3
chain=output action=mark-packet new-packet-mark=Prio_3 passthrough=no connection-mark=ROS_conn
2 ;;; Mark output connection
chain=output action=mark-connection new-connection-mark=out_conn passthrough=yes
3 ;;; Mark output packets to Prio_1
chain=output action=mark-packet new-packet-mark=Prio_1 passthrough=no connection-mark=out_conn
4 ;;; Mark HTTP downloads connection
chain=forward action=mark-connection new-connection-mark=http-dl_conn passthrough=yes protocol=tcp dst-port=80,443 connection-bytes=500000-0
5 ;;; Mark HTTP downloads packets to Prio_6
chain=forward action=mark-packet new-packet-mark=Prio_6 passthrough=no connection-mark=http-dl_conn
6 ;;; Mark HTTP connection
chain=forward action=mark-connection new-connection-mark=http_conn passthrough=yes protocol=tcp dst-port=80,443
7 ;;; Mark HTTP packets to Prio_5
chain=forward action=mark-packet new-packet-mark=Prio_5 passthrough=no connection-mark=http_conn
8 ;;; Mark SIP connection
chain=forward action=mark-connection new-connection-mark=SIP_conn passthrough=yes dst-address=81.88.86.11
9 ;;; Mark SIP packets to Prio_2
chain=forward action=mark-packet new-packet-mark=Prio_2 passthrough=no connection-mark=SIP_conn
10 ;;; Mark RDP connection
chain=forward action=mark-connection new-connection-mark=rdp_conn passthrough=yes protocol=tcp dst-port=3389
11 ;;; Mark RDP packets to Prio_4
chain=forward action=mark-packet new-packet-mark=Prio_4 passthrough=no connection-mark=rdp_conn
12 ;;; Mark FTP connection
chain=forward action=mark-connection new-connection-mark=ftp_conn passthrough=yes protocol=tcp dst-port=20-22
13 ;;; Mark FTP connection
chain=forward action=mark-connection new-connection-mark=ftp_conn passthrough=yes protocol=tcp connection-type=ftp
14 ;;; Mark FTP packets to Prio_6
chain=forward action=mark-packet new-packet-mark=Prio_6 passthrough=no connection-mark=ftp_conn
15 ;;; Mark all other connection
chain=forward action=mark-connection new-connection-mark=other_conn passthrough=yes
16 ;;; Mark all other packets to Prio_7
chain=forward action=mark-packet new-packet-mark=Prio_7 passthrough=yes connection-mark=other_conn
Теперь пояснения почему так и именно в этой последовательности.
Сначала разберусь с обращениями к самому Микротику. Я снаружи практически всё перекрыл фильтрами, поэтому могу уверенно сказать, что никакого мусорного трафика в цепочке Input у меня нет. Снаружи разрешены Winbox, SSH (на нестандартном порту), L2TP-подключения и ICMP для служебных надобностей.
Для локальной сети мой маршрутизатор является сервером времени и доменных имён (DNS и NTP по UDP). Фильтрами от локалки я не отгораживался, хотя в некоторых случаях это имеет смысл.
Это важные службы, требующие хорошей отзывчивости.
Код: Выделить всё
0 ;;; Mark input ROS connection
chain=input action=mark-connection new-connection-mark=ROS_conn passthrough=yes
1 ;;; Mark response ROS packets to Prio_3
chain=output action=mark-packet new-packet-mark=Prio_3 passthrough=no connection-mark=ROS_conn
Помечаем все входящие соединения на входе и маркируем их пакеты на выходе меткой "Prio_3".
Соединения я помечаю в Input, а пакеты в Output. Т.е. я помечаю именно
ответы на запросы.
Так же обратите внимание на passthrough=no. Эти пакеты не пойдут дальше по цепочке правил!
Теперь разберёмся с исходящими пакетами, которые не попали под предыдущее правило. Очевидно, что это пакеты, производимые самим маршрутизатором без внешнего побуждения.
Код: Выделить всё
2 ;;; Mark output connection
chain=output action=mark-connection new-connection-mark=out_conn passthrough=yes
3 ;;; Mark output packets to Prio_1
chain=output action=mark-packet new-packet-mark=Prio_1 passthrough=no connection-mark=out_conn
Как я уже сказал, маршрутизатор является сервером времени и имён. Поэтому время от времени обращается по своим надобностям к различным серверам в интернете. Как правило, это UDP 53 и 123. Но
таблице общеизвестных портов, это могут быть и TCP-порты. Так же маршрутизатор может сообщаться по ICMP, а в некоторых случаях и по другим протоколам. Поэтому я, не указывая явно протокол, снова выделяю ВСЕ исходящие соединения и следующим правилом помечаю их пакеты меткой "Proi_1". Да, маршрутизатор не будет генерить всякую ерунду. Это самые важные сообщения и именно от них зависит быстродействие всех прочих служб сети в целом.
Теперь займёмся потоками, проходящими сквозь маршрутизатор из локальной сети в интернет и обратно.
В первую голову выберем HTTP. Почему я начинаю именно с него?
Да по простой причине: это 90% всего трафика. Я не хочу что бы вся эта масса пакетов последовательно проходила всю длинную цепочку правил в Mangle!
Код: Выделить всё
4 ;;; Mark HTTP downloads connection
chain=forward action=mark-connection new-connection-mark=http-dl_conn passthrough=yes protocol=tcp dst-port=80,443 connection-bytes=500000-0
5 ;;; Mark HTTP downloads packets to Prio_6
chain=forward action=mark-packet new-packet-mark=Prio_6 passthrough=no connection-mark=http-dl_conn
6 ;;; Mark HTTP connection
chain=forward action=mark-connection new-connection-mark=http_conn passthrough=yes protocol=tcp dst-port=80,443
7 ;;; Mark HTTP packets to Prio_5
chain=forward action=mark-packet new-packet-mark=Prio_5 passthrough=no connection-mark=http_conn
Первыми двумя правилами я выделяю поток HTTP-download (загрузки файлов по HTTP). Отличительным признаком этих пакетов является connection-bytes=500000-0 (подробности
здесь).
Те пакеты, что не попали под это правило идут дальше и вылавливаются по признаку лишь порта назначения. Соответственно, и обращение с этими двумя потоками будет разным.
Опять же, благодаря passthrough=no эти пакеты не побегут дальше по цепочке правил.
Теперь то, ради чего я всё это затевал: SIP!
Код: Выделить всё
8 ;;; Mark SIP connection
chain=forward action=mark-connection new-connection-mark=SIP_conn passthrough=yes dst-address=81.88.86.11
9 ;;; Mark SIP packets to Prio_2
chain=forward action=mark-packet new-packet-mark=Prio_2 passthrough=no connection-mark=SIP_conn
Ему я даю метку "Prio_2".
RDP:
10 ;;; Mark RDP connection
chain=forward action=mark-connection new-connection-mark=rdp_conn passthrough=yes protocol=tcp dst-port=3389
11 ;;; Mark RDP packets to Prio_4
chain=forward action=mark-packet new-packet-mark=Prio_4 passthrough=no connection-mark=rdp_conn
Без комментариев.
FTP я выделяю двумя способами:
Код: Выделить всё
12 ;;; Mark FTP connection
chain=forward action=mark-connection new-connection-mark=ftp_conn passthrough=yes protocol=tcp dst-port=20-22
13 ;;; Mark FTP connection
chain=forward action=mark-connection new-connection-mark=ftp_conn passthrough=yes protocol=tcp connection-type=ftp
14 ;;; Mark FTP packets to Prio_6
chain=forward action=mark-packet new-packet-mark=Prio_6 passthrough=no connection-mark=ftp_conn
Что любопытно: по признаку connection-type трафика помечается в разы больше, чем по порту назначения. А вот в случае с SIP-протоколом этот способ вообще не сработал...
В завершение помечаем трафик не учтённый предыдущими правилами:
15 ;;; Mark all other connection
chain=forward action=mark-connection new-connection-mark=other_conn passthrough=yes
16 ;;; Mark all other packets to Prio_7
chain=forward action=mark-packet new-packet-mark=Prio_7 passthrough=yes connection-mark=other_conn
Надо сказать, что на боевом маршрутизаторе таких соединений я наблюдаю совсем не много (можно сосчитать по пальцам на одной руке). Значит, всё правильно сделал
Да, есть ещё восьмой приоритет. Его я приберёг для P2P. Но поскольку в данном случае сказка сказывается об офисном маршрутизаторе, с P2P я поступил просто:
Код: Выделить всё
/ip firewall filter add action=drop chain=forward comment="Drop P2P" p2p=all-p2p
В противном случае я поставил бы его даже перед HTTP!