Скрипт сравнения ARP и DHCP leases для ROS7

Боремся с мусором в 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. Если у вас несколько подсетей, можно создать отдельные скрипты для каждой или модифицировать этот под массив сетей. Пишите в комментариях, если нужна помощь с адаптацией.

 

Оставьте комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

 
Чат

Здравствуйте. У вас возникли вопросы? Мы с удовольствием ответим!