如何创建匹配非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
相关产品推荐
相关产品推荐

