fail2是在nginx中查找403请求的常规操作



我想找到403个请求并禁止它们,这是我的日志格式

112.253.6.182 - - [08/Sep/2014:17:42:56 -0400] "GET / HTTP/1.1" 403 579 "baidu" "Mozilla/4.0" 50.117.86.72
106.37.177.251 - - [08/Sep/2014:17:42:56 -0400] "GET /index.php HTTP/1.1" 404 576 "baidu" "Mozilla/4.0" 204.44.65.173
190.254.173.14 - - [08/Sep/2014:17:42:56 -0400] "GET /index.php HTTP/1.1" 404 576 "baidu" "Mozilla/4.0" 204.44.65.173
41.222.196.37 - - [08/Sep/2014:17:42:56 -0400] "GET / HTTP/1.1" 403 579 "baidu" "Mozilla/4.0" 50.117.86.72

我的failreg是:

failregex = ^<HOST> -.*"(GET|POST).*.php.* 403 .*$

ignoreregex=

但是当我使用fail2ban regex命令测试它时,它返回到以下

Failregex: 32 total
|-  #) [# of hits] regular expression
|   1) [32] ^<HOST> -.*"(GET|POST).*.php.* 403 .*$
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
|  [3266] Day/MONTH/Year:Hour:Minute:Second
`-
Lines: 3266 lines, 0 ignored, 32 matched, 3234 missed
Missed line(s): too many to print.  Use --print-all-missed to print all 3234 lines

你能帮我做一个正则表达式来匹配403个请求并打印出ip吗。提前感谢

首先,您的示例日志条目对于/是403,对于/index.php是404,而您的正则表达式试图匹配php扩展名和403代码。难怪你没有对手。

因此,如果您感兴趣的只是一个403错误条目,而不管路径如何,这应该会起作用。

^<HOST> .* "(GET|POST) [^"]+" 403

若要调试正则表达式,可以使用此代码段。请注意,<HOST>通过fail2ban预处理为(?:::f{4,6}:)?(?P<host>S+)

根据@saj的回答,虽然四行日志没有匹配,但从完整日志的测试结果可以明显看出,有32行匹配。也就是说,很明显,新模式(不包括php扩展)确实捕获了更多的403。

一个更简单的匹配模式是:^<HOST> .* 403

这可以通过以下命令行进行测试:

fail2ban-regex '112.253.6.182 - - [08/Sep/2014:17:42:56 -0400] "GET / HTTP/1.1" 403 579 "baidu" "Mozilla/4.0" 50.117.86.72' '^<HOST> .* 403'

对于阳性结果,以及

fail2ban-regex '106.37.177.251 - - [08/Sep/2014:17:42:56 -0400] "GET /index.php HTTP/1.1" 404 576 "baidu" "Mozilla/4.0" 204.44.65.173' '^<HOST> .* 403'

以获得否定的结果。

最新更新