Mikrotik. Динамический шейпинг+ Блокировка ip прописанных вручную
Добавлено: 21 янв 2016, 11:35
Хочу поделиться скриптом и одновременно услышать предложения/пожелания/упреки у более опытных товарищей с данного форума.
Ну по порядку:
В DHCP сервере прописываем скрипт который выполняет следующие функции
1) добавлять простую очередь в Queues с заранее заданым лимитом скорости для одного ip
3) добавлять пользователя в /ip firewall address-list с таймаутом равным DHCP lease time
2) Блокировать ip-адреса введенные на устройстве вручную.
Самое интересное что по логике данные пункты зависят друг от друга и друг-друга дополняют.
Например если пользователь пропишет вручную ip - то он обойдет queues и будет сидет на полную скорость канала. Соотвественно по данному скрипту он попадает в список заблокированных. Если он решить играть по правилам DHCP сервера - то получив ip от него автоматически удаляется из списка и становиться пользователем по правилам и получает доступ в инет на той скорости какую указал сисадмин. Если пользователь ушел из сети то список очередей и адрес-лист от него освобождается, тем самым не загружая процессор микротика
Подготовка
Есть bridge c именем Guests-bridge. Есть DHCP сервер с именем Guests-DHCP. Какой ip и диапазон - это на ваше усмотрение.
В firewall filter добавляем два правила
/ip firewall filter
add action=add-src-to-address-list address-list=StaticGuests address-list-timeout=10s chain=forward in-interface=Guests-bridge src-address-list=!Guests-DHCP
add action=drop chain=forward src-address-list=StaticGuests
здесь можно было обойтись одним правилом но я решил отделить котлеты от мух и выделить статические адреса отдельным листом а потом его забанить.
В очередях создаю simple queue c именем Guests-Queue. Это будет основная очередь к которой будут подвязываться другие queues. В ней можно указать общую максимальную скорость для Guests-bridge.
Далее скрипт добавляем в /ip dhcp-server в поле скрипта
:local queueName "$leaseServerName-$leaseActIP";
:local leaseSrvTime [/ip dhcp-server get [find where name=$leaseServerName] lease-time]
:if ($leaseBound = "1")
do={
/ip firewall address-list remove [find where address=$leaseActIP];
/queue simple add name=$queueName target=($leaseActIP . "/32") max-limit=5M/7M parent=Guests-Queue;
/ip firewall address-list add list=$leaseServerName address=$leaseActIP timeout=($leaseSrvTime + 12h);}
else={
/queue simple remove [find where target=($leaseActIP . "/32")];
/ip firewall address-list remove [find where address=$leaseActIP]; }
построчно
1) переменная для имени в очередях
2) переменная времени для timeout в адрес-листе. Берется от времени для DHCP-Lease
3) "если ip получен то..." поехали! По правилам ниже можно понять что сначала удаляется данный ip из списка. чтобы не задваивалось.
потом создается очередь
потом добавляется в список которому доступ есть)
4) далее идут комманды отмены если время жизни ip закончилось либо его удалили из списка dhcp-lease
Заранее рад если вам понравиться. Очень важны ваши комментарии! Косяки всегда есть) Для меня важно узнать где они если они есть)
Ну по порядку:
В DHCP сервере прописываем скрипт который выполняет следующие функции
1) добавлять простую очередь в Queues с заранее заданым лимитом скорости для одного ip
3) добавлять пользователя в /ip firewall address-list с таймаутом равным DHCP lease time
2) Блокировать ip-адреса введенные на устройстве вручную.
Самое интересное что по логике данные пункты зависят друг от друга и друг-друга дополняют.
Например если пользователь пропишет вручную ip - то он обойдет queues и будет сидет на полную скорость канала. Соотвественно по данному скрипту он попадает в список заблокированных. Если он решить играть по правилам DHCP сервера - то получив ip от него автоматически удаляется из списка и становиться пользователем по правилам и получает доступ в инет на той скорости какую указал сисадмин. Если пользователь ушел из сети то список очередей и адрес-лист от него освобождается, тем самым не загружая процессор микротика
Подготовка
Есть bridge c именем Guests-bridge. Есть DHCP сервер с именем Guests-DHCP. Какой ip и диапазон - это на ваше усмотрение.
В firewall filter добавляем два правила
/ip firewall filter
add action=add-src-to-address-list address-list=StaticGuests address-list-timeout=10s chain=forward in-interface=Guests-bridge src-address-list=!Guests-DHCP
add action=drop chain=forward src-address-list=StaticGuests
здесь можно было обойтись одним правилом но я решил отделить котлеты от мух и выделить статические адреса отдельным листом а потом его забанить.
В очередях создаю simple queue c именем Guests-Queue. Это будет основная очередь к которой будут подвязываться другие queues. В ней можно указать общую максимальную скорость для Guests-bridge.
Далее скрипт добавляем в /ip dhcp-server в поле скрипта
:local queueName "$leaseServerName-$leaseActIP";
:local leaseSrvTime [/ip dhcp-server get [find where name=$leaseServerName] lease-time]
:if ($leaseBound = "1")
do={
/ip firewall address-list remove [find where address=$leaseActIP];
/queue simple add name=$queueName target=($leaseActIP . "/32") max-limit=5M/7M parent=Guests-Queue;
/ip firewall address-list add list=$leaseServerName address=$leaseActIP timeout=($leaseSrvTime + 12h);}
else={
/queue simple remove [find where target=($leaseActIP . "/32")];
/ip firewall address-list remove [find where address=$leaseActIP]; }
построчно
1) переменная для имени в очередях
2) переменная времени для timeout в адрес-листе. Берется от времени для DHCP-Lease
3) "если ip получен то..." поехали! По правилам ниже можно понять что сначала удаляется данный ip из списка. чтобы не задваивалось.
потом создается очередь
потом добавляется в список которому доступ есть)
4) далее идут комманды отмены если время жизни ip закончилось либо его удалили из списка dhcp-lease
Заранее рад если вам понравиться. Очень важны ваши комментарии! Косяки всегда есть) Для меня важно узнать где они если они есть)