为fail2ban编写可用的Apache AH10244错误正则过滤规则
Fail2Ban Apache AH10244日志过滤配置问题解答
问题背景
我的Apache2 error.log包含以下日志条目:
[Thu Jan 12 09:18:51.078445 2023] [core:error] [pid 47992] [client 152.89.196.211:53158] AH10244: invalid URI path (/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh) [Wed Jan 11 06:01:09.820582 2023] [core:error] [pid 30833] [client 185.225.74.55:39856] AH10244: invalid URI path (/cgi-bin/.%%%%32%%65/.%%%%32%%65/.%%%%32%%65/.%%%%32%%65/.%%%%32%%65/bin/sh) [Wed Jan 11 17:16:49.643509 2023] [core:error] [pid 41882] [client 152.89.196.211:52746] AH10244: invalid URI path (/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh)
我用命令行测试正则有效:
fail2ban-regex test.log '.*\[client <HOST>:\d+\] AH10244.*$'
但将正则写入filter.conf后:
[Definition] failregex = .*\[client <HOST>:\d+\] AH10244.*$ ignoreregex =
执行测试时Fail2Ban报错:
Running tests ============= Use failregex line : filter.conf ERROR: No failure-id group in 'filter.conf'
1. 如何将该正则正确封装到.conf文件中?
分两步修正:
- 修正配置文件中的正则:把配置里的
<HOST>改成<HOST>——命令行里用<是为了避免Shell转义,但配置文件里直接写Fail2Ban的原生变量<HOST>即可,不需要HTML转义。修正后的配置:[Definition] failregex = .*\[client <HOST>:\d+\] AH10244.*$ ignoreregex = - 使用正确的测试命令:测试配置文件时,要把配置文件路径作为第二个参数传给
fail2ban-regex,而不是把文件名当成正则字符串。示例命令:fail2ban-regex /var/log/apache2/error.log /etc/fail2ban/filter.d/your-filter.conf
2. 该错误提示的含义是什么?
这个错误是因为你执行fail2ban-regex时,误将配置文件名filter.conf当作了正则表达式字符串来解析。Fail2Ban会尝试把filter.conf这个文本当作正则去匹配日志,但其中没有包含<HOST>(Fail2Ban用来捕获客户端IP的预定义组),自然无法识别到失败事件的标识(failure-id),因此报错。
简单说:命令用错了,把配置文件当成了正则文本参数。
3. 能否并如何利用apache-common.conf中的预定义内容增强正则的健壮性?
完全可以。apache-common.conf中定义了大量适配Apache日志的通用正则片段,能避免自己写冗余的正则,同时适配不同的Apache日志格式。
具体操作:
- 在你的filter配置文件顶部添加
before = apache-common.conf,引入预定义规则 - 使用预定义的正则变量重构
failregex:[Definition] before = apache-common.conf failregex = %(apache_error_log)s \[client %(apache_client_host)s\] AH10244:.* ignoreregex =
其中:
%(apache_error_log)s:匹配Apache错误日志的前缀(包含时间戳、日志级别、进程ID等),适配不同的时间格式和日志前缀%(apache_client_host)s:匹配客户端IP和端口的部分,替代自己写的<HOST>:\d+,更通用
这样的正则不仅更简洁,还能兼容不同的Apache日志配置,健壮性更强。
内容的提问来源于stack exchange,提问作者JB0x2D1
相关产品推荐
相关产品推荐

