Я весь день ломал голову, пытаясь сопоставить свой фильтр regex с моим access.log, но безуспешно. Я установил fail2ban на сервере gentoo, и он отлично работает (я вручную забанил свой собственный IP, и это работает), но регулярное выражение fail2ban не работает и возвращает 0 результатов с фильтрами, хотя мой сайт сейчас и последние пару дней подвергается атаке с высокой нагрузкой.
Кстати, я не использую программное обеспечение iptables на своем сервере (нужно ли мне его устанавливать, чтобы fail2ban работал?). Думаю, fail2ban не может прочитать мой формат журнала или формат времени. Я пытался все настроить, но безуспешно. Любая помощь будет очень и очень признательна.
Вот моя тюрьма.местная
[INCLUDES]
before = paths-common.conf
[DEFAULT]
action=%(action_mwl)s
ignoreip = 127.0.0.1/8 192.168.99.25
ignorecommand =
bantime = 86400
findtime = 300
backend = gamin
[wp-login]
enabled = true
filter = wp-login
banaction=iptables-allports
logpath = /var/log/nginx/localhost*access_log
bantime = 7200
maxretry = 1
[nginx-nohome]
enabled=true
port=http,https
filter=nginx-nohome
logpath=/var/log/nginx/localhost.error.log
bantime=86400
maxretry=2
[nginx-dos]
enabled = true
port = http,8090,8080
filter = nginx-dos
logpath = /var/log/nginx/localhost.access*log
findtime = 30
bantime = 172800
maxretry = 140
[nginx-login]
enabled = true
filter = nginx-login
action = iptables-multiport[name=NoLoginFailures, port="http,https"]
logpath = /var/log/messages
bantime = 7200
maxretry = 6
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
logpath = /var/log/nginx/localhost.access*log
findtime = 600
bantime = 7200
maxretry = 10
а вот мои фильтры:
[Definition]i
failregex = limiting requests, excess:.* by zone.*client: <HOST>
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
~
[Definition]
failregex = ^<HOST> -.*GET */wp-login* HTTP/1\.."
ignoreregex =
#
[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\scgi)
ignoreregex =
[Definition]
failregex = ^<HOST> -.*GET .*/~.*
ignoreregex =
~
На стороне nginx синтаксис и вывод моего формата журнала выглядит следующим образом:
формат журнала
log_format main
'[$time_local] - $remote_addr '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" ';
Вывод accesslog:
[01/Oct/2015:09:15:52 +0800] - 60.18.17.206, 113.21.15.23 "POST/httprl_async_function_callback?count=121 HTTP/1.1" 200 1351 "-" "Drupal (+http://drupal.org/)" "-"
Формат журнала ошибок:
2015/09/22 00:04:06 [error] 7418#0: *287 FastCGI sent in stderr: "Primary scriptunknown", client: 192.168.99.76, server: www.sams.com, request: "GET/city HTTP/1.0", host: "www.sams.com"
ОБНОВЛЯТЬ: Мой сайт не использует WordPress, но я получаю миллионы ссылок, связанных с WordPress, ссылку wp-login.php, которые я хочу заблокировать. Существует много агрессивных вредоносных поисковых ботов, рекламных ботов, пауков, которые также ломают мой сервер. Я хочу заблокировать
решение1
Так что, похоже, вы не очень хорошо знакомы с регулярными выражениями, у вас крутая кривая обучения. Утилита fail2ban используетрегулярные выражения python, стоит немного прочитать эту страницу.
Часть проблемы, с которой вы столкнулись, заключается в этой части вашего failregex
^<HOST>
Здесь говорится, что нужно искать предопределенное <HOST>
регулярное выражение в начале строки (или сразу после новой строки), вот для чего оно ^
предназначено.
Глядя на ваши примеры логов, все они начинаются с даты/времени, это удаляется fail2ban до того, как регулярное выражение применяется к остальной части строки. Строка не начинается ни с чего, что '^' мог бы распознать, поэтому ваше регулярное выражение не срабатывает.
Простой пример использования вашей записи errorlog. Если вы хотите предпринять действия для scriptunknown
ошибок (что может быть как хорошим, так и не очень), вы можете использовать failregex, например
failregex= scriptunknown", clinet: <HOST>
Вы можете проверить это, запустив его через файл журнала, используяfail2ban-регулярное выражение(1)например
fail2ban-regex /path/to/logfile 'scriptunknown", client: <HOST>'
Running tests
=============
Use failregex line : scriptunknown", client: <HOST>
Use log file : /path/to/logfile
Use encoding : UTF-8
Results
=======
Failregex: 1 total
|- #) [# of hits] regular expression
| 1) [1] scriptunknown", client: <HOST>
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [1] Day(?P<_sep>[-/])MON(?P=_sep)Year[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
| [1] Year(?P<_sep>[-/.])Month(?P=_sep)Day 24hour:Minute:Second(?:,Microseconds)?
`-
Lines: 2 lines, 0 ignored, 1 matched, 1 missed [processed in 0.00 sec]
|- Missed line(s):
| [01/Oct/2015:09:15:52 +0800] - 60.18.17.206, 113.21.15.23 "POST/httprl_async_function_callback?count=121 HTTP/1.1" 200 1351 "-" "Drupal (+http://drupal.org/)" "-"
Хорошо, это может сделать то, что вам нужно, но это может быть слишком широко, вам придется смотреть на результаты и делать соответствующие выводы.
Кстати, я не использую программное обеспечение iptables на своем сервере (нужно ли мне его устанавливать, чтобы fail2ban работал?)
Вам нужен какой-то брандмауэр, совместимый с fail2ban, установленный и работающий в вашей системе. Как вы его протестировали и
Я вручную забанил свой IP и это работает
Тогда, я думаю, что есть что-то, выполняющее эту работу.