galeoner Posted January 20, 2016 · Report post Хочу поделиться скриптом и одновременно услышать предложения/пожелания/упреки у более опытных товарищей с данного форума. Ну по порядку: В 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; } 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 Заранее рад если вам понравиться. Очень важны ваши комментарии! Косяки всегда есть) Для меня важно узнать где они если они есть) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
galeoner Posted January 21, 2016 · Report post Сам выявил косячки. Когда клиент отваливается от WiFi и переподключается - leasetime обновляется, а timeout в address-list остается прежним. Пришлось в скрипт добавить 12 часов к таймауту методом простого сложения))) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
shulya Posted June 30, 2016 · Report post Сам выявил косячки. Когда клиент отваливается от WiFi и переподключается - leasetime обновляется, а timeout в address-list остается прежним. Пришлось в скрипт добавить 12 часов к таймауту методом простого сложения))) Спасибо настроил у себя все работает. Вот только не пойму по косеку можно подробнее на что влияет. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...