我注意到在过去 6 个月里,这种模式在我的服务器上发生了几次:
首先,
fail2ban
检测来自机器人的许多 SSH 尝试,并成功禁止它们。事实上/etc/fail2ban/jail.conf
我有:[ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3 findtime = 86400 bantime = 2678400
然后,结果,
iptables
有很多很多规则,就我而言,我有~ 4000 条规则像这样:-D fail2ban-ssh -s 1.2.3.4/32 -j DROP -D fail2ban-ssh -s 5.6.7.8/32 -j DROP ...
最后,该服务器的整个互联网连接是非常慢(在使用 SFTP 将文件下载到本地计算机时,我注意到只有 ~ 160 KB/秒的带宽),可能是因为所有这些规则。
这暂时解决了:
iptables -S |grep DROP| sed 's/-A/-D/' >rules
cat rules | while read line; do iptables $line; done
iptables -S |wc -l # ~100 rules (instead of ~4000), good, back to normal!
执行此操作几秒钟后,我到本地计算机的带宽恢复正常,即超过 5 MB/秒,这还可以。
但几周后它会再次发生,因为它已经发生过几次了。
如何避免这个长期问题?
答案1
ipset
旨在解决这个问题。您可以创建一组 IP 或子网:
ipset create bannedv4 hash:net family ipv4 comment
ipset create bannedv6 hash:net family ipv6 comment
添加一条 iptables 规则,如下所示:
iptables -A INPUT -m set --match-set bannedv4 src -j DROP
ip6tables -A INPUT -m set --match-set bannedv6 src -j DROP
然后您可以将许多条目添加到禁止集中。我不知道如何配置fail2ban来使用它。对我来说,已经定义了 ipset 操作,/etc/fail2ban/action.d
但它可能是特定于发行版的。
ipset add bannedv4 1.2.3.4/16 comment "SSH bot"
ipset add bannedv6 64:ff9b::1.2.3.4/112 comment "SSH bot"
也可能存在过期条目。当您创建该组时,只需添加timeout 604800
仅禁止它们一周的选项。您可以通过将相同的选项传递给 来覆盖此默认超时ipset add
。您可能还想保存初始化脚本中的设置,就像保存 iptables 规则一样。请注意,您必须恢复 iptables 规则之前的设置。
ipset save > /var/lib/firewall/ipset
ipset restore < /var/lib/firewall/ipset
答案2
正如已经正确指出的那样,ipset
它更适合大型列表。
这是可能的配置 (fail2ban >= v.0.10) 来jail.local
指定所有监狱的默认操作:
[DEFAULT]
banaction = iptables-ipset-proto6
banaction_allports = iptables-ipset-proto6-allports
至于bantime
2678400(31天?!) - 仅仅在3次失败后就直接禁止这么长的时间有点太重了,至少不推荐。
如果您有fail2ban v.0.11,您可以使用增量bantime功能 - 请参阅https://stackoverflow.com/a/66443690/7161854例如。