Зачем? Просто способ для тех, кто не очень дружит с техникой, понять, кто или что грузит интернет на роутере. Легко можно ограничить скорость для каждого отдельного компьютера или устройства. Практически не требует обслуживания, так как скрипт сам поддерживает таблицу simple queue в актуальном состоянии и самостоятельно убирает старые записи.
Что он делает: этот скрипт просматривает таблицу DHCP-аренд в ROS, чтобы создать записи simple queue для каждого устройства. Он обновляет эти записи и удаляет устаревшие.
Как использовать: скопируйте текст ниже в новый скрипт в RouterOS. Запланируйте выполнение скрипта с нужной периодичностью через планировщик RouterOS. Для устройств, отображаемых в списке simple queue только по MAC-адресу, можно задать имя вручную в таблице DHCP lease в поле комментария.
# DHCP Lease to Simple Queues
# 2014 Lonnie Mendez (lmendez@anvilcom.com)
#
# Mikrotik RouterOS v6.9
/ip dhcp-server lease
:foreach x in=[find] do={
# берем переменные для дальнейшего использования
:local leaseaddr ([get $x address]."/32")
:local leasemacaddr [get $x mac-address]
:local leasehostname [get $x host-name]
:local leasename [get $x comment]
:local queuecomment
:local leaseinqueue false
/queue simple
:foreach y in=[find] do={
# берем переменные для использования дальше
:local queuetargetaddr [get $y target]
:set queuecomment [get $y comment]
# выделяем из комментария информацию (MAC, имя хоста)
:local queuemac [:pick $queuecomment 4 21]
:local queuehostname [:pick $queuecomment 22 [:len $queuecomment]]
# если MAC из аренды совпадает с MAC в очереди — обновляем запись в очереди
:if ($queuemac = $leasemacaddr) do={
# формируем комментарий
:set queuecomment ("dtq," . $leasemacaddr . "," . $leasehostname)
set $y target=$leaseaddr comment=$queuecomment
:if ($leasename != "") do= {
set $y name=($leasename . " (" . $leasemacaddr . ")")
} else= {
:if ($leasehostname != "") do= {
set $y name=($leasehostname . " (" . $leasemacaddr . ")")
} else= {
set $y name=$leasemacaddr
}
}
:set leaseinqueue true
} else= {
# если IP есть, но MAC другой — обновляем MAC/имя и сбрасываем счетчики
:if ($queuetargetaddr = $leaseaddr) do={
# формируем комментарий
:set queuecomment ("dtq," . $leasemacaddr . "," . $leasehostname)
set $y comment=$queuecomment
reset-counters $y
:if ($leasename != "") do= {
set $y name=($leasename . " (" . $leasemacaddr . ")")
} else= {
:if ($leasehostname != "") do= {
set $y name=($leasehostname . " (" . $leasemacaddr . ")")
} else= {
set $y name=$leasemacaddr
}
}
:set leaseinqueue true
}
}
}
# если записи не было — добавляем новую для этой аренды
:if ($leaseinqueue = false) do={
# формируем комментарий
:set queuecomment ("dtq," . $leasemacaddr . "," . $leasehostname)
# составляем команду
:local cmd "/queue simple add target=$leaseaddr max-limit=100M/100M comment=$queuecomment"
:if ($leasename != "") do={
:set cmd "$cmd name=\"$leasename ($leasemacaddr)\""
} else= {
:if ($leasehostname != "") do={
:set cmd "$cmd name=\"$leasehostname ($leasemacaddr)\""
} else= {
:set cmd "$cmd name=\"$leasemacaddr\""
}
}
:execute $cmd
}
}
# Очистка — удаляем динамические записи, которых уже нет в таблице аренды
/queue simple
:foreach z in=[find] do={
:local queuecomment [get $z comment]
:local queue1stpart [:pick $queuecomment 0 3]
:local queue2ndpart [:pick $queuecomment 4 21]
:if ( $queue1stpart = "dtq") do={
:if ( [/ip dhcp-server lease find mac-address=$queue2ndpart] = "") do={
:log info ("DTQ: Удаляю устаревшую запись для MAC-адреса - " . $queue2ndpart)
remove $z
}
}
}
Что он делает: этот скрипт просматривает таблицу DHCP-аренд в ROS, чтобы создать записи simple queue для каждого устройства. Он обновляет эти записи и удаляет устаревшие.
Как использовать: скопируйте текст ниже в новый скрипт в RouterOS. Запланируйте выполнение скрипта с нужной периодичностью через планировщик RouterOS. Для устройств, отображаемых в списке simple queue только по MAC-адресу, можно задать имя вручную в таблице DHCP lease в поле комментария.
# DHCP Lease to Simple Queues
# 2014 Lonnie Mendez (lmendez@anvilcom.com)
#
# Mikrotik RouterOS v6.9
/ip dhcp-server lease
:foreach x in=[find] do={
# берем переменные для дальнейшего использования
:local leaseaddr ([get $x address]."/32")
:local leasemacaddr [get $x mac-address]
:local leasehostname [get $x host-name]
:local leasename [get $x comment]
:local queuecomment
:local leaseinqueue false
/queue simple
:foreach y in=[find] do={
# берем переменные для использования дальше
:local queuetargetaddr [get $y target]
:set queuecomment [get $y comment]
# выделяем из комментария информацию (MAC, имя хоста)
:local queuemac [:pick $queuecomment 4 21]
:local queuehostname [:pick $queuecomment 22 [:len $queuecomment]]
# если MAC из аренды совпадает с MAC в очереди — обновляем запись в очереди
:if ($queuemac = $leasemacaddr) do={
# формируем комментарий
:set queuecomment ("dtq," . $leasemacaddr . "," . $leasehostname)
set $y target=$leaseaddr comment=$queuecomment
:if ($leasename != "") do= {
set $y name=($leasename . " (" . $leasemacaddr . ")")
} else= {
:if ($leasehostname != "") do= {
set $y name=($leasehostname . " (" . $leasemacaddr . ")")
} else= {
set $y name=$leasemacaddr
}
}
:set leaseinqueue true
} else= {
# если IP есть, но MAC другой — обновляем MAC/имя и сбрасываем счетчики
:if ($queuetargetaddr = $leaseaddr) do={
# формируем комментарий
:set queuecomment ("dtq," . $leasemacaddr . "," . $leasehostname)
set $y comment=$queuecomment
reset-counters $y
:if ($leasename != "") do= {
set $y name=($leasename . " (" . $leasemacaddr . ")")
} else= {
:if ($leasehostname != "") do= {
set $y name=($leasehostname . " (" . $leasemacaddr . ")")
} else= {
set $y name=$leasemacaddr
}
}
:set leaseinqueue true
}
}
}
# если записи не было — добавляем новую для этой аренды
:if ($leaseinqueue = false) do={
# формируем комментарий
:set queuecomment ("dtq," . $leasemacaddr . "," . $leasehostname)
# составляем команду
:local cmd "/queue simple add target=$leaseaddr max-limit=100M/100M comment=$queuecomment"
:if ($leasename != "") do={
:set cmd "$cmd name=\"$leasename ($leasemacaddr)\""
} else= {
:if ($leasehostname != "") do={
:set cmd "$cmd name=\"$leasehostname ($leasemacaddr)\""
} else= {
:set cmd "$cmd name=\"$leasemacaddr\""
}
}
:execute $cmd
}
}
# Очистка — удаляем динамические записи, которых уже нет в таблице аренды
/queue simple
:foreach z in=[find] do={
:local queuecomment [get $z comment]
:local queue1stpart [:pick $queuecomment 0 3]
:local queue2ndpart [:pick $queuecomment 4 21]
:if ( $queue1stpart = "dtq") do={
:if ( [/ip dhcp-server lease find mac-address=$queue2ndpart] = "") do={
:log info ("DTQ: Удаляю устаревшую запись для MAC-адреса - " . $queue2ndpart)
remove $z
}
}
}

Я могу подтвердить, что он отлично работает на версии 6.43.4. Кстати, я выложил этот пост, потому что скрипт очень интересный и простой. Привет и ещё раз спасибо.