![fail2ban 的数据库太大(超过 500mb)。如何将其调整到合理的大小?](https://linux22.com/image/748330/fail2ban%20%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%AA%E5%A4%A7%EF%BC%88%E8%B6%85%E8%BF%87%20500mb%EF%BC%89%E3%80%82%E5%A6%82%E4%BD%95%E5%B0%86%E5%85%B6%E8%B0%83%E6%95%B4%E5%88%B0%E5%90%88%E7%90%86%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
最近我的备份开始出现故障,我追踪到问题出在文件上/var/lib/fail2ban/fail2ban.sqlite3
。它超过 500mb。我不确定它是随着时间的推移而增长的,还是最近才出现的。
我怎样才能将其调整到合理的大小并保持该大小?(为了达到这个目的,我们假设其大小在 500mb 以下。)
答案1
dbpurgeage
中有一个参数fail2ban.conf
,它指示在数据库中保留多少天的数据。默认值为一天(1d
),因此请尝试将其减少到几个小时:
dbpurgeage = 8h
此设置与以下内容相结合:长度超过findtime
是没有意义的。findtime
dbpurgeage
编辑(2021):以下注释在撰写本文时是正确的。然而,现在看看新生事物回答而是:fail2ban 0.11.x,在 Linux 发行版中可用(例如Debian 11 及更高版本,Ubuntu 20.04 及更高版本然后,Fedora 33 及更高版本),尊重dbpurgeage
设定。
过时的说明: 通过观察我自己失败2ban数据库,该dbpurgeage
设置似乎不起作用。因此,唯一的解决方案是手动删除条目。例如,为了删除去年的条目,请运行:
sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 \
"DELETE FROM bans WHERE DATE(timeofban, 'unixepoch') < '2020-01-01'; VACUUM;"
(这sqlite3可执行文件通常位于同名包中)。
似乎没有办法在VACUUM
没有
sqlite在同一目录中执行数据库的复制。但是,您可以在执行操作之前将文件复制到另一个文件系统,然后再复制回较小的数据库。
答案2
您可以更新到 0.11.x(其中包含执行清除的代码),然后删除庞大的数据库,然后重新启动 fail2ban。它将重新创建数据库。这是对大多数人来说最简单的解决方案,没有任何缺点。
虽然 fail2ban 0.11.x 实际上包含清除旧条目的代码(旧版本没有!),但它没有VACUUM
。因此,另一个选择是等待 fail2ban 清除旧条目(每小时发生一次)并执行手动sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "VACUUM;"
。如果没有,VACUUM
数据库文件将保持其大小。
答案3
sudo /etc/init.d/fail2ban stop
sudo rm -rf /var/lib/fail2ban
sudo /etc/init.d/fail2ban start
sudo reboot
为我解决了所有问题。重启后检查
df -h
我有 25gb 的 sqlite 文件,内存占用了 40gb 的 94%
答案4
在减少日志时,我最终选择了一条替代路线。
因为我制作了自己的代码,使用这些简单的规则总结了 IP 地址。
给定一个 IP 范围:如果超过 25% 的 IP 在 Fail2ban jails 中列出,那么我将删除单个 IP 并阻止整个范围。
然后,我将检查越来越大的 IP 范围,如果仍然有至少 25% 的 IP 属于阻止范围,在这种情况下阻止范围会变得更大。
我使用自定义二叉搜索树作为我的解决方案,因为它使用 IP 地址搜索树来确定是否可以减少树。
计算搜索范围的数学运算需要一点技巧,但这基本上就是我最终阻止 2 家中国 ISP、1 家伊朗 ISP 和 1 家俄罗斯 ISP 的原因。
并且由于有屡次违规者,因此没有计时器可以将其从阻止名单中剔除。