Fail2ban无法匹配other_vhosts_access.log中异常请求的问题排查
Apache多域名重定向日志的Fail2ban规则问题
环境与日志情况
- 服务器运行Apache,多个重定向域名的访问日志统一写入
other_vhosts_access.log - 日志格式特殊,每行开头带有
主机名:端口字段,示例:
host.name:80 1.2.3.4 - - [26/Oct/2022:14:18:59 +0100] "GET / HTTP/1.1" 302 498 "-" "browser_string_here" other.host.name:80 5.6.7.8 - - [26/Oct/2022:14:22:45 +0100] "\x16\x03\x01" 400 0 "-" "-"
- 系统环境:Debian Buster,Fail2ban版本0.10.2(发行版默认)
需求与现有规则
核心需求:拦截所有未使用GET、HEAD、POST这三种合法请求方法的请求(比如示例中的第二行非法请求)
现有配置的过滤规则:
[INCLUDES] before = common.conf [Definition] failregex = ^\S+ <ADDR> - - .*$ ignoreregex = GET HEAD POST
规则逻辑:通过ignoreregex忽略包含合法请求方法的日志行,用<ADDR>匹配客户端IP(避免匹配开头的主机名字段),以此定位非法请求。
问题现象
- 用
fail2ban-regex测试时,ignoreregex能正常过滤合法请求,但failregex完全无法匹配目标非法行 - 日志的日期格式无法被自动识别,手动添加
datepattern后仍无改善 - 单独测试单条非法日志行时规则有效,但对整个日志文件测试就失效
- 推测问题出在Fail2ban的LN-BEG预设上——行首的
主机名:端口字段导致行首匹配逻辑异常
解决方案
1. 修正过滤规则配置
修改后的完整过滤规则:
[INCLUDES] before = common.conf [Definition] # 明确指定日志的日期格式,解决日期识别失败问题 datepattern = ^\S+ \S+ - - \[%%d/%%b/%%Y:%%H:%%M:%%S %%z\] # 直接在正则中排除合法请求方法,同时确保行首到IP的匹配逻辑正确 failregex = ^\S+ <ADDR> - - \[.*?\] "(?!GET|HEAD|POST).*" .*$
2. 规则调整说明
- 日期格式指定:
datepattern精准对应日志中日期字段的位置,让Fail2ban能正确解析日志时间,避免因日期识别失败导致的匹配异常 - 负向预查替代ignoreregex:用
(?!GET|HEAD|POST)这个负向预查直接在failregex中排除合法请求,避免ignoreregex和failregex的规则冲突,同时简化逻辑 - 完整行匹配:覆盖从行首主机名到请求字段的完整片段,确保LN-BEG能正确识别行首,解决单条测试有效、文件测试无效的问题
3. 验证方法
执行以下命令测试修改后的规则:
fail2ban-regex /var/log/apache2/other_vhosts_access.log /etc/fail2ban/filter.d/your-filter-name.conf
确认非法请求行被正确命中,合法请求被排除即可。
4. 可选优化
如果需要更精准拦截(比如只针对返回400错误的非法请求),可以把failregex修改为:
failregex = ^\S+ <ADDR> - - \[.*?\] "(?!GET|HEAD|POST).*" 400 .*$
内容的提问来源于stack exchange,提问作者meldh
相关产品推荐
相关产品推荐

