Существует множество сторонних инструментов для мониторинга трафика, которые требуют установки приложения на ПК, которое собирает информацию с роутера Mikrotik. Для домашнего использования я не хотел использовать такие инструменты, которые должны работать постоянно, поэтому написал этот скрипт, чтобы Mikrotik показывал использование интернета в удобной форме. Это не управление трафиком (которое можно сделать через очереди), а просто отображение использования. Что-то в вашей домашней сети поглощает весь трафик (или лимит данных — да, не у всех безлимитный интернет), и вам нужен быстрый способ узнать, какой DHCP-клиент виноват.
Цель:
- Отдельные счетчики для загрузки и отдачи.
- Счетчики для каждого DHCP-клиента (адрес, назначенный Mikrotik), создаются автоматически.
- Легко сортируемый список с отображением наибольшей загрузки, отдачи и скорости.
- Сброс счетчиков в полночь.
- Запись в лог с общим использованием интернета за день.
Среда:
Ether1 подключен к интернету.
Ether2–5 — локальная сеть (bridge), с активным DHCP-сервером, который выдает IP-адреса на bridge1 (ether2–ether5).
Скрипты используют функцию IP Firewall Mangle passthrough.
Чтобы посмотреть использование, просто зайдите в winbox, выберите меню IP → Firewall и вкладку Mangle. Рекомендую убрать ненужные колонки и добавить следующие: Src. Address, Dst Address, Bytes, Packets, Rate и PacketRate. Кликните по заголовку Bytes, чтобы увидеть главных "потребителей" сверху.
Конфигурация:
Сначала добавьте 2 простых правила IP Firewall Mangle, которые будут отслеживать общий интернет-трафик.
/ip firewall mangle
add action=passthrough chain=forward comment="Download Global Counter" in-interface=ether1
add action=passthrough chain=forward comment="Upload Global Counter" out-interface=ether1
Добавьте следующий код в скрипт DHCP Server Lease. Для этого отредактируйте DHCP-сервер, перейдите на вкладку Script и вставьте туда код:
local hostname [/ip dhcp-server lease get [find where active-mac-address=$leaseActMAC && active-address=$leaseActIP] host-name]
:if ($leaseBound = "1") do={
/ip firewall mangle add action=passthrough chain=forward dst-address=$leaseActIP in-interface=ether1 comment=("Download " . $hostname)
/ip firewall mangle add action=passthrough chain=forward src-address=$leaseActIP out-interface=ether1 comment=("Upload " . $hostname)
/log info ("DHCP Script Mangle Rules Added for HostName " . $hostname . " IP " . $leaseActIP)
} else={
# удаляем старую запись Download для этого IP
:foreach a in=[/ip firewall mangle find dst-address=$leaseActIP] do={
/ip firewall mangle remove $a
}
# удаляем старую запись Upload для этого IP
:foreach a in=[/ip firewall mangle find src-address=$leaseActIP] do={
/ip firewall mangle remove $a
}
/log info ("DHCP Script Mangle Rules Removed for IP " . $leaseActIP)
}
Далее создайте скрипт, который будет запускаться в полночь:
/system script
add dont-require-permissions=yes name=ResetMangleCounters owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/log info (\"Bytes Downloaded Today \" . [/ip firewall mangle get [find where comment=\"Download Global Counter\"] bytes])\n/log info (\"Bytes Uploaded Today \" . [/ip firewall mangle get [find where comment=\"Upload Global Counter\"] bytes])\n\n/ip firewall mangle reset-counters-all\n\n/log info \"IP Firewall Mangle Counters Reset by Script\""
/system scheduler
add interval=1d name=ResetMangleCounters on-event=ResetMangleCounters policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=nov/01/2020 start-time=00:00:00
Скрипт в более читабельном формате:
/log info ("Bytes Downloaded Today " . [/ip firewall mangle get [find where comment="Download Global Counter"] bytes])
/log info ("Bytes Uploaded Today " . [/ip firewall mangle get [find where comment="Upload Global Counter"] bytes])
/ip firewall mangle reset-counters-all
/log info "IP Firewall Mangle Counters Reset by Script"
* Если у вас есть другие кастомные правила MANGLE, вам нужно будет подстроить условия для оператора find в скриптах.
Для первого теста удалите все записи DHCP Server lease и дождитесь, пока устройства начнут получать новые адреса.
Следите за логом, чтобы проверить выполнение скриптов.
Тестировано на RouterOS 6.47.
Буду рад любым предложениям по улучшению или замечаниям по логике.
Цель:
- Отдельные счетчики для загрузки и отдачи.
- Счетчики для каждого DHCP-клиента (адрес, назначенный Mikrotik), создаются автоматически.
- Легко сортируемый список с отображением наибольшей загрузки, отдачи и скорости.
- Сброс счетчиков в полночь.
- Запись в лог с общим использованием интернета за день.
Среда:
Ether1 подключен к интернету.
Ether2–5 — локальная сеть (bridge), с активным DHCP-сервером, который выдает IP-адреса на bridge1 (ether2–ether5).
Скрипты используют функцию IP Firewall Mangle passthrough.
Чтобы посмотреть использование, просто зайдите в winbox, выберите меню IP → Firewall и вкладку Mangle. Рекомендую убрать ненужные колонки и добавить следующие: Src. Address, Dst Address, Bytes, Packets, Rate и PacketRate. Кликните по заголовку Bytes, чтобы увидеть главных "потребителей" сверху.
Конфигурация:
Сначала добавьте 2 простых правила IP Firewall Mangle, которые будут отслеживать общий интернет-трафик.
/ip firewall mangle
add action=passthrough chain=forward comment="Download Global Counter" in-interface=ether1
add action=passthrough chain=forward comment="Upload Global Counter" out-interface=ether1
Добавьте следующий код в скрипт DHCP Server Lease. Для этого отредактируйте DHCP-сервер, перейдите на вкладку Script и вставьте туда код:
local hostname [/ip dhcp-server lease get [find where active-mac-address=$leaseActMAC && active-address=$leaseActIP] host-name]
:if ($leaseBound = "1") do={
/ip firewall mangle add action=passthrough chain=forward dst-address=$leaseActIP in-interface=ether1 comment=("Download " . $hostname)
/ip firewall mangle add action=passthrough chain=forward src-address=$leaseActIP out-interface=ether1 comment=("Upload " . $hostname)
/log info ("DHCP Script Mangle Rules Added for HostName " . $hostname . " IP " . $leaseActIP)
} else={
# удаляем старую запись Download для этого IP
:foreach a in=[/ip firewall mangle find dst-address=$leaseActIP] do={
/ip firewall mangle remove $a
}
# удаляем старую запись Upload для этого IP
:foreach a in=[/ip firewall mangle find src-address=$leaseActIP] do={
/ip firewall mangle remove $a
}
/log info ("DHCP Script Mangle Rules Removed for IP " . $leaseActIP)
}
Далее создайте скрипт, который будет запускаться в полночь:
/system script
add dont-require-permissions=yes name=ResetMangleCounters owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/log info (\"Bytes Downloaded Today \" . [/ip firewall mangle get [find where comment=\"Download Global Counter\"] bytes])\n/log info (\"Bytes Uploaded Today \" . [/ip firewall mangle get [find where comment=\"Upload Global Counter\"] bytes])\n\n/ip firewall mangle reset-counters-all\n\n/log info \"IP Firewall Mangle Counters Reset by Script\""
/system scheduler
add interval=1d name=ResetMangleCounters on-event=ResetMangleCounters policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=nov/01/2020 start-time=00:00:00
Скрипт в более читабельном формате:
/log info ("Bytes Downloaded Today " . [/ip firewall mangle get [find where comment="Download Global Counter"] bytes])
/log info ("Bytes Uploaded Today " . [/ip firewall mangle get [find where comment="Upload Global Counter"] bytes])
/ip firewall mangle reset-counters-all
/log info "IP Firewall Mangle Counters Reset by Script"
* Если у вас есть другие кастомные правила MANGLE, вам нужно будет подстроить условия для оператора find в скриптах.
Для первого теста удалите все записи DHCP Server lease и дождитесь, пока устройства начнут получать новые адреса.
Следите за логом, чтобы проверить выполнение скриптов.
Тестировано на RouterOS 6.47.
Буду рад любым предложениям по улучшению или замечаниям по логике.
