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
- DHCP без синхронизации ARP. RouterOS по умолчанию не чистит ARP при истечении lease — это два разных модуля, они не разговаривают друг с другом.
- Гостевой Wi-Fi с постоянной ротацией устройств. Телефон подключился на пять минут, ушёл — запись осталась на часы.
- Статические записи, добавленные руками когда-то давно. Их никто не трогает, потому что «а вдруг сломается что-то».
- IP-конфликты и спуфинг. Один IP — несколько MAC в таблице одновременно. Само не разрулится.
- Долгий arp-timeout на интерфейсе. По умолчанию запись живёт долго, а если ты ещё и увеличил таймаут «для стабильности» — вот и результат.
- Отключенные устройства без graceful disconnect. Выдернули кабель или сел аккумулятор — роутер не узнал, что хост пропал.
Ну и запросы у вас — сказала ARP-таблица и зависла на середине пинга.
3. Архитектура: как это работает
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. Осложнения
/user group print
/system script print detail where name=arp-cleanup
:local alive [/ping $ip count=3 interval=500ms]
/system scheduler print detail where name=arp-cleanup
/system scheduler set arp-cleanup disabled=no
/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-Аптеку →



