最近买了一台阿里云的轻量应用服务器来搭建自己的博客网站,今天连上服务器准备继续折腾时突然看到提示:

Last failed login: Mon Jul 31 14:10:34 CST 2023 from 62.234.8.60 on ssh:notty
There were 7 failed login attempts since the last successful login.

我心想这个时间我没连上服务器干嘛也没输错过密码啊,心里咯噔一下,赶快输入指令 lastb 看看记录:

root     ssh:notty    62.234.8.60      Mon Jul 31 14:10 - 14:10  (00:00)
         ssh:notty    64.62.197.226    Mon Jul 31 09:00 - 09:00  (00:00)
root     ssh:notty    36.110.228.254   Mon Jul 31 00:11 - 00:11  (00:00)
root     ssh:notty    36.110.228.254   Mon Jul 31 00:10 - 00:10  (00:00)
root     ssh:notty    36.110.228.254   Mon Jul 31 00:10 - 00:10  (00:00)
root     ssh:notty    36.110.228.254   Mon Jul 31 00:10 - 00:10  (00:00)
root     ssh:notty    36.110.228.254   Mon Jul 31 00:10 - 00:10  (00:00)
root     ssh:notty    36.110.228.254   Mon Jul 31 00:10 - 00:10  (00:00)
username ssh:notty    183.136.225.31   Sun Jul 30 21:11 - 21:11  (00:00)
         ssh:notty    64.62.197.181    Sun Jul 30 20:56 - 20:56  (00:00)
         ssh:notty    64.62.197.147    Sat Jul 29 22:04 - 22:04  (00:00)
username ssh:notty    183.136.225.5    Sat Jul 29 20:52 - 20:52  (00:00)

btmp begins Sat Jul 29 20:52:45 2023

可以看到是有IP在尝试对我的服务器进行爆破攻击,应该是那些流氓机器人干的。虽然说我对我的密码还算有信心,但总归不太舒服,就想着对服务器做做防护。看到网上说DenyHosts方案已经过时,而且DenyHosts只会监视您的 SSH 服务,如果还需要保护其他服务,Fail2ban是更好的选择。所以我就准备选择Fail2ban来对服务器进行防护。

这里要说一下的是,我的服务器系统是 Alibaba Cloud Linux 3.21.04 ,所以下面的命令都是以此为基础的。

Fail2ban软件包不在官方存储库中,但在EPEL存储库中可用,所以我们先输入以下命令依次安装:

yum -y install epel-release
yum -y install fail2ban

安装好之后再以此输入以下命令:

systemctl enable --now fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vim /etc/fail2ban/jail.local

这里要解释一下,第一条命令是让Fail2ban开机自启;第二条命令是将 jail.conf 文件复制到一个名为 jail.local 的新文件中,因为将来在升级程序包时可能会覆盖或改进 jail.conf 文件,而且在 jail.local 中设置的配置参数将覆盖 jail.conf 中定义的任何参数,所以不建议直接更改 jail.conf 文件;第三条指令就是用vim编辑器打开 jail.local 文件了。打开后第一眼看到的是这个界面:

server-01-1

我们要做的是按 i 进入编辑模式,找到 [sshd] 下的内容全部换成以下配置:

enabled = true
port = 22
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3d
findtime = 60
backend = %(sshd_backend)s

这里要说一下,maxretry 指定在封禁 IP 地址之前,允许尝试登录的最大次数;bantime 指定封禁 IP 地址的时长,findtime 指定在一个时间段内(以秒为单位),Fail2ban会监视登录尝试的次数。所以我的配置合起来意思是如果某个 IP 地址在一分钟内尝试登录失败超过三次,它就会被封禁,被封禁的时间为三天。

输入以上配置之后,按 Esc 退出编辑模式,输入 :wq 保存并退出文件。

然后就可以输入以下指令重启Fail2ban并查看状态了:

systemctl restart fail2ban
fail2ban-client status sshd

如果看到显示以下内容就说明配置防护生效了:

server-01-2

还可以输入 cat /var/log/fail2ban.log 命令进入Fail2ban的日志文件查看服务器上发生的登录事件,包括成功和失败的尝试,以及哪些 IP 地址被封禁等信息。

最后提一下,我按照网上的教程配置了很多次,但都失败了,不知道是哪个环节出了问题,经过多次尝试之后才成功,希望能帮到有需要的人。