Pull to refresh

Mikrotik: Ограничение скорости скачивания для определенных IP-адресов

Reading time4 min
Views41K
Предыстория: имеем Интернет-соединение со скоростью «до 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-типов для очередей.

PPPPS: Если кому нужно, ниже представлен скрипт автодобавления IP-адресов из кэша DNS в именованный список. Сразу скажу, что скрипт настроен на работу с несколькими облачными сервисами и добавляет адреса в список с именем «clouds». Если нужно, можете изменить его под себя.
Скрипт автодобавления
:log info "STARTING SCAN TO CLOUD"

:put [:resolve mega.nz]
:put [:resolve mega.co.nz]
:put [:resolve eu.static.mega.co.nz]
:put [:resolve dropbox.com]
:put [:resolve d.dropbox.com]
:put [:resolve bolt.dropbox.com]
:put [:resolve dl-debug.dropbox.com]
:put [:resolve api.disk.yandex.net]

:foreach i in=[/ip dns cache all find where (name~"mega.nz" || name~"mega.co" || name~"dropbox" || name~"disk.yandex") && (type="A") ] do={

:local tmpAddress [/ip dns cache get $i address];

delay delay-time=10ms

#prevent script from using all cpu time

:if ( [/ip firewall address-list find where address=$tmpAddress] = "") do={ 

:local cacheName [/ip dns cache get $i name] ;

:log info ("added entry: $cacheName $tmpAddress");

/ip firewall address-list add address=$tmpAddress list=clouds comment=$cacheName;

}

}

:log info "CLOUD SCAN COMPLETE"

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+2
Comments39

Articles