首先,让我们为不熟悉这些应用程序的人员介绍一些术语,以完成这项工作:
fail2ban:一个守护进程,用于禁止发生多次认证错误的主机。fail2ban 将监控 SystemD 日志,以查找对任何已启用的“监狱jail”的失败的验证尝试。在达到指定失败次数后,它将添加一个防火墙规则,在配置的时间内阻止该特定 IP 地址。
FirewallD:一个带有 D-Bus 接口的防火墙守护进程,提供动态防火墙。除非你另行决定使用传统的 iptables,否则你已经在所有支持的 Fedora 和 CentOS 上安装了 FirewallD。
假定前提
主机系统有一个互联网连接,并且要么是直接暴露在互联网上,要么是通过 DMZ(这两个都是非常糟糕的想法,除非你知道你在做什么),要么是有一个端口从路由器转发过来。
虽然大部分的内容可能适用于其他系统,但本文假设当前系统是 Fedora(31 及以上)或 RHEL/CentOS 8 版本。在 CentOS 上,你必须用 sudo dnf install epel-release 启用 Fedora EPEL 仓库。
安装与配置
Fail2Ban
很有可能已经有某个 Firewalld 区已经允许 SSH 访问,但 sshd 服务本身默认没有启用。要手动启动它,并且不在启动时永久启用它:
$ sudosystemctl start sshd
或者在系统启动时启用,并同时启动它:
$ sudosystemctl enable --now sshd
下一步就是安装、配置、启用 fail2ban。和往常一样,安装可以通过命令行完成:
$ sudo dnf install fail2ban
安装完毕后,下一步就是配置“监狱”(你要以设置的任何阈值监视并禁止的服务)。默认情况下,IP 会被禁止 1 小时(这其实不够长)。最好的做法是使用 *.local 文件覆盖系统默认值,而不是直接修改 *.config 文件。如果我们查看我的 jail.local,我们可以看到:
#cat/etc/fail2ban/jail.local
[DEFAULT]
#"bantime"is the number of seconds that a host is banned.
bantime =1d
# A host is banned if it has generated "maxretry" during the last"findtime"
findtime =1h
#"maxretry"is the number of failures before a host get banned.
maxretry =5
换成通俗的语言讲,就是在过去一小时内尝试 5 次后,该 IP 将被封禁 1 天。对于多次被封的 IP,也可以选择增加封禁时间,但这是另一篇文章的主题。
下一步是配置“监狱”。在本教程中显示的是 sshd,但其他服务的步骤大致相同。在 /etc/fail2ban/jail.d 中创建一个配置文件。这是我的文件:
#cat/etc/fail2ban/jail.d/sshd.local
[sshd]
enabled =true
就这么简单! 很多配置已经在为 Fedora 构建的软件包中处理了(提示:我是当前的维护者)。接下来启用并启动 fail2ban 服务:
$ sudosystemctl enable --now fail2ban
希望没有立即出错,如果没有,请使用下面的命令检查 fail2ban 的状态:
$ sudosystemctl status fail2ban