Предыстория: имеем Интернет-соединение со скоростью «до 50 Мбит/с», имеющее «фичу» разгоняться до 100 если канал свободен. Пользуясь облачным хранилищем заметил проблему, что выгрузив или загрузив около 50-100 файлов клиент для работы с облаком «зависает» и либо качает файлы на крайне низкой скорости (порядка 50-200 Кбит/с), либо вообще «молчит». При этом, сайты в браузере открываются без всяких проблем.

Как такое может быть? Ограничение ширины канала по определенным IP-адресам при скачке за определенный промежуток времени.

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

В просторах сети было найдено множество статей на подобную тематику, только все они предлагали распределение скорости между пользователями по приоритету (интернет-страницы с высоким, потоковое видео ниже и самый низкий приоритет у p2p-систем).

Итак, для начала теория. Провайдер отслеживает все «скачки» скорости и количество обращений к ресурсам, выдавая ограничение на превышающие их показатели предел. Узнать его не получится — это закрытая информация провайдера. Но как же скачивать и заливать по 1к+ файлов в облако, не получая за это временный «бан» на доступ к ресурсу? Легко!

Алгоритм действий будет таков:

  1. Создаем список IP-адресов, для которых нужно включить ограничение скорости;
  2. Организовать маркировку пакетов, идущих на и с ресурсов списка;
  3. Задать ограничение скорости по требуемым ресурсам при помощи очередей.


Приступим к настройке



Шаг 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:

  • CommentMEGA-upload.
  • chainforward.
  • Out. Interface — интерфейс, на котором висит Инет. В моем случае это «eth1-Wi-Fi».
  • Dst. Address Listmega.nz — это имя того самого набора адресных листов с прошлого шага.
  • Actionmark packet.
  • New Packet MarkMEGA-upload.
  • Passthroughttrue.





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

  • CommentMEGA-download.
  • chainforward.
  • In. Interface — интерфейс, на котором висит Инет. В моем случае это «eth1-Wi-Fi».
  • Src Address Listmega.nz — это имя того самого набора адресных листов с прошлого шага.
  • Actionmark packet.
  • New Packet MarkMEGA-download.
  • Passthroughtrue.





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

  • NameMEGA-upload
  • Parentglobal
  • Packet MarksMEGA-upload (выбираем из списка)
  • Queue Typedefault-small
  • Priority8
  • Bucket Size0.100
  • Max Limit25M



/queue tree
add max-limit=25M name=MEGA-upload packet-mark=MEGA-upload parent=global     queue=default-small


MEGA-download:

  • NameMEGA-download
  • Parentglobal
  • Packet MarksMEGA-download (выбираем из списка)
  • Queue Typedefault-small
  • Priority8
  • Bucket Size0.100
  • Max Limit25M



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


  1. Ostan
    30.11.2017 00:03
    -1

    Шаг 2. Маркировка пакетов

    После этого перейдем во вкладку «Mangle» и добавим правила маркировки пакетов. Для этого жмем на «плюс» и указываем следующие параметры:
    • chain — forward.
    • Out. Interface — интерфейс, на котором висит Инет. В моем случае это «eth1-Wi-Fi».
    • Dst. Address List — mega.nz — это имя того самого набора адресных листов с прошлого шага.
    • Action — mark connection.
    • New Connection Mark — MEGA.
    • Passthrought — true.
    • Comment — Traffic to Mega.nz.

    Где соединение помеченное меткой MEGA в дальнейшем используется?
    Решение хоть и рабочее, но в корне не верно. PCQ используется не для того чтобы ограничить общую скорость к/от одному хосту, а для того, чтобы равномерно распределить скорость между потоками по заданному критерию.


    1. Helldar Автор
      30.11.2017 00:08

      Соединение, помеченное данной меткой, используется в правилах с экшеном «mark packet» в разделе «mangle». Ниже эти блоки расписаны, как раз под тем, к которому ты замечание оставил.


      1. Ostan
        30.11.2017 09:16

        Ясно, не заметил. Маркировка пакетов нагружает процессор маршрутизатора. Для данного примера это не существенно, а в больших сетях — да.
        Совет
        В 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


        1. Helldar Автор
          30.11.2017 12:45

          Про экспорт конфига знаю. В указанной в разделе «pps» статье есть все необходимые команды для терминала, поэтому и делал скриншоты — вдруг кому-то проще через гуй реализовать процесс.


          1. Ostan
            30.11.2017 13:03

            Ну здесь же не «домохозяйки» сидят. В профессиональной среде админы обмениваются конфигами в виде текста (кода), а не скриншотами.


            1. Helldar Автор
              30.11.2017 13:06

              Понял, учту. Буду дома — добавлю конфиг в статью.


        1. Helldar Автор
          30.11.2017 12:48

          Маркировка да, нагружает. Из практики, Mikrotik RB450G с 94 компами в онлайн успешно маркировал пакеты торрент-трафика и дропал их. При этом, нагрузка на ЦП устройства не превышала 60%.

          Конкретно эта статья писалась с устройства Mikrotik RB950G-2HnD на котором висит 2 компа и телефон. Во время синхронизации маркировка пакетов поднимает используемый объем ПЦ примерно до 9-13% от общего объема в то время, как без маркировки этот показатель прыгает в пределах 5-10% при просмотре того же видео онлайн с ютуба.


          1. Ostan
            30.11.2017 13:04

            Суть в том, что ты пытаешься «забивать гвозди плоскогубцами». Разве это нельзя сделать на простой очереди simple queue?


            1. Helldar Автор
              30.11.2017 13:08

              Конечно, может быть я что-то не так делал, на «simple queue» удавалось лишь ограничить скорость на конкретный IP-адрес, а у сервиса используется их пул.


              1. Ostan
                30.11.2017 13:56

                Да, возможно, нужно использовать /queue tree. Но, для поставленной задачи не нужно использовать PCQ. Попробуй на PFIFO сделать (/queue type).


                1. Helldar Автор
                  30.11.2017 21:26

                  pfifo позволяет лишь размер пакетов в очереди указывать. Сомневаюсь что это есть ограничение по скорости.

                  Кстати, в Simple Queues во вкладке Advanced есть параметр Queue Type. Пробовал в нем выбрать существующие типы и отключить записи с вкладки Queue Type — не сработало правило. Прога выжала весь канал для синхронизации. А как только активировал обратно Queue Tree — трафик моментально стал ограничиваться.


                1. Helldar Автор
                  30.11.2017 22:43

                  Попробовал в queue tree заменить значение пункта queue с PCQ-MEGA-download на default-small — скорость также режется. У правила default-small значение kind равно pfifo.
                  В связи с этим удалил лишние правила из вкладки типов.
                  Комментарием выше писал что с типом pfifo не сработало — как оказалось, каким-то образом умудрился в правиле queue tree заменить значение поля packet marks на no-mark. Вот и не срабатывало правило, ибо не было ограничений.

                  Еще раз проверил нагрузку на ЦП: прыгает в пределах 18-27%.


                  1. Ostan
                    30.11.2017 23:13

                    Ну то есть получилось на PFIFO? Тогда идём дальше. Попробуй в правилах очередей указать использование не маркировки пакета, а маркировку соединения. Потести ограничение на приём и отдачу. Нужно будет добавить ещё одну маркировку для connection, а маркировки для пакетов можешь поудалять или временно выключить.


                    1. Helldar Автор
                      30.11.2017 23:47

                      В правилах очередей можно выбрать лишь значение «Packet Marks». Настройки для маркированных пакетов не нашел. Весь раздел облазил.


                      1. Ostan
                        01.12.2017 08:32

                        Я не так выразился. В /ip firewall mangle используй connection mark вместо packet mark.


                        1. Helldar Автор
                          01.12.2017 23:55

                          Simple Queue не поддерживает ограничение скорости по маркированному соединению, только по пакетам.


                    1. Helldar Автор
                      01.12.2017 00:32

                      Статью обновил. В предыдущей версии на выгрузку норм срабатывало, а на вход — нет. Исправил. Сколько тестил, это самый минимальный конфиг. Меньше не получилось.
                      Нагрузка на ЦП ~15-25% в одну сторону и ~30-42% при трафике в обе стороны на канале в 90 Мбит/с (ночью провайдер до 100 разрешает юзать) с ограничением по 25 Мбит/с в каждую сторону для выбранного пула адресов.


          1. Helldar Автор
            30.11.2017 21:27

            Корректировка: модель устройства Mikrotik RB951G-2HnD


  1. TimsTims
    30.11.2017 00:29

    Скриншоты в jpeg… :facepalm:


    1. Helldar Автор
      30.11.2017 12:01

      Про Habrastorage в курсе?


      1. TimsTims
        30.11.2017 12:44
        -1

        Он вполне себе неплохо хранит PNG: https://habrastorage.org/webt/rw/dm/rq/rwdmrqfimciqkxwgku_kij96wug.png
        Проблема не в Habrastorage, а в прокладке между монитором и стулом.


        1. Helldar Автор
          30.11.2017 12:51

          Ого, грубость пошла? :)
          На компе скриншоты сохранены в формате jpg. При перетаскивании drag'n'drop'ом они автоматом загружаются на ресурс, который в ответ выдает ссылку на изображение. Эта ссылка и была вставлена в тело статьи. Или тебе придраться больше не к чему, кроме как к расширению файла загруженного в облако?..
          image


          1. TimsTims
            30.11.2017 15:00

            Ого, грубость пошла? :)
            Вы первый начали грубить, перейдя неожиданно на «ты», и указывая на мою глупость, что это habrastorage себя так ведёт (якобы он сконвертировал нормальные скриншоты из PNG в JPEG):
            Про Habrastorage в курсе?

            При этом дальше пишете:
            На компе скриншоты сохранены в формате jpg
            Ну и причем тут тогда habrastorage, если вы скриншоты налепили в JPEG? И к чему ваш первый комментарий про habrastorage? Изначально скриншоты интерфейсов надо делать в PNG. Эх, зря вам карму плюсанул, поторопился… (upd: хотя нет, статья действительно полезная, и лично мне пригодится)


            1. rt3879439
              30.11.2017 20:38
              +1

              вполне читаемые скриншоты.


            1. Helldar Автор
              30.11.2017 20:39

              Вы первый начали грубить, перейдя неожиданно на «ты», и указывая на мою глупость, что это habrastorage себя так ведёт

              Кто писал про прокладку между стулом и монитором?


  1. 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. Маркировать пакеты. Не так оптимально для текущей задачи, но если сильно хочется маркировать, то лучше сначала маркировать соединения, а уж потом маркировать пакеты, к ним относящиеся.


    1. Helldar Автор
      02.12.2017 23:15

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


      1. Louie
        03.12.2017 08:01

        Количество устройств не имеет значения, равно как и место куда добавлять подсети (или, как вы говорите, диапазоны). Что в адрес-лист, что в адрес очереди.
        Но спорить не буду. Задача очень простая, и решить ее можно массой способов, которые в конце все равно упираются в queue. Поэтому, оптимальнее всего писать сразу в queue.

        Если есть желание новых диапазонов — сделайте автоматическое их определение по адресу хоста ;-)


      1. Louie
        03.12.2017 11:48

        Кстати, коль скоро лимит очень большой 25М — можно просто ограничить любые «тяжелые» соединения. Например, так: wiki.mikrotik.com/wiki/Manual:Connection_Rate


  1. bewza
    02.12.2017 23:10

    А какая объективная причина использовать 2 Queue Tree, вместо 1 Simple?


    1. Helldar Автор
      02.12.2017 23:13

      Как писал выше в комментариях, во-первых, simple queue не позволяет ограничивать трафик по имени маркированных пакетов. Во-вторых, он не позволяет ограничивать трафик по диапазону из нескольких IP-адресов, а создавать новое правило для каждого диапазона с маской — глупо (у того же Mega.nz 6 диапазонов IP-адресов замечал, а облачными хранилищами несколькими пользуюсь). Вот и выйдет что у тебя выйдет не 1 Simple Queue, а 6 как минимум для каждого диапазона с выбранной маской.