Как такое может быть? Ограничение ширины канала по определенным IP-адресам при скачке за определенный промежуток времени.
Для тех, кто хочет подробнее узнать об этом или вовсе новичок, увидевший возможное решение своей проблемы, добро пожаловать под кат.
В просторах сети было найдено множество статей на подобную тематику, только все они предлагали распределение скорости между пользователями по приоритету (интернет-страницы с высоким, потоковое видео ниже и самый низкий приоритет у p2p-систем).
Итак, для начала теория. Провайдер отслеживает все «скачки» скорости и количество обращений к ресурсам, выдавая ограничение на превышающие их показатели предел. Узнать его не получится — это закрытая информация провайдера. Но как же скачивать и заливать по 1к+ файлов в облако, не получая за это временный «бан» на доступ к ресурсу? Легко!
Алгоритм действий будет таков:
- Создаем список IP-адресов, для которых нужно включить ограничение скорости;
- Организовать маркировку пакетов, идущих на и с ресурсов списка;
- Задать ограничение скорости по требуемым ресурсам при помощи очередей.
Приступим к настройке
Шаг 1. Добавим IP-адреса ресурса(ов) в список. Для этого зайдем на вкладку "Address Lists" окна "Firewall"
Я пользуюсь облачным хранилищем Mega.nz и пул их IP-адресов будет:
- 31.216.144.0/24
- 31.216.145.0/24
- 31.216.147.0/24
- 89.44.168.0/24
- 154.53.224.0/24
- 154.53.225.0/24
Добавим все подсети адресов в лист с именем, например, "mega.nz".
/ip firewall address-list
add address=31.216.144.0/24 list=mega.nz
add address=31.216.145.0/24 list=mega.nz
add address=31.216.147.0/24 list=mega.nz
add address=89.44.168.0/24 list=mega.nz
add address=154.53.224.0/24 list=mega.nz
add address=154.53.225.0/24 list=mega.nz
Шаг 2. Маркировка пакетов
После этого перейдем во вкладку "Mangle" и добавим правила маркировки пакетов. Для этого жмем на «плюс» и указываем следующие параметры:
MEGA-upload:
- Comment — MEGA-upload.
- chain — forward.
- Out. Interface — интерфейс, на котором висит Инет. В моем случае это «eth1-Wi-Fi».
- Dst. Address List — mega.nz — это имя того самого набора адресных листов с прошлого шага.
- Action — mark packet.
- New Packet Mark — MEGA-upload.
- Passthrought — true.
/ip firewall mangle
add action=mark-packet chain=forward comment=MEGA-upload out-interface=eth1-Wi-Fi new-packet-mark=MEGA-upload passthrough=yes dst-address-list=mega.nz
MEGA-download:
- Comment — MEGA-download.
- chain — forward.
- In. Interface — интерфейс, на котором висит Инет. В моем случае это «eth1-Wi-Fi».
- Src Address List — mega.nz — это имя того самого набора адресных листов с прошлого шага.
- Action — mark packet.
- New Packet Mark — MEGA-download.
- Passthrough — true.
/ip firewall mangle
add action=mark-packet chain=forward comment=MEGA-download in-interface=eth1-Wi-Fi new-packet-mark=MEGA-download passthrough=yes src-address-list=mega.nz
Шаг 3. Добавление правил очередей (Queues)
Далее, переходим во вкладку "Queue Tree" и также добавляем два новых правила:
MEGA-upload:
- Name — MEGA-upload
- Parent — global
- Packet Marks — MEGA-upload (выбираем из списка)
- Queue Type — default-small
- Priority — 8
- Bucket Size — 0.100
- Max Limit — 25M
/queue tree
add max-limit=25M name=MEGA-upload packet-mark=MEGA-upload parent=global queue=default-small
MEGA-download:
- Name — MEGA-download
- Parent — global
- Packet Marks — MEGA-download (выбираем из списка)
- Queue Type — default-small
- Priority — 8
- Bucket Size — 0.100
- Max Limit — 25M
/queue tree
add max-limit=25M name=MEGA-download packet-mark=MEGA-download parent=global queue=default-small
Всё. Теперь при синхронизации облачного хранилища на вход и выход скорость не поднимется больше 25 Мбит/с и, тем самым, устранили вероятность получения временного бана от провайдера.
/ip firewall address-list
add address=31.216.144.0/24 list=mega.nz
add address=31.216.145.0/24 list=mega.nz
add address=31.216.147.0/24 list=mega.nz
add address=89.44.168.0/24 list=mega.nz
add address=154.53.224.0/24 list=mega.nz
add address=154.53.225.0/24 list=mega.nz
/ip firewall mangle
add action=mark-packet chain=forward comment=MEGA-upload out-interface=eth1-Wi-Fi new-packet-mark=MEGA-upload passthrough=yes dst-address-list=mega.nz
add action=mark-packet chain=forward comment=MEGA-download in-interface=eth1-Wi-Fi new-packet-mark=MEGA-download passthrough=yes src-address-list=mega.nz
/queue tree
add max-limit=25M name=MEGA-upload packet-mark=MEGA-upload parent=global queue=default-small
add max-limit=25M name=MEGA-download packet-mark=MEGA-download parent=global queue=default-small
PS.: Таким образом можно ограничивать скорость на любые ресурсы.
PPS: Правила ограничений были частично взяты из статьи "Ограничение скорости в MikroTik" и изменены для своих нужд.
PPPS: В статью были добавлены скрипты в текстовом эквиваленте, а также убрано создание PCQ-типов для очередей.
Комментарии (31)
TimsTims
30.11.2017 00:29Скриншоты в jpeg… :facepalm:
Helldar Автор
30.11.2017 12:01Про Habrastorage в курсе?
TimsTims
30.11.2017 12:44-1Он вполне себе неплохо хранит PNG: https://habrastorage.org/webt/rw/dm/rq/rwdmrqfimciqkxwgku_kij96wug.png
Проблема не в Habrastorage, а в прокладке между монитором и стулом.Helldar Автор
30.11.2017 12:51Ого, грубость пошла? :)
На компе скриншоты сохранены в формате jpg. При перетаскивании drag'n'drop'ом они автоматом загружаются на ресурс, который в ответ выдает ссылку на изображение. Эта ссылка и была вставлена в тело статьи. Или тебе придраться больше не к чему, кроме как к расширению файла загруженного в облако?..
TimsTims
30.11.2017 15:00Ого, грубость пошла? :)
Вы первый начали грубить, перейдя неожиданно на «ты», и указывая на мою глупость, что это habrastorage себя так ведёт (якобы он сконвертировал нормальные скриншоты из PNG в JPEG):
Про Habrastorage в курсе?
При этом дальше пишете:
На компе скриншоты сохранены в формате jpg
Ну и причем тут тогда habrastorage, если вы скриншоты налепили в JPEG? И к чему ваш первый комментарий про habrastorage? Изначально скриншоты интерфейсов надо делать в PNG. Эх, зря вам карму плюсанул, поторопился… (upd: хотя нет, статья действительно полезная, и лично мне пригодится)
Helldar Автор
30.11.2017 20:39Вы первый начали грубить, перейдя неожиданно на «ты», и указывая на мою глупость, что это habrastorage себя так ведёт
Кто писал про прокладку между стулом и монитором?
Louie
02.12.2017 12:51Идея хорошая, но есть ряд замечаний:
1. Оптимально для решения поставленной задачи тупо создать 4 simple queues к аггрегированным подсеткам в качестве dst-address:
31.216.144.0/23
31.216.147.0/24
89.44.168.0/24
154.53.224.0/23
Никаких деревьев не надо. Простые очереди работают быстрее.
2. Маркировать пакеты. Не так оптимально для текущей задачи, но если сильно хочется маркировать, то лучше сначала маркировать соединения, а уж потом маркировать пакеты, к ним относящиеся.Helldar Автор
02.12.2017 23:15Для домашней сети с 3-мя устройствами вариант, описанный в статье, значительно лучше подходит, т.к. новые диапазоны адресов можно просто в именованный список добавить и не париться.
Louie
03.12.2017 08:01Количество устройств не имеет значения, равно как и место куда добавлять подсети (или, как вы говорите, диапазоны). Что в адрес-лист, что в адрес очереди.
Но спорить не буду. Задача очень простая, и решить ее можно массой способов, которые в конце все равно упираются в queue. Поэтому, оптимальнее всего писать сразу в queue.
Если есть желание новых диапазонов — сделайте автоматическое их определение по адресу хоста ;-)
Louie
03.12.2017 11:48Кстати, коль скоро лимит очень большой 25М — можно просто ограничить любые «тяжелые» соединения. Например, так: wiki.mikrotik.com/wiki/Manual:Connection_Rate
bewza
02.12.2017 23:10А какая объективная причина использовать 2 Queue Tree, вместо 1 Simple?
Helldar Автор
02.12.2017 23:13Как писал выше в комментариях, во-первых, simple queue не позволяет ограничивать трафик по имени маркированных пакетов. Во-вторых, он не позволяет ограничивать трафик по диапазону из нескольких IP-адресов, а создавать новое правило для каждого диапазона с маской — глупо (у того же Mega.nz 6 диапазонов IP-адресов замечал, а облачными хранилищами несколькими пользуюсь). Вот и выйдет что у тебя выйдет не 1 Simple Queue, а 6 как минимум для каждого диапазона с выбранной маской.
Ostan
Где соединение помеченное меткой MEGA в дальнейшем используется?
Решение хоть и рабочее, но в корне не верно. PCQ используется не для того чтобы ограничить общую скорость к/от одному хосту, а для того, чтобы равномерно распределить скорость между потоками по заданному критерию.
Helldar Автор
Соединение, помеченное данной меткой, используется в правилах с экшеном «mark packet» в разделе «mangle». Ниже эти блоки расписаны, как раз под тем, к которому ты замечание оставил.
Ostan
Ясно, не заметил. Маркировка пакетов нагружает процессор маршрутизатора. Для данного примера это не существенно, а в больших сетях — да.
Совет
В RouterOS есть возможность экспорта конфигураций. Это текстовая «читабельная» информация которая показывает конфигурацию устройства. Если ты хочешь показать выполненную настройку, то можешь сделать это следующим образом. Куст /queue из моего устройства, для примера:
/queue type
add kind=pcq name=pcq_download pcq-classifier=dst-address pcq-limit=40KiB pcq-rate=4M pcq-total-limit=1600KiB
add kind=pcq name=pcq_upload pcq-classifier=src-address pcq-limit=40KiB pcq-rate=4M pcq-total-limit=1600KiB
/queue tree
add name=download packet-mark=mark_download parent=global queue=pcq_download
add name=upload packet-mark=mark_upload parent=global queue=pcq_upload
Helldar Автор
Про экспорт конфига знаю. В указанной в разделе «pps» статье есть все необходимые команды для терминала, поэтому и делал скриншоты — вдруг кому-то проще через гуй реализовать процесс.
Ostan
Ну здесь же не «домохозяйки» сидят. В профессиональной среде админы обмениваются конфигами в виде текста (кода), а не скриншотами.
Helldar Автор
Понял, учту. Буду дома — добавлю конфиг в статью.
Helldar Автор
Маркировка да, нагружает. Из практики, Mikrotik RB450G с 94 компами в онлайн успешно маркировал пакеты торрент-трафика и дропал их. При этом, нагрузка на ЦП устройства не превышала 60%.
Конкретно эта статья писалась с устройства Mikrotik RB950G-2HnD на котором висит 2 компа и телефон. Во время синхронизации маркировка пакетов поднимает используемый объем ПЦ примерно до 9-13% от общего объема в то время, как без маркировки этот показатель прыгает в пределах 5-10% при просмотре того же видео онлайн с ютуба.
Ostan
Суть в том, что ты пытаешься «забивать гвозди плоскогубцами». Разве это нельзя сделать на простой очереди simple queue?
Helldar Автор
Конечно, может быть я что-то не так делал, на «simple queue» удавалось лишь ограничить скорость на конкретный IP-адрес, а у сервиса используется их пул.
Ostan
Да, возможно, нужно использовать /queue tree. Но, для поставленной задачи не нужно использовать PCQ. Попробуй на PFIFO сделать (/queue type).
Helldar Автор
pfifo позволяет лишь размер пакетов в очереди указывать. Сомневаюсь что это есть ограничение по скорости.
Кстати, в Simple Queues во вкладке Advanced есть параметр Queue Type. Пробовал в нем выбрать существующие типы и отключить записи с вкладки Queue Type — не сработало правило. Прога выжала весь канал для синхронизации. А как только активировал обратно Queue Tree — трафик моментально стал ограничиваться.
Helldar Автор
Попробовал в queue tree заменить значение пункта queue с PCQ-MEGA-download на default-small — скорость также режется. У правила default-small значение kind равно pfifo.
В связи с этим удалил лишние правила из вкладки типов.
Комментарием выше писал что с типом pfifo не сработало — как оказалось, каким-то образом умудрился в правиле queue tree заменить значение поля packet marks на no-mark. Вот и не срабатывало правило, ибо не было ограничений.
Еще раз проверил нагрузку на ЦП: прыгает в пределах 18-27%.
Ostan
Ну то есть получилось на PFIFO? Тогда идём дальше. Попробуй в правилах очередей указать использование не маркировки пакета, а маркировку соединения. Потести ограничение на приём и отдачу. Нужно будет добавить ещё одну маркировку для connection, а маркировки для пакетов можешь поудалять или временно выключить.
Helldar Автор
В правилах очередей можно выбрать лишь значение «Packet Marks». Настройки для маркированных пакетов не нашел. Весь раздел облазил.
Ostan
Я не так выразился. В /ip firewall mangle используй connection mark вместо packet mark.
Helldar Автор
Simple Queue не поддерживает ограничение скорости по маркированному соединению, только по пакетам.
Helldar Автор
Статью обновил. В предыдущей версии на выгрузку норм срабатывало, а на вход — нет. Исправил. Сколько тестил, это самый минимальный конфиг. Меньше не получилось.
Нагрузка на ЦП ~15-25% в одну сторону и ~30-42% при трафике в обе стороны на канале в 90 Мбит/с (ночью провайдер до 100 разрешает юзать) с ограничением по 25 Мбит/с в каждую сторону для выбранного пула адресов.
Helldar Автор
Корректировка: модель устройства Mikrotik RB951G-2HnD