fail2ban 正则表达式过滤器不适用于 nginx 日志文件

fail2ban 正则表达式过滤器不适用于 nginx 日志文件

我整天都在绞尽脑汁尝试将正则表达式过滤器与我的 access.log 匹配,但毫无进展。我在 gentoo 服务器上安装了 fail2ban,它运行良好(我手动禁止了自己的 IP,它运行正常),但 fail2ban 正则表达式失败,使用过滤器返回 0 个结果,即使我的网站现在和过去几天遭受了重负载攻击。

顺便说一下,我的服务器上没有使用 iptables 软件(我需要安装一个才能让 fail2ban 工作吗?)我猜 fail2ban 无法读取我的日志格式或时间格式,我尝试调整一切但没有成功,任何帮助都非常非常感谢

这是我的 jail.local

[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" ';

访问日志输出:

[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 会将其删除。该行不以“^”可以识别的任何内容开头,因此您的正则表达式失败了。

使用错误日志条目的简单示例。如果您想对scriptunknown错误采取行动(这可能是好事,也可能不是好事),您可以使用类似以下的失败正则表达式:

failregex= scriptunknown", clinet: <HOST>

您可以通过使用日志文件运行它来测试它fail2ban-regex(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,并且成功了

那么我猜想那里一定有什么东西在起作用。

相关内容