Динамическая блокировка IP адресов через mikrotik с помощью fail2ban

Стабильное решение для блокировки ip которые подбирают пароли к ssh, winbox или пытаются подобрать ключ ipsec. Требуется отдельная от роутера linux машина.

Связь между mikrotik и fail2ban будем делать через лог и API микротика.

Для работы нам понадобиться:

  • mikrotik-шлюз, на котором планируется блокировать адреса
  • linux машина (установку на openwrt/ddwrt я не выполнял, хотя она возможна)
  • установленные пакеты на linux машине: syslog-ng, fail2ban, python3, python3-pip
  • установленная в pip библиотека librouteros (после выполнения предыдущего пункта наберите в консоли от root или с sudo: «pip3 install librouteros»)

В данном случае настройка производится для блокировки попыток подбора ipsec и блокировки подбора пароля пользователя, но схема аналогичная для большинства применений.

Внимание!: в виде linux машины выступала машина с дистрибутивом debian. Если у вас что-то другое, некоторые команды могут отличаться от тех что в статье. Обязательная поддержка по методу блокировки не осуществляется а также я не несу никакой ответственности за ваши действия и их возможные последствия. Думайте плз своей головой.

 

1. Передача логов

На микротике нужно первым делом создать новую группу для доступа только к API, и создать пользователя для наших дел:

  

Создаем группу и пользователя:

  

В Allower address у пользователя можно ( и нужно ) задать IP адрес linux машины, откуда будут призодить запросы на блокировку адресов.

Далее настраиваем отправку нужных логов на linux машину — в Remote Address указываем адрес linux машины:

В вкладке Rules создаем 2 правила (первое на передачу ошибок входа, второе на передачу ошибок соединения по ipsec)

 

 

Также вам нужен адрес-лист, и правило его блокировки:

Также важно убедится, что с вашей linux машины есть доступ на микротик через api:

Скриншоты

 

[свернуть]

2. Получение логов

Теперь идем на linux машину настраивать приемку логов в syslog-ng. syslog-ng — это демон для систематизации получения логов с сетевых устройств, что сильно облегчает как мониторинг так и отслеживание ошибок.

Все действия выполняются из-под root (стать root можно через команду su с вводом пароля рута)  или выполняя все команды, подставляя впереди sudo.

— идем в директорию с конфигурациями

— создаем файл конфигурации для нашего микротика

— создаем директорию для логов (чтобы наш лог не путался с системными)

— открываем и редактируем:

содержимое файла должно быть вот такое:

Ctrl + O — сохраняем изменения

Ctrl + X — выходим из редактора

Перезапускаем сервис:

на данном этапе можно попробовать войти с неверным паролем на микротик — новые строчки должны будут появиться в файле /var/log/remote/mikrotik.log

следить в реальном времени за файлом можно командой:

Остановить мониторинг — Ctrl + C

Для того, чтобы лог-файл не разрастался, нам нужно предоставить системному сервису logrotate информацию о нашем лог-файле:

— Идем в директорию сервиса

открываем файл конфигурации syslog-ng

Идем в конец файла, добавляем следующие строки конфигурации:

Этот конфиг будет держать 7 файлов, при этом старые архивировать, чтобы они занимали еще меньше места. Для разбора настроек можно почитать документацию сервиса logrotate например вот здесь

3. Подготовка окружения fail2ban

Прежде чем мы создадим новый jail, нам нужно подготовить окружение: в filter.d создать правило срабатывания и в action.d создать действие, которое будет использоваться для блокировки адресов. Помимо этого нужно добавить скрипт, который будет контактировать с микротиком от лица fail2ban (чтобы не делать костыли с авторизацией по ssh)

Идем в директорию с фильтрами:

Для начала создаем файл, отвечающий за блокировку неуспешных попыток подключения к ipsec:

fail2ban срабатывает по регулярным выражениям, которые мы ему зададим в фильтрах. Редактируем только что созданный файл

И добавляем в него следующий код:

Последняя строчка остается пустая.

Это был фильтр для ipsec, теперь нам нужен фильтр для неуспешных попыток входа:

(скрипт, подготовка скрипта, тестирование)

Далее нам нужно подготовить скрипт, с помощью которого fail2ban сможет банить и разбанивать ip адреса на нашем микротике (в данном случае банить — занесение в адрес-лист, пакеты от которого будут игнорироваться роутером)

Создаем в папке fail2ban папку для скриптов:

создаем файл, где будет у нас скрипт:

Открываем редактировать, заносим текст скрипта в файл (сам скрипт под спойлером)

Python скрипт

[свернуть]

Чтобы скрипт выполнялся, нам нужно ему дать разрешение на выполнение:

Теперь нам нужно добавить в fail2ban конфигурацию действия:

создаем файл для действия:

Редактируем, заносим содержимое. Сама конфигурация довольно понятная:

в переменной list можем увидеть строчку «ban» — если у вас уже есть правило с другим адрес-листом для этих целей, впишите его сюда (например: list = «block_list»)

4. Настройка fail2ban

Когда окружение готово, можем начать

Чтобы проблем с обновлением fail2ban не произошло, нужно скопировать jail.conf в fail.local — jail.local переписывает конфигурацию и не меняется с обновлениями, так что редактировать будем его.

Jail — это некая единица конфигурации в fail2ban. Она описывает один фильтр и одно действие. Перевести можно как «клетка» — один jail для одной задачи: jail для ошибок входа, jail для ошибок ipsec.

Собираем конфигурацию наших jail-ов:

Немного пояснений. Основные переменные тут: bantime, findtime, maxretry, ignoreip — давайте их разберем

в квадратных скобках вначале кажого jail-а идет его название.

bantime — на какое время ip адрес будет банится (в нашем случае время нахождение в адрес-листе). Можно сделать вечно, верно, но зачем нам держать тонну ip адресов в памяти микротика? Ни вам, ни вашему микротику это не надо, так что эту переменную можно менять, если будет необходимость, начните с 600 секунд.
findtime — время в секундах, в рамках которого «отсчитываются» неверные попытки.
maxretry — количество неверных попыток, которые будут считаться на протяжении времени findtime
ignoreip — ip адреса или CIDR подсети, которые надо игнорировать, как правило нужно внести домашнюю подсеть. Если их несколько, достаточно пробела между адресами.

Добавляем наши jail-ы в конец файла jail.local

Перезапускаем fail2ban

Не забываем добавить в автозагрузку syslog-ng и fail2ban:

5. Итог

По идее на этом все. После перезапуска fail2ban у вас уже начнут работать правила. Можно нарочно выполнить ошибки входа и посмотреть на систему в работе.

 

PS.:

Парочка команд, которые будут полезны при работе с fail2ban

Проверяем список активных jail-ов:

Посмотреть статус по jail-у:

Добавить ip адрес в jail:

Удалить ip адрес из jail-а:

 

Дисклеймер:

Данный метод — не панацея, но сильно упростит жизнь. Автор не несет никакой ответственности за ваши действия и не несет ответственности за любые потери. Поддержка по мере возможности осуществляется в комментариях или по почте san3ko@ya.ru или в telegram: @san3ko.