Mikrotik: Ограничение скорости скачивания для определенных IP-адресов
Предыстория: имеем Интернет-соединение со скоростью «до 50 Мбит/с», имеющее «фичу» разгоняться до 100 если канал свободен. Пользуясь облачным хранилищем заметил проблему, что выгрузив или загрузив около 50-100 файлов клиент для работы с облаком «зависает» и либо качает файлы на крайне низкой скорости (порядка 50-200 Кбит/с), либо вообще «молчит». При этом, сайты в браузере открываются без всяких проблем.
Как такое может быть? Ограничение ширины канала по определенным 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
/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-типов для очередей.
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"