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

如何创建匹配非200/412响应码的Fail2Ban过滤器?

如何创建匹配非200/412响应码的Fail2Ban过滤器?

问题背景

需要创建一个Fail2Ban过滤器,捕获所有目标路径下响应码不为200或412的请求。日志格式示例如下:

INFO [2024-06-13 10:23:58] 172.20.101.132 "PostmanRuntime/7.37.3" 172.30.19.97:18000 POST /micirugia/login 200 0.084 NA
INFO [2024-06-13 11:20:06] 172.20.100.105 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0" 172.30.19.97:18000 GET / 405 0.012 NA

日志字段包含:

  • 固定前缀INFO
  • 方括号内的日期时间
  • 源IP地址
  • 带引号的用户代理
  • 目标IP:端口
  • 请求方法+路径
  • 3位响应码
  • 毫秒级处理时间
  • 序列号(可为NA或其他字符串)

之前尝试的正则未成功:

failregex = ^INFO \[\] <HOST> ".*?" \S+:\d+ (GET|POST) .* \S+ (400|404|505) \d+\.\d{3} NA$

问题分析

之前的正则存在几个关键问题:

  • 日期时间部分写为\[\],未匹配实际的日期格式
  • 响应码部分硬编码了几个错误码,无法覆盖所有非200/412的情况
  • 最后只匹配NA序列号,忽略了其他可能的字符串
  • 路径部分的.*过于宽泛,可能导致匹配混乱

解决方案

正确的Fail2Ban正则过滤器

failregex = ^INFO \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] <HOST> ".*?" \S+:\d+ (GET|POST) \S+ (?!200|412)\d{3} \d+\.\d{1,3} \S+$

正则各部分解释

  • ^INFO \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\]:精准匹配开头的INFO标签和标准格式的日期时间
  • <HOST>:Fail2Ban内置变量,自动识别并提取源IP地址
  • ".*?":匹配带双引号的完整用户代理字符串(非贪婪匹配,避免跨字段匹配)
  • \S+:\d+:匹配目标IP地址和端口号(非空白字符+冒号+数字)
  • (GET|POST):匹配请求方法,若需要支持PUT、DELETE等,可扩展为(GET|POST|PUT|DELETE)
  • \S+:匹配请求路径,若要限定特定路径(比如仅/micirugia/下的请求),可替换为/micirugia/.*
  • (?!200|412)\d{3}:核心逻辑,使用负向预查排除200和412,匹配其他所有3位HTTP响应码
  • \d+\.\d{1,3}:匹配处理时间,支持1-3位小数(比如0.04或0.084)
  • \S+$:匹配最后的序列号,支持NA或任意非空白字符串

验证方法

使用fail2ban-regex工具测试正则是否正确匹配日志:

fail2ban-regex /var/log/your-app.log /etc/fail2ban/filter.d/your-custom-filter.conf

执行后会输出匹配统计,确认非200/412的请求被正确捕获。

内容的提问来源于stack exchange,提问作者Andres Mora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:20:55