Боремся с мусором в ARP таблице MikroTik: скрипт для автоматической очистки
Привет, коллеги! Сегодня поделюсь с вами небольшим, но очень полезным скриптом для RouterOS, который решает одну из тех “мелких” проблем, которые со временем превращаются в головную боль.
Откуда берется проблема?
Если у вас в сети много мобильных устройств (ноутбуки, телефоны, планшеты), которые постоянно подключаются и отключаются от Wi-Fi, то вы наверняка сталкивались с ситуацией, когда ARP таблица на MikroTik начинает раздуваться. Устройства получают IP по DHCP, создают ARP записи, а потом уходят из сети. DHCP lease истекает и освобождается, а вот ARP запись может висеть еще долго.
Особенно это заметно в офисах, коворкингах, гостиницах – везде, где много “проходных” устройств. ARP таблица засоряется, производительность падает, а в некоторых случаях может даже возникнуть нехватка места в таблице.
Как решить проблему автоматически?
Написал скрипт, который периодически сравнивает ARP таблицу с активными DHCP lease и удаляет “осиротевшие” записи. Логика простая:
- Если в ARP есть запись, а соответствующего DHCP lease нет = удаляем
- Трогаем только динамические ARP записи в указанной подсети
- Статические записи остаются нетронутыми
# Скрипт для очистки ARP таблицы от записей, не имеющих соответствующих DHCP lease # Работает только с подсетью 192.168.88.0/24 # Инициализируем пустой массив для хранения MAC адресов из DHCP :local dhcpMacs [:toarray ""] # Собираем MAC адреса из DHCP leases только для подсети 192.168.88.0/24 :foreach leaseId in=[/ip dhcp-server lease find] do={ :local leaseIP [/ip dhcp-server lease get $leaseId address] # Проверяем принадлежность IP к сети 192.168.88.0/24 через битовую маску :if (([:toip $leaseIP] & [:toip "255.255.255.0"]) = [:toip "192.168.88.0"]) do={ # Добавляем MAC адрес в массив :set dhcpMacs ($dhcpMacs, [/ip dhcp-server lease get $leaseId mac-address]) } } # Проверяем динамические ARP записи из диапазона 192.168.88.0/24 :foreach arpId in=[/ip arp find dynamic=yes] do={ :local arpIP [/ip arp get $arpId address] :local arpMac [/ip arp get $arpId mac-address] :local inDhcp false # Проверяем принадлежность IP к целевой подсети :if (([:toip $arpIP] & [:toip "255.255.255.0"]) = [:toip "192.168.88.0"]) do={ # Ищем MAC адрес в списке DHCP lease :foreach dhcpMac in=$dhcpMacs do={ :if ($arpMac = $dhcpMac) do={ :set inDhcp true } } # Если MAC адрес не найден в DHCP — удаляем ARP запись :if ($inDhcp = false) do={ :log warning ("Удаляю ARP запись: MAC=" . $arpMac . " IP=" . $arpIP) /ip arp remove $arpId } } } # Уведомление о завершении проверки :log info "Проверка и очистка ARP таблицы для сети 192.168.88.0/24 завершена"
Заключение
Маленький скрипт, а пользы от него много. Особенно рекомендую для сетей с активной ротацией устройств. У меня после внедрения размер ARP таблицы уменьшился в 2-3 раза, а “странные” проблемы с подключением новых устройств практически исчезли.
Скрипт безопасен – трогает только динамические ARP записи и работает с указанной подсетью. Но все же рекомендую сначала протестировать в лабе или на менее критичном оборудовании.
Буду рад обратной связи и предложениям по улучшению!
P.S. Если у вас несколько подсетей, можно создать отдельные скрипты для каждой или модифицировать этот под массив сетей. Пишите в комментариях, если нужна помощь с адаптацией.