Автоудаление ошибочных ARP записей на mikrotik

Очистка ARP таблицы MikroTik автоматически: рабочий скрипт, Scheduler, проверка DHCP-аренды, troubleshooting и FAQ.
Быстрый ответ
Очистка ARP таблицы MikroTik делается скриптом в System → Scripts, который пингует каждый динамический адрес и удаляет запись, если хост не ответил. Запускаешь через Scheduler раз в сутки, ночью, при 200+ устройствах — чаще. Ниже готовый скрипт, версия с исключениями для критичных IP и версия с проверкой DHCP-аренды. Копируешь, меняешь интерфейс и IP-диапазон под себя, запускаешь.

1. Диагноз: почему ARP-таблица MikroTik превращается в свалку

Поднял мониторинг. Клиенты жалуются на рандомные обрывы. Смотрю /ip arp print — три сотни записей, половина мёртвая. Знакомо?

Это база: MikroTik держит в ARP таблице соответствие IP и MAC адреса, чтобы не спрашивать сеть заново на каждый пакет. Проблема в DHCP-сетях простая — устройство ушло, договор аренды не переоформился, а запись осталась висеть. Годами.

За час на этой статье получишь:

  • рабочий скрипт очистки ARP для RouterOS
  • пять вариантов под разные сценарии — с белым списком, по возрасту записи, по дублям, с проверкой DHCP
  • настройку автозапуска через Scheduler
  • диагностику, если после настройки всё равно не чистится

Займёт минут 15-20 на первое внедрение, ещё 5 минут на проверку логов через сутки. Нужен доступ к RouterOS через Winbox или SSH с правами full или write.

2. Причины: откуда берётся мусор в ARP

  1. DHCP без синхронизации ARP. RouterOS по умолчанию не чистит ARP при истечении lease — это два разных модуля, они не разговаривают друг с другом.
  2. Гостевой Wi-Fi с постоянной ротацией устройств. Телефон подключился на пять минут, ушёл — запись осталась на часы.
  3. Статические записи, добавленные руками когда-то давно. Их никто не трогает, потому что «а вдруг сломается что-то».
  4. IP-конфликты и спуфинг. Один IP — несколько MAC в таблице одновременно. Само не разрулится.
  5. Долгий arp-timeout на интерфейсе. По умолчанию запись живёт долго, а если ты ещё и увеличил таймаут «для стабильности» — вот и результат.
  6. Отключенные устройства без graceful disconnect. Выдернули кабель или сел аккумулятор — роутер не узнал, что хост пропал.

Ну и запросы у вас — сказала ARP-таблица и зависла на середине пинга.

3. Архитектура: как это работает

Scheduler запускает скрипт

Перебор ARP записей dynamic=yes

Пинг каждого IP

Ответ получен?

Оставляем запись

Удаляем запись

Пишем в лог

4. Системные требования

Компонент Требование
RouterOS v6.45+ или v7.x (проверено на 7.15)
Права доступа full или write + test
Свободное место в логах от 5 МБ, если логируешь подробно
DHCP Server опционально, для скрипта с проверкой аренды

На момент публикации актуальна версия RouterOS 7.16. Перед установкой проверь свежие релизы на сайте MikroTik — там периодически меняют поведение скриптового движка между мажорными версиями.

5. Рецепт: рабочий скрипт очистки ARP

Подготовка

Перед тем как что-то удалять из продакшна — сделай бэкап конфигурации. Это займёт 10 секунд, а нервы сэкономит часы.


/system backup save name=before-arp-cleanup
/export file=before-arp-cleanup-config

Результат: в Files появится два файла с бэкапом. Если скрипт что-то сломает — откатишься за минуту.

Шаг 1. Базовый скрипт очистки

Создай новый скрипт через System → Scripts → Add, назови arp-cleanup, вставь код:


:log info "Запуск очистки ARP-таблицы"
:local total 0
:local removed 0

:foreach entry in=[/ip arp find dynamic=yes] do={
  :local ip [/ip arp get $entry address]
  :local mac [/ip arp get $entry mac-address]
  :set total ($total + 1)

  :local alive [/ping $ip count=2 interval=200ms]

  :if ($alive = 0) do={
    :log warning ("Удаляю неактивную ARP запись: " . $ip . " " . $mac)
    /ip arp remove $entry
    :set removed ($removed + 1)
  }
}

:log info ("Проверено записей: " . $total . ", удалено: " . $removed)

Результат: скрипт прогоняет каждую динамическую запись через пинг, мёртвые удаляет, живые не трогает. В логе видно итоговую статистику.

Шаг 2. Версия с белым списком критичных IP

Сервер, принтер или камера могут временно не отвечать на пинг из-за нагрузки, а ARP-запись при этом трогать нельзя ни в коем случае.


:local excludeIPs {"192.168.1.1";"192.168.1.10";"192.168.1.20"}
:local removed 0

:foreach entry in=[/ip arp find dynamic=yes] do={
  :local ip [/ip arp get $entry address]
  :local skip false

  :foreach ex in=$excludeIPs do={
    :if ($ip = $ex) do={ :set skip true }
  }

  :if (!$skip) do={
    :local alive [/ping $ip count=2 interval=200ms]
    :if ($alive = 0) do={
      /ip arp remove $entry
      :set removed ($removed + 1)
      :log warning ("Удалена запись: " . $ip)
    }
  }
}

:log info ("Удалено записей (кроме белого списка): " . $removed)

Шаг 3. Очистка только старых записей

Не всегда нужно рубить сразу — иногда правильнее дать хосту время вернуться в сеть.


:local maxAge 00:30:00
:local removed 0

:foreach entry in=[/ip arp find dynamic=yes] do={
  :local ip [/ip arp get $entry address]
  :local age [/ip arp get $entry age]

  :if ($age > $maxAge) do={
    :local alive [/ping $ip count=2 interval=200ms]
    :if ($alive = 0) do={
      /ip arp remove $entry
      :set removed ($removed + 1)
      :log warning ("Удалена устаревшая запись: " . $ip . ", возраст " . $age)
    }
  }
}

:log info ("Удалено устаревших записей: " . $removed)

Шаг 4. Поиск и устранение дублей IP

Один IP с двумя разными MAC в таблице — это либо конфликт адресов, либо кто-то балуется спуфингом. В обоих случаях это не диагноз «само пройдёт».

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

:foreach entry in=[/ip arp find dynamic=yes] do={
  :local ip [/ip arp get $entry address]
  :local same [/ip arp find address=$ip dynamic=yes]

  :if ([:len $same] > 1) do={
    :log error ("Дубликат IP обнаружен: " . $ip . ", записей: " . [:len $same])
  }
}

Этот вариант только логирует — удаление дублей руками, пока не убедишься, что это не атака.

Шаг 5. Проверка через DHCP-аренду

Самый точный вариант — сверить ARP с активным DHCP lease. Если lease нет, MAC не совпадает и хост не отвечает — запись можно смело сносить.


:local removed 0
:local mismatch 0

:foreach entry in=[/ip arp find dynamic=yes] do={
  :local ip [/ip arp get $entry address]
  :local mac [/ip arp get $entry mac-address]
  :local hasLease false

  :foreach lease in=[/ip dhcp-server lease find address=$ip] do={
    :local leaseMac [/ip dhcp-server lease get $lease mac-address]
    :if ($leaseMac = $mac) do={
      :set hasLease true
    } else={
      :set mismatch ($mismatch + 1)
      :log error ("MAC не совпадает с DHCP для " . $ip)
    }
  }

  :if (!$hasLease) do={
    :local alive [/ping $ip count=2 interval=200ms]
    :if ($alive = 0) do={
      /ip arp remove $entry
      :set removed ($removed + 1)
    }
  }
}

:log info ("Удалено: " . $removed . ", несоответствий MAC: " . $mismatch)

Шаг 6. Автозапуск через Scheduler


/system scheduler add name=arp-cleanup start-time=03:00:00 interval=1d on-event="/system script run arp-cleanup"

Результат: скрипт стартует каждую ночь в 3:00, когда сеть спит, а не жалуется на пинги.

Размер сети Рекомендуемая частота
До 50 устройств раз в неделю
50-200 устройств каждые 2-3 дня
200+ устройств ежедневно

6. Проверка результата


/log print where topics~"script"
/ip arp print where dynamic=yes
/system scheduler print

Смотри на количество записей до и после — если разница есть, скрипт отработал. Если лог пустой — проверяй права скрипта и синтаксис по шагу ниже.

7. Осложнения

Ошибка: скрипт не удаляет ничего
Причина — таймаут пинга слишком короткий, устройство считается живым по ошибке. Или скрипт запущен без прав policy=test,read,write.

/user group print
/system script print detail where name=arp-cleanup
Ошибка: удаляются рабочие устройства
Причина — хост медленно отвечает на ICMP или фильтрует пинги фаерволом. Решение — увеличь count и interval в пинге, добавь такие устройства в белый список.

:local alive [/ping $ip count=3 interval=500ms]
Ошибка: Scheduler не запускает скрипт
Причина — неверное имя скрипта в on-event или он выключен (disabled=yes).

/system scheduler print detail where name=arp-cleanup
/system scheduler set arp-cleanup disabled=no
Ошибка: address is already in use
Причина — реальный IP-конфликт в сети, не проблема ARP-таблицы роутера. Найди второе устройство с тем же адресом и смени его вручную.

/ip arp print where address=192.168.1.50

8. Альтернативные решения

  • Уменьшение arp-timeout на интерфейсе. Просто, но грубо — чистит всё подряд без разбора критичных устройств.
  • DHCP lease-script с автоматическим удалением ARP при истечении аренды. Элегантно, но требует настройки под конкретный DHCP-сервер и не покроет статику.
  • Внешний мониторинг (Zabbix, LibreNMS) с алертами по размеру ARP-таблицы. Хорошо для контроля, но не решает проблему саму по себе — только сообщает о ней.

Скрипт с пингом и Scheduler выбран как основной, потому что не требует внешних систем, работает «из коробки» и легко настраивается под конкретную сеть за один вечер.

9. Профилактика

Мониторинг: добавь проверку количества ARP записей в Zabbix или через SNMP — рост без причины сигнализирует о проблеме до того, как она станет заметна пользователям.

Бэкап: перед любым изменением скрипта делай /system backup save. Храни минимум 3 последние версии на внешнем хранилище, не на самом роутере.

Автозапуск: проверь, что Scheduler переживает перезагрузку — в RouterOS расписание сохраняется в конфиге автоматически, но убедиться не помешает после апгрейда прошивки.

Капля никотина убивает лошадь. Одна забытая статическая ARP-запись без комментария — весь отдел техподдержки на полдня.

Безопасность

  • Ограничь доступ к RouterOS по SSH только с доверенных IP через firewall
  • Смени порт SSH со стандартного 22
  • Создай отдельного пользователя с правами только на выполнение скриптов, не full admin
  • Включи логирование всех изменений ARP и firewall правил
Порт Протокол Назначение Доступен снаружи?
22 TCP SSH управление Нет, только VPN или whitelist
8291 TCP Winbox Нет
443 TCP HTTPS Webfig Опционально, с ограничением по IP

FAQ

Почему ARP-таблица не чистится после настройки скрипта?
Чаще всего скрипт не привязан к Scheduler или запущен без нужных прав. Проверь /system scheduler print detail и убедись, что policy скрипта включает test и write.

Как проверить что очистка ARP работает правильно?
Смотри лог через /log print where topics~"script" сразу после срабатывания Scheduler — там будет статистика по количеству удалённых записей.

Что делать если после очистки пропадает связь с рабочим устройством?
Добавь его IP в белый список из шага 2 и увеличь count и timeout пинга — вероятно, устройство просто медленно отвечает на ICMP.

Чем скрипт с пингом отличается от уменьшения arp-timeout?
Таймаут чистит всё подряд по времени, без проверки доступности. Скрипт с пингом удаляет только реально недоступные хосты, а живые устройства не трогает даже при долгом простое.

10. Прогноз

Настроил скрипт, добавил Scheduler на ночной запуск, проверил логи через сутки — ARP-таблица теперь чистит себя сама. Пользователи перестанут жаловаться на странные обрывы, а ты перестанешь вручную искать мёртвые записи в списке из трёхсот строк.

Если не заработало
Пиши в комментарии — разберёмся. Приложи вывод /system scheduler print detail и последние строки лога, так быстрее найдём причину.

Оставайтесь на связи

Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.

Подписаться на IT-Аптеку →

Мы ВКонтакте

IT-Аптека — советы, новости и помощь рядом.

Вступить в группу ВКонтакте →
Поделитесь:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх