Реализация выполнена при помощи встроенных триггеров RouterOS, без использования внешних сервисов и без периодических запусков скриптов по шедулеру.
Сразу отмечу, что fail2ban нельзя использовать как полноценный инструмент защиты доступа к управлению маршрутизатором. Доступ к службам управления по‑умолчанию должен быть закрыт фаерволом из всех сетей за исключением management. И, возможно, с адресов из локального «белого списка». Fail2ban, применяется к management‑интерфейсу на случай, когда злоумышленник уже получил доступ в подсеть управления. Либо в подсети управления оказался вирус, троян, нелояльный пользователь. Также бывали случаи, когда трафик управления мог пропускаться из‑за ошибки в правилах фаервола. Итак, fail2ban, это скорее последний уровень защиты управления маршрутизатором.
Для начала создаем скрипт, который будет выполнять работу по поиску и извлечению адреса из тела сообщения системы «$message». Помещаем скрипт в системную библиотеку скриптов /system scripts на маршрутизаторе и присваиваем скрипту название «loginfail2ban».
:local ListName "BlackList1" :local BanTime 1d :local LogMess "fail2ban added address " :local at [:find $message " from "] :local r1 [:pick $message ($at + 6) [:find $message " via " $at]] :if (([:typeof [:toip $r1]])="ip") do={ :do {/ip firewall address-list add list=$ListName address=([:toip $r1]) timeout=$BanTime; :log warning ($LogMess.[tostr $r1] ." to list ".$ListName); exit } \ on-error={ :log warning ("address IPv4 already exist in ".$ListName); exit} } :if (([:typeof [:toip6 $r1]])="ip6") do={ :do {/ipv6 firewall address-list add list=$ListName address=([:toip6 $r1]) timeout=$BanTime; :log warning ($LogMess.[tostr $r1]." to list ".$ListName); exit } \ on-error={ :log warning ("address IPv6 already exist in ".$ListName); exit} } :log warning "Fail2ban - no address found to block bruteforce"
Переменная «ListName» содержит имя для address‑list фаервола. Переменная «BanTime» указывает время на которое будет добавлена динамическая запись в адрес‑листе.
После этого нужно включить механизм активации скрипта при неудачном логине. Делается это в контексте /system logging
/system logging action add name=fail2ban target=script script=loginfail2ban /system logging add action=fail2ban regex=“^login failure” topics=system,error,critical
Первое действие описывает новый action=script вызывающий ранее созданный скрипт с именем «loginfail2ban», хранящийся в библиотеке скриптов.
Второе действие создает непосредственный триггер, который срабатывает только при возникновении сообщения с сочетанием топиков «system+error+critical» и при наличии в начале сообщения подстроки «login failure».
Особенности эксплуатации:
Скрипт умеет обрабатывать адреса и протоколов IPv6 и IPv4.
Скрипт пропускает MAC‑адреса, так как протоколы MAC‑Winbox и MAC‑Telnet не блокируются привычным IP/IPv6 фаерволом.
Скрипт срабатывает при любом неправильном вводе пароля. По этому есть шанс попасть в бан при первом же неправильном вводе пароля. Об этом вам предстоит позаботиться заранее самостоятельно.
В фаерволе ip и ipv6 должны существовать правила, блокирующие доступ с src‑address‑list=BlackList1 (название списка приведено для примера и его можно менять)
Комментарии (7)

timru
09.10.2026 13:36Указал, что входить в админку возможно только из LAN и прописал именно ее.
При разделении сетей, вообще можно в отдельный порт воткнуть, тогда уже аппаратно будет защищена админка - то есть выдача связи и т.п. происходит по одной сети, а администрирование устройств по другой.
В общем обычная практика системного администрирования.

Dupych
09.10.2026 13:36Winbox на другом порту.
Все остальное выключено.
Поэтому недавняя уязвимость SSH меня даже не напрягла.
Доспут открывается Port Knocking на 2 часа.
Работает 5 лет и нет проблем

NAI
09.10.2026 13:36А можно на
микротикеподнятьконтейнер CaddyNGINX , втащить туда mTLS, выставить webfig (оно нынче от винбокса ничем не отличается) и перестать нагружать железку фигней. Причем настроить так что если клиент не предоставляет сертификат, то сразу дропать соединение.И это можно даже в интернет выставить
bloomeatt
Залипла клавиша, пароль не попал в буфер обмена - выстрел себе в ногу. Задумка интересная, но, ИМХО, не очень полезная.
Вся система в целом, хоть и не очень изящно, но довольно просто решается нативными правилами firewall с каскадом из адрес-листов на каждую попытку. На худой конец есть port-knocking.
boroda_el
по идее такая система должна после нескольких попыток банить на короткое время, если в течении него опять долбятся - продляем, роботы быстро себя догонят до 30 дней.
shanker
А разве port-knocking - это не каскад из адрес-листов на каждую попытку? Судя по статье «Port Knocking» на устройствах MikroTik - это одно и то же. Ну, и я также на своём MikroTik port knocking настраивал, как в приведённой мной статье.
shanker
Я вот тоже не понял: чем Fail2ban лучше port knocking? Писал статью Практические варианты использования port knocking. Указывал там и про различия fail2ban касательно port knocking.