суббота, 24 сентября 2016 г.

Автоматическое ограничение скорости DHCP-клиентам.

  Есть сеть, в сети адреса раздаются по DHCP. Нужно, что-бы при подключении клиентов каждому автоматически ограничивалась скорость в 10 мегабит. Для этого мы будем использовать функционал в DHCP-сервер Mikrotik под название "lease-script". Для этого зайдем в IP > DHCP Server в свойства нашего сервера.


  В поле "Lease-Script" добавим наш скрипт. Он будет выполнятся при регистрации DHCP-клиента и при отключении. Сам скрипт имеет вид:
:local queueName "Guest $leaseActMAC";
:if ($leaseBound = "1") do={
    /queue simple add name=$queueName parent=GUESTS target=($leaseActIP . "/32") max-limit=10M/10M comment=[/ip dhcp-server lease get [find where active-mac-address=$leaseActMAC && active-address=$leaseActIP] host-name];
} else={
    /queue simple remove $queueName
}
  В этом скрипте можно использовать внутренние глобальные переменные, которые действуют только в этом поле:
  • leaseBound - устанавливается в "1", если DHCP-клиент активен, в противном случае - устанавливается в "0";
  • leaseServerName - передается в значение имя сервера DHCP;
  • leaseActMAC - активный MAC - адрес;
  • leaseActIP - активный IP - адрес.
  Теперь создадим простое правило, которое ограничивается скорость на всю нашу подсеть:
/queue simple
add max-limit=50M/50M name=GUESTS target=192.168.88.0/24
  Немного поясню скрипт и как это работает. Если клиент получил  DHCP-аренду, то "$leaseBound" устанавливается в значение "1" и выполняется действие, которое добавляет правило ограничивающее ему скорость 10M/10M:
/queue simple add name=$queueName parent=GUESTS target=($leaseActIP . "/32") max-limit=10M/10M comment=[/ip dhcp-server lease get [find where active-mac-address=$leaseActMAC && active-address=$leaseActIP] host-name];
  Это правило является подчиненным нашему общему правилу ограничения на подсеть (GUESTS). Таким образом мы можем добавлять очень много таких правил, и они все будут ограничены общим родительским правилом в 50M/50M. Для общего развития скажу, параметром Priority назначается приоритет для очередей. Данный параметр может принимать значения от 1 до 8. 1 – наивысший приоритет, 8 – самый низкий приоритет. Сначала будут обрабатываться очереди с наивысшим приоритетом. Так же параметром Limit At, в правиле можно задать гарантированный параметр скорости. То есть шейпер сразу будет обеспечивать это значение в правиле, а потом, что останется - перераспределять.
  После того как клиент отключиться (потеряет аренду DHCP) значение "$leaseBound" станет "0" - и созданное правило в Queue с именем  "Guest $leaseActMAC" удалиться:
/queue simple remove $queueName
  Правила выглядят так:
 
 
  Так же стоит заметить, что в комментарий правила Queue, при подключении клиентского устройства, создается запись, которая соответствует полю "Active Host Name" в IP > DHCP Server > DHCP Leases. Если это поле не заполнено - комментарий не создается.


Используемые материалы:



Подписаться на новые статьи.

13 комментариев:

  1. Ответы
    1. убедитесь, что правило с именем GUESTS существует, или не используйте подчиненные правила.

      Удалить
    2. всё как у вас на картинке, скрипт в дхцп в лизах

      Удалить
    3. правило /queue simple
      add max-limit=50M/50M name=GUESTS target=x.x.x.x/x добавлено?

      Удалить
    4. есть такое, и циферки показывают загрузку канала, но при подключении нового пользователя по дхцп - ничего не происходит

      Удалить
    5. убедитесь что используется именно тот dhcp-сервер, введите переменные и проверьте отработку скрипта в терминале, может невидимые символы или переносы при копировании скрипта. на 6.37 все работает, должно работать и на ранних версиях. Только что проверил на 6.28 - все отработало.

      Удалить
    6. Не работает меня.... Попробовал вставить скрипт напрямую в терминал
      invalid value for argument numbers

      Удалить
    7. Працює з першого разу

      Удалить
  2. Заработало сегодня ... Только учета трафика не видно

    ОтветитьУдалить
  3. У меня тоже что-то не работает, [IT_Admin@SideA] > /queue simple add name=$queueName parent=GUESTS target=($leaseActIP . "/32") max-limit=10M/10M comment=[/ip dhcp-server lease get [find where active-mac-a
    ddress=$leaseActMAC && active-address=$leaseActIP] host-name];
    no such item

    ОтветитьУдалить
  4. Спасибо, на 6.43.7 работает нормально.

    ОтветитьУдалить
  5. Спасибо добрый человек!

    ОтветитьУдалить