使用 fail2ban 抵御所有试图未经授权访问服务器的家伙!

5 min

language: ja bn en es hi pt ru zh-cn zh-tw

大家好,我是无能。在上一篇文章中,我确认了在短短一天内有大量IP地址尝试访问。虽然服务器一直运行良好,没有实际发生过未经授权的访问,但还是应该采取措施。
说实话,日志文件积累过多变得难以查看也让我有点不爽。因此,我决定引入Fail2Ban,它是我以前安装iRedMail时作为依赖项安装的,当时就引起了我的兴趣。

这是什么?

通过日志审计,当达到设定的尝试次数时,可以按IP地址进行封锁。
此外,当有尝试发生时,还可以通过iptables丢弃数据包。[安装

这次我以root身份登录,所以不使用sudo。通过pkg search找到了以下软件包,现在进行安装。

pkg install py311-fail2ban-1.1.0  
  

通常不建议直接修改 fail2ban.conf 配置文件,而是建议创建并编辑 jail.conf。因此,这次我将针对
SSH, Postfix, Dovecot
这三个服务的登录尝试进行配置,因为我非常不喜欢这些尝试。
此外,查看了许多网站后发现,不仅可以设置秒数,还可以设置1w(一周)、1d(一天)等,所以我将进行激进的设置。毫不留情地封禁一周。

~ # cat /usr/local/etc/fail2ban/jail.local  
[sshd]  
enabled = true  
port    = ssh  
logpath = /var/log/auth.log  
bantime = 1w  
findtime = 1d  
maxretry = 5  
  
[postfix]  
enabled = true  
port    = smtp,ssmtp,submission  
logpath = /var/log/maillog  
bantime = 1w  
findtime = 1d  
maxretry = 10  
action = block-drop[name=postfix, port=smtp, protocol=tcp]  
  
[dovecot]  
enabled = true  
port    = pop3,pop3s,imap,imaps,submission  
logpath = /var/log/maillog  
bantime = 1w  
findtime = 1d  
maxretry = 10  
action = block-drop[name=dovecot, port=imap, protocol=tcp]  
  

虽然似乎最好创建一个[default]部分,但我将先观察一下,只对这三个服务进行设置,如果需要再添加。顺便说一下,设置为一周的原因是:

  • 首先,我现在是通过密钥认证登录的,所以不可能出错。

  • 邮件服务器一旦登录,会持续保持登录认证一段时间,所以很少会手动尝试登录。

  • 一旦被封禁,我希望直接丢弃所有数据包。

  • 一天内超过5次登录失败本身就不正常。

所以这算是比较严格?还是比较宽松呢?我也不想因为封禁时间过短而消耗过多资源,所以就这样设置了。顺便说一下,似乎也可以封禁HTTP服务器的GET方法。https://hana-shin.hatenablog.com/entry/2023/05/24/210949我目前只将此服务器用作中间服务器,所以尚未引入此功能,但如果需要的话,我可能会尝试一下。此外,我额外设置了 action = block-drop,其配置如下。

# cat /usr/local/etc/fail2ban/action.d/block-drop.conf  
[Definition]  
  
actionstart = iptables -N f2b-&LTname>  
              iptables -A f2b-&LTname> -j DROP  
              iptables -I INPUT -p all -j f2b-&LTname>  
              iptables -I FORWARD -p all -j f2b-&LTname>  
  
actionstop = iptables -D INPUT -p all -j f2b-&LTname>  
             iptables -D FORWARD -p all -j f2b-&LTname>  
             iptables -F f2b-&LTname>  
             iptables -X f2b-&LTname>  
  
actioncheck = iptables -n -L INPUT | grep -q 'f2b-&LTname>[     ]'  
  
actionban = iptables -I f2b-&LTname> -s &LTip> -j DROP  
  
actionunban = iptables -D f2b-&LTname> -s &LTip> -j DROP  
  

基本上,一旦被封禁,我就会直接丢弃所有数据包。我曾考虑过使用Reject,但重新查看后发现https://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables结果是,Reject应该在你想让对方知道被拒绝时使用,而这次是封禁,所以我决定毫不留情地将数据包彻底丢弃。

启动与健康检查

由于是FreeBSD,所以这样启动:

service fail2ban start  
  

如果显示'Server ready'就表示正常。查看日志以确认是否正常运行。

# tail /var/log/fail2ban.log  
2024-07-24 13:34:05,654 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:05,755 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:05,884 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:06,000 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:06,317 fail2ban.actions        [39963]: WARNING [sshd]  already banned  
2024-07-24 13:34:06,731 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:06  
2024-07-24 13:37:14,327 fail2ban.filter         [39963]: INFO    [sshd] Found - 2024-07-24 13:37:14  
2024-07-24 13:42:12,266 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:12  
2024-07-24 13:42:17,389 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:17  
2024-07-24 13:42:23,357 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:23  
  

本来会显示IP地址,但这次我将其隐藏了。它立刻就被封禁了!成功了!我在心里大喊着“小鬼!”
(反正对方是机器人,对着机器有什么好想的呢?)把这种无聊的胜利姿势收起来,为了让它自动启动,在/etc/rc.conf中添加以下内容。

fail2ban_enable="YES"  
  

这样一来,即使服务器重启,进程也会自动启动。


今天就到这里。顺便说一下,我还在想,将迄今为止日志中记录的登录尝试所使用的用户名显示在图表中,或许也会很有趣。下次再见。

Related Posts