我想找到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。提前致谢
答案 0 :(得分:2)
首先,您的示例日志托管是/
的403s,/index.php
的404s,而您的正则表达式尝试匹配 php 扩展名和403代码。难怪你没有比赛。
因此,如果您的兴趣只是403错误条目,无论路径如何,这都应该有效。
^<HOST> .* "(GET|POST) [^"]+" 403
要调试正则表达式,可以使用this snippet。请注意, fail2ban 会将<HOST>
预处理到(?:::f{4,6}:)?(?P<host>\S+)
。
答案 1 :(得分:0)
根据@ saaj的回答,虽然四行日志没有匹配,但从完整日志的测试结果可以明显看出有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'
表示否定结果。