You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:35:23