设置 我在 ubuntu 服务器上运行 apache。我创建了一个 fail2ban 规则,当他们请求太多页面太快时禁止 ip。
# Fail2ban Rule
failregex = ^.*?(:80|:443) <HOST> - .* "(GET|POST|HEAD).*$
ignoreregex =.*(.ico|.jpg|.png|.gif|.js|.css|.woff|.mp4)
findtime = 30
maxretry = 10
目标:
我想针对这个新的 fail2ban 规则运行一个旧的 apache 日志,以便我可以查看它是否会禁止任何合法请求。
尝试#1 我认为我可以使用fail2ban-regex 来获取可能被禁止的用户列表,但它没有该功能。
尝试#2 我认为将历史日志回显到fail2ban 当前正在观看的日志中会使它们被解析。在修复了一个小挂断后,忽略了具有旧日期的日志行(通过向它们添加一年来修复)fail2ban 开始解析它们并禁止其中的 IP。但是,我只需要查看第一个被禁止的 IP 就知道它是错误的。有问题的 IP 总共只发出了 10 个请求,而且它们在时间上并不接近。我只能假设 fail2ban 没有使用日志行的时间戳来确定有效性,这使得这种测试方法失败了。
# echo example
zcat other_vhosts_access.log.8.gz | sed -n 's/\/2022:/\/2032:/p' >> /var/log/apache2/fail2ban_test.log
结论 由于我之前的两次尝试都失败了,我想不出一种理智的方法来解决这个问题。有人可以推荐一种方法来实现我所追求的吗?或者深入了解为什么我的第二个解决方案不起作用。
直接看到它确实没有,但是......
虽然最新版本的 fail2ban-regex 支持输出参数,但你可以这样做:
仅当您发现任何 IP 都失败时才适用,无论计数/时间。在你的情况下,至少没有一些额外的预处理是没有意义的。
它不会起作用,因为fail2ban 不会真正正确地考虑消息的时间:要么它太旧(如果未修改记录),要么它不正确(如果现在记录为故障时间,因为你需要考虑
maxretry
和findtime
实际使用)。请注意,fail2ban 会now - findtime
从一开始就寻求(因为其他消息对它不感兴趣,因为它已经过时了),请参阅https://github.com/fail2ban/fail2ban/issues/2909#issuecomment-758036512。无论如何,目前几乎不可能使用开箱即用的库存 fail2bans 工具(至少除非上面 RFE 的这个“重新扫描”工具得到实施和发布)。
但是由于fail2ban(以及
fail2ban-regex
)是python中的一个模块,因此可以使用python中的过滤器将禁令写入某些日志或将它们直接发送到主fail2ban实例,请参阅https://github.com/fail2ban/fail2ban/此类脚本示例的问题/2909#issuecomment-1039267423。另请注意,您的过滤器非常脆弱且缓慢,最好尽可能精确地重写它,就像这里一样:
最后但并非最不重要的一点是,您为什么需要它?如果具有此类过滤器的监狱处于活动状态并且此类爬虫返回,则在为监狱配置的期间一旦
maxretry
出现故障,它们将被禁止。findtime
预防性禁止并不是真正需要的,只会用大量 IP 打扰您的网络过滤子系统(它们可能永远不会再回来)。