我有这个针对 apache 日志的 fail2ban 监狱(目前有一些小的值,所以我可以进行实验):
enabled = true
maxretry = 3
bantime = 10
findtime = 5
action = 429-ban
我使用(并发数:10,请求数:10000)对其进行压力测试ab
,我的自定义过滤器几乎立即捕获“高”流量并禁止该 IP。
问题是,10 秒后,禁令到期,如果我继续运行ab
,fail2ban 日志将充满以下内容:
Ignore 192.168.XX.XX, expired bantime
Ignore 192.168.XX.XX, expired bantime
Ignore 192.168.XX.XX, expired bantime
从那时起,很长一段时间内,都没有发生任何禁令。同时,即使我停止,fail2ban 日志也会显示正在处理ab
。如果我等待足够长的时间并确认 fail2ban 日志活动停止,则重新启动压力测试会有效地禁止该 IP。
我的问题是:
- 这
expired bantime
到底意味着什么? - 尽管压力测试早已停止,但 fail2ban 似乎仍会继续处理
ab
。是否有可能 fail2ban 上存在某种缓冲区,我可以减少它,这可能也能解决我的第一个问题?
答案1
这个过期的禁令到底意味着什么?
这意味着,根据您的配置,如果禁令发生,禁令将立即失效,因此禁令之后将立即调用解禁,这样就不需要再执行禁令过程。
禁令结束时间的计算公式为:
end_of_ban = time_of_last_known_failure_causing_ban + bantime
发生这种情况是因为与您的配置相关的大量消息的封禁结束可能比现在要少,因此 fail2ban 过滤器忽略了这一点,只是在搜索其他消息。
另一种可能是您的封禁操作实际上不起作用,因此被封禁的“入侵者”(或者更确切地说是模拟压力测试者)仍然能够生成消息,因此这
确实会淹没日志。或者 fail2ban 无法以比您生成消息更快的速度滚动日志。
尽管 ab 的压力测试早已停止,但 fail2ban 似乎仍会继续处理事情
这确实表明您的配置存在问题:正则表达式速度慢、操作错误等,甚至消息太多。
请查看fail2ban wiki :: 最佳实践描述某些优化。
是否有可能在 fail2ban 上存在某种缓冲区,我可以减少它
不是的。但是如果你改变一下程序,你也许可以减少寄生日志流量:
- 不要监控包含太多消息的访问日志或使用优化的正则表达式(以及更合适的日志格式)来提高过滤器的速度(行匹配);
- 尝试使用 web-server 的一些模块(例如 nginx 的 limit-req 和 fail2ban 的过滤器等)nginx 限制请求)而不是扫描访问日志;
- 或者使用更合适的方法来生成更少的日志消息,例如使用 iptables 和 limit-burst 或其他类似方法记录 IP 的 http 数据包。