使用 fail2ban,我想根据 apache_access.log 文件的内容禁止 IP。
这是我想要与正则表达式规则匹配的行的示例:
197.221.254.56 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
所以,这是我的 fail2ban 自定义过滤器文件:
[Definition]
failregex = ^<ADDR> - - \[\S+ \S+\] "GET \/ HTTP\/1.0" 400 \S "-" "-"$
ignoreregex =
正则表达式在像‘https://regex101.com/’这样的网站上完美运行
但是当我使用fail2ban-regex工具时,如下所示:
sudo fail2ban-regex /var/log/site1_access.log /etc/fail2ban/filter.d/les400enhttp1-0.conf
我什么都配。
我尝试了这个最简单的正则表达式规则:^<ADDR> - - \[\S+ \S+
并且它有效!
Results
=======
Failregex: 10 total
|- #) [# of hits] regular expression
| 1) [10] ^<ADDR> - - \[\S+ \S+
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [10] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-
Lines: 10 lines, 0 ignored, 10 matched, 0 missed
[processed in 0.03 sec]
但是当我尝试使用正则表达式时:(^<ADDR> - - \[\S+ \S+\]
左方括号]添加到右边)命令'fail2ban-regex'返回我:
Lines: 10 lines, 0 ignored, 0 matched, 10 missed
[processed in 0.03 sec]
|- Missed line(s):
| 36.170.59.167 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 183.228.2.12 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 183.228.2.12 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 126.131.138.146 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 197.221.254.56 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 110.11.157.122 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 220.135.236.27 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 61.231.224.176 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 106.165.107.215 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 61.231.224.176 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
`-
10 错过了!当我添加左方括号 ( ] ) 时,我的示例行均与正则表达式不匹配
我不明白我的错误在哪里...感谢您的帮助:)
答案1
最好以经典的方式捕捉你想要的东西,例如:
\[.*\]
日期模式部分(产生了您注意到的问题)显然由 fail2ban 以特殊的方式处理。
如果您尝试以下模式:
\[\]
讽刺的是,你会发现它也匹配,这意味着方括号内的日期模式被删除了。所以不要考虑这一点。
你可以使用这样的方法:
^<ADDR> -.*\"(GET|POST|HEAD).*HTTP.*\"$
PS. 您的 failregex 确实在过滤器文件中被注释掉了,请确保在进行更改时取消注释。