设置我正在一个ubuntu服务器上运行apache。我已经创建了一个fail2ban规则,当他们请求太多页面太快时,它禁止ip。
# Fail2ban Rule
failregex = ^.*?(:80|:443) - .* "(GET|POST|HEAD).*$
ignoreregex =.*(.ico|.jpg|.png|.gif|.js|.css|.woff|.mp4)
findtime = 30
maxretry = 10目标:我希望根据这个新的fail2ban规则运行一个旧的Apache日志,这样我就可以看到它是否禁止了任何合法的请求。
Attempt #1我想我可以使用fail2ban-regex获得一个潜在禁用用户的列表,但它没有这种功能。
Attempt #2我认为将历史日志回显到fail2ban当前监视的日志中会使它们得到解析。在修复了日志行被忽略的小挂件(通过添加一年的时间来修正日志行)之后,fail2ban开始解析它们,并禁止it使用。然而,我只需要看一下第一个被禁止的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结论由于我之前的两次尝试都失败了,我想不出一个正确的方法来解决这个问题。有人能推荐一种方法来达到我想要的目标吗?或者深入了解我的第二个解决方案不起作用的原因。
发布于 2022-02-14 16:15:14
企图#1
直接看到它还没有,但是..。
尽管fail2ban-regex的最新版本支持输出参数,所以您可以这样做:
fail2ban-client set "$jail" banip $(
fail2ban-regex -o 'ip' /var/log/path/some.log some-filter | sort --unique | tr '\n' ' '
)只有当您发现任何IP造成故障( regardless /time)时,才适合使用。在你的情况下,它是没有意义的,至少没有额外的预处理。
第二次尝试,我认为将历史日志回显到fail2ban当前正在监视的日志中,会使它们得到解析。
因为fail2ban没有真正正确地考虑消息的时间,所以它不能工作:要么它太旧(如果未经修改记录),要么它不正确(如果现在记录为故障时间,因为您需要在实际使用中考虑maxretry和findtime )。请注意,fail2ban将在开始时寻求now - findtime (因为其他消息对它不感兴趣,因为太过时了),请参见https://github.com/fail2ban/fail2ban/issues/2909#issuecomment-758036512。
无论如何,现在几乎不可能有现成的库存fail2bans工具(至少除非上述RFE的"rescan“工具得以实现和发布)。
但是,由于fail2ban (以及fail2ban-regex)是python中的一个模块,所以可以使用一个过滤器,从python编写禁令到某些日志,或者直接将它们发送到主fail2ban实例,请参阅https://github.com/fail2ban/fail2ban/issues/2909#issuecomment-1039267423中的脚本示例。
还请注意,您的过滤器非常易受攻击且速度慢,最好尽可能精确地重写它,如下所示:
failregex = ^"" \S+ \S+ [^"]*"[A-Z]+ /(?:\S+/)*[^\.]*(?:\.(?!ico|jpg|png|gif|js|css|woff|mp4)\w+)? [^"]+"最后但并非最不重要的是,你为什么要这么做?如果带有这种过滤器的监狱处于活动状态,并且这些爬虫返回,那么一旦它们在findtime (配置为监狱)期间造成D13失败,就会被禁止。预防性禁止并不是真正需要的,它只会用大量的is来困扰你的网络过滤子系统(他们可能再也不会回来了)。
https://serverfault.com/questions/1092707
复制相似问题