保护服务器免受暴力攻击是必不可少的。问题是,如何做到?幸运的是,Fail2Ban 就在附近,可以保护您的服务器,但是 Fail2Ban 的默认配置需要一些调整以实现最佳安全性。不过不用担心,本教程已经为您做好了准备。
在本教程中,您将学到如何设置 Fail2Ban 并通过保护您的 SSH 服务器来抵御暴力攻击。
准备好了吗?继续阅读以优化您的 SSH 服务器安全性!
先决条件
本教程包含逐步说明。如果您想跟着做,请确保您已经做好了以下准备:
- 一个 Ubuntu 和 Debian 服务器 – 本教程使用运行Ubuntu 18.04 LTS 的服务器来设置 Fail2Ban,并使用 Debian 10 服务器来测试 Fail2Ban 的封禁配置。
- Root 访问或服务器上的 sudo 特权以作为超级用户执行命令。
- Fail2Ban已安装在Ubuntu或Debian服务器上。
设置基础防火墙
Fail2Ban通过监视日志文件并封禁在特定时间段内尝试登录次数过多的IP地址来保护您的服务器。但首先,您将设置一个基础防火墙,您可以在其中添加规则以阻止服务器上的恶意行为。
1.首先运行以下service
命令停止Fail2Ban(fail2ban stop
)运行。在更改配置文件时停止Fail2Ban,以便您可以测试更改并确保其按预期工作。

2.运行apt install
命令安装Sendmail
和IPTables-persistent
。Sendmail是Fail2Ban用于通知您封禁IP地址的程序。而IPTables-persistent是一个程序,它会将更改后的配置设置保存在/etc/sysconfig/iptables文件中。
安装这些程序可以保持防火墙设置的完整性,即使发生意外情况,如停电。
现在运行下面的每个iptables
命令来设置防火墙。这些命令不会生成任何输出,但会向防火墙添加四条规则。这些规则要么允许连接到您的服务器,要么阻止连接。

4. 运行以下iptables
命令以查看您在防火墙中设置的摘要。
下面,突出显示了您在防火墙中添加的规则。

5. 接下来,运行以下命令将您的规则保存在/etc/sysconfig/iptables-config文件中,并启动Fail2Ban服务。 iptables-config文件保存了所有永久性防火墙规则。
Fail2Ban将自动向防火墙添加一些规则以保护您的服务器。
6. 最后,重新运行下面的iptables
命令以查看您的防火墙规则。
如下所示,以红色突出显示了Fail2Ban添加到您的防火墙的新规则。

调整本地Fail2Ban配置
现在您已经运行了基本防火墙,是时候调整您本地的Fail2Ban配置文件,以加强对服务器的安全控制。本教程使用/etc/fail2ban/jail.conf配置文件,因为它包含配置Fail2Ban应用程序全局设置所需的所有选项。
也许您想为SSH服务器创建自定义规则。如果是这样,您将创建一个新的jail.local文件(基于jail.conf文件),并将SSH特定的规则放在jail.local文件中。这样做可以让您覆盖jail.conf文件中的服务器默认设置。
1. 运行以下awk
命令执行以下操作:
- 打印
/etc/fail2ban/jail.conf
文件的内容('{ printf "# "; print; }'
)。 - 创建一个名为jail.local的文件(基于jail.conf文件),可用于覆盖jail.conf文件中的默认设置。
- 将
/etc/fail2ban/jail.conf
文件的内容传递到tee
命令。这样将把jail.conf
文件的内容写入您的本地文件系统(/etc/fail2ban/jail.local
)。

2. 创建了jail.local文件后,请运行下面的ls
命令。该命令列出您服务器的Fail2Ban目录(/etc/fail2ban
)的内容,以验证您的jail.local文件是否正确生成。
如果您看到新的jail.local文件,如下所示,则表示您的本地文件已正确生成。

3. 在您喜欢的文本编辑器中打开/etc/fail2ban/jail.local文件,并导航到[ssh]部分。
通过删除下面显示的选项前的#符号来取消注释[sshd]和enabled选项,以启用SSH。
从此处到教程的其余部分,删除前置于任一部分或选项前的#符号以启用它们。

4. 向下滚动,并取消注释下面显示的[DEFAULT]部分。此部分是您配置Fail2Ban的默认设置的地方。此部分中的任何设置都将应用于Fail2Ban管理的所有jails。

5. 接下来,滚动到bantime部分,并设置bantime为60分钟。bantime选项设置了在登录尝试失败后,IP地址被禁止的时间量,以分钟为单位。
默认的禁令时间设置为600秒(10分钟)。您可以根据需要调整此设置,但重要的是要注意,禁令时间设置越低,服务器的负载就越大。

6. 转到findtime和maxretry选项。保留findtime设置为原样(10m),将maxretry降低到3。
findtime选项设置了IP地址在登录失败之前可以经过的时间,以分钟为单位。而maxretry选项设置了IP地址在被禁止之前的登录尝试次数。
默认的findtime设置为10分钟,maxretry为5分钟。因此,在10分钟内登录失败5次的IP地址将被禁止。

7. 向下滚动,取消注释并配置destemail,sender和mta选项:
- destemail – 输入一个电子邮件地址,Fail2Ban将通知发送到该地址。
- sender – 设置Fail2Ban发送到destemail的电子邮件中的“发件人”字段。
- mta – 保持默认设置(sendmail)。mta选项设置了Fail2Ban用于发送通知的电子邮件传送代理。

8. 导航到如下所示的操作选项,取消注释action_mwl选项。这样做可以让Fail2Ban向您发送logwatch邮件。您可以查看logwatch邮件以进一步调查服务器上可能存在的安全问题。
保存更改并退出文本编辑器。

9. 现在运行以下命令重新启动您的fail2ban
服务。
10. 最后,运行以下命令检查您的fail2ban
服务status
。sudo service fail2ban status
如果Fail2Ban服务正常运行,您将得到如下输出。
如果Fail2Ban服务正常运行,您将得到如下输出。

测试您的封禁配置
您刚刚配置了Fail2Ban,现在是时候测试封禁配置是否实际生效了。尝试从辅助服务器对Fail2Ban服务器进行多次失败的SSH登录,然后查看该辅助服务器是否被封禁。
1. 登录到您的辅助服务器(Debian),并运行以下命令以通过SSH连接到您的Fail2Ban服务器。
此演示使用Debian 10服务器,IP为134.122.20.103,通过ssh
连接到IP为69.28.83.134
的fail2ban
服务器。
2. 在提示时输入随机密码,然后按Enter键。
第一次尝试时,Fail2Ban服务器将停止SSH登录尝试并打印权限被拒绝消息,如下所示。再次尝试SSH登录大约两到三次,Fail2Ban服务器最终将停止响应您的SSH登录尝试。
此时,您将不再收到权限被拒绝消息,而是一个空白屏幕。出现空白屏幕表示您的第二个服务器(Debian)已被Fail2Ban服务器禁止。

但也许您已经有一个要从Fail2Ban服务器阻止的IP地址列表。如果是这样,请打开jail.local文件并导航到[DEFAULT]部分。取消注释ignoreip选项并设置要阻止的IP地址,如下所示。
地址可以是多个单独的IPv4或IPv6条目,也可以用逗号分隔。

3. 在您的Fail2Ban服务器(Ubuntu)上重新运行下面的iptables
命令以查看您的防火墙规则。
请注意,下面有一个新规则拒绝来自134.122.20.103IP地址的SSH登录尝试。
如果您在Fail2Ban服务器上设置了sendmail,您还将收到一封电子邮件通知,其中附有日志文件,表明Fail2Ban已成功阻止了暴力攻击,并保护了您的服务器免受潜在损害。

结论
在本教程中,您已经学习了如何在Ubuntu服务器上配置Fail2Ban。此时,您应该已经具备了保护SSH服务器免受暴力攻击的知识。
现在,为什么不将这些新学到的知识提升一下呢?也许可以从在docker主机上使用Fail2Ban阻止所有端口的IP开始?