Как создать fail2ban regex выражение?

Здравствуйте.
Хочу защитить сервер minecraft
В логах есть такие сообщения

14:52:30 [INFO] [/77.45.159.100:51055] <-> InitialHandler has connected
14:52:38 [INFO] [/62.183.66.194:55003] <-> InitialHandler has connected
14:52:47 [INFO] [/46.33.52.200:50698] <-> InitialHandler has connected
14:52:52 [INFO] [/89.147.241.153:25639] <-> InitialHandler has connected
14:52:54 [INFO] [/194.44.127.194:59030] <-> InitialHandler has connected
14:52:56 [INFO] [/5.248.38.199:49935] <-> InitialHandler has connected
14:53:05 [INFO] [/46.188.123.234:17907] <-> InitialHandler has connected
14:53:05 [INFO] [/46.188.123.234:17900] <-> InitialHandler has connected
14:53:16 [INFO] [Tanya] -> UpstreamBridge has disconnected
14:53:16 [INFO] [Tanya] disconnected with: §f[Proxy] Lost connection to server.
14:53:16 [INFO] [Tanya] <-> DownstreamBridge <-> [lobby] has disconnected
14:53:18 [INFO] [/91.79.163.142:50687] <-> InitialHandler has connected
14:53:18 [INFO] [/178.140.46.18:53260] <-> InitialHandler has connected

Вот тех кто более 3 раз в минуту InitialHandler has connected - кидать в бан.
Я так понял что нужно сделать regex для строки типа
14:53:18 [INFO] [/178.140.46.18:53260] <-> InitialHandler has connected

Но как сделать - ума не приложу.
Может кто подскажет с чего начать или саму строчку?
  • Вопрос задан
  • 10071 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Fess
Моя версия fail2ban
#fail2ban-server -V
Fail2Ban v0.9.3

в файл /etc/fail2ban/jail.local добавить:
[minecraft]
filter   = minecraft
enabled  = true
logpath  = full_path_to_minecraft_logs
bantime  = 3600
findtime  = 60
maxretry = 3

[minecraft] - название файла-фильтра (minecraft.conf), либо (если назвали секцию как-нибудь произвольно), используем директиву filter;
filter - указывает название файла-фильтра( в нашем случае minecraft.conf) без расширения;
findtime и bantime в секундах;
maxretry - количество вхождений строки в лог;
logpath - полный путь к файлам логов. Можно использовать * и ? как знаки-подстановки.

В файле-фильтре /etc/fail2ban/filter.d/minecraft.conf пишем следующее:
[Definition]
failregex = \[INFO\] \[\/<HOST>:\d+\] <-> InitialHandler has connected$
ignoreregex =

-----------------------------------------------
Правила, используемые вашей версией fail2ban зависят от версии питона, используемого на системе.
#python -V
Python 2.6.6

Документация на модуль регулярных выражений python 2.7: https://docs.python.org/2/library/re.html
Учитывайте, что флаг re.MULTILINE уже используется в fail2ban. Т.е. знаки ^ и $ матчат начало и конец строки.

Нюансы написания фильтров для fail2ban: www.fail2ban.org/wiki/index.php/MANUAL_0_8#Filters

Инструменты для проверки регулярный выражений:
https://regex101.com/#python
https://www.debuggex.com/
Рекомендую первую ссылку.

Принцип простой:
  • Указали язык регулярок python
  • Текст для примера (логи), который хотим разобрать регулярками
  • В поле для регулярных выражений пишем регулярку и, по мере набора регулярки, смотрим, как матчится регулярка на наш текст.


Для примера(на первом ресурсе):
  • в поле текста забейте свои логи
  • в поле gmixsu напишите gm (это аналог служебных флагов для выражения, вроде re.MULTILINE в python'е)
  • в поле регулярки забиваем [0-9] - выделит все цифры как отдельные элементы. Значения элементов выражения смотрим в подсказках.
  • Добиваем регулярку до вида: [0-9]+ - имеем 4 цифры как отдельные элементы: т.е. ip 192.168.0.1 разбивается на элементы 192, 168, 0 и 1
  • Точка в регулярках - спец. символ. Мапится в любой один знак. Экранируем его, ибо ищем точку, а не любой символ, иначе символ _ в строке 192_ так же попадёт под выражение.
  • Итого, приведём выражение к виду [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+. Сразу понятно будет, что этим выражением выделим все ip адреса в логах.

Снимите флаг g в примере(поле gmixsu ;)) и напишите регулярное выражение заново. По мере набора, будет понятно, зачем конструкция [0-9]+\. повторяется несколько раз в итоговой регулярке.

Данное выражение можно построить и более изящно, но на первом этапе важно понимание работы регулярок. Потом можно будет строить и более сложные выражения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы