fail2ban封禁FRP扫描爆破

最近放到FRP的某些端口被扫描然后疯狂攻击,遂决定使用fail2ban增加一下安全性。(指名表扬这个肉鸡:83.222.191.74)

——————分隔符——————
Fail2ban是一个入侵防御框架,它通过监控日志文件中的恶意行为(例如失败的登录尝试)并自动更新防火墙规则来阻止攻击者的IP地址,从而保护服务器免受暴力攻击。
划重点:日志、防火墙规则、阻止ip或端口,所以fail2ban是一个被动防御,也就是说只要暴露在公网,大家一定要设置强密码。
——————分隔符——————
这里以debian12为例,其他系统只需进行微小修改。

前置准备

使用nftables或者iptables进行封禁,debian11之后的系统默认nftables,只需启用即可:

  • 启用nftables
sudo systemctl enable nftables
sudo systemctl start nftables
  • 安装iptables
sudo apt-get install iptables
  • 安装fail2ban
sudo apt-get install fail2ban
sudo systemctl enable fail2ban

(P.S.如果fail2ban在debian12启动失败可以试试在sshd规则加入backend=systemd,默认的auto可能存在问题)

  • frps中指定日志存放路径(本文使用/var/log/frps.log)
# add log
log.to = "/var/log/frps.log"
log.level = "info"
log.maxDays = 3
log.disablePrintColor = false

编写规则文件

通过frps.log,我们可以观察到,对于每一个访问请求的记录是格式固定的:

2024-08-07 18:51:01.134 [I] [proxy/proxy.go:204] [90b8a29acc8196a6] [LabPCRDP] get a user connection [83.222.191.74:54193]
2024-08-07 18:51:03.724 [I] [proxy/proxy.go:204] [90b8a29acc8196a6] [LabPCRDP] get a user connection [83.222.191.74:4281]
2024-08-07 18:51:06.358 [I] [proxy/proxy.go:204] [90b8a29acc8196a6] [LabPCRDP] get a user connection [83.222.191.74:13653]
2024-08-07 18:51:08.910 [I] [proxy/proxy.go:204] [90b8a29acc8196a6] [LabPCRDP] get a user connection [83.222.191.74:22547]

[时间] [信息级别info] [进程] [ID] [穿透服务名称] get a user connection [IP:端口]

fail2ban依赖于日志的时间获取,而恰好frp的日志符合他的默认条件,所以我们不需要处理时间信息,只需要通过日志获取服务名称和IP即可。
我们封禁的原理是某个固定时间窗findtime内超过一定的请求次数maxretry则通过防火墙banaction封禁一定时间bantime
在/etc/fail2ban/filter.d/目录下编写规则.conf文件,我们以RDP为例,例如:

vi /etc/fail2ban/filter.d/frp-rdp.conf

写入:

[Definition]
failregex = ^.*\[.*RDP.*\] get a user connection \[<HOST>:[0-9]*\]
ignoreregex =

failregex为正则表达式,用来从日志中找出对应服务,<HOST>为占位符,表示封禁的ip。
很多教程会要求在/etc/fail2ban/目录下编写jail.local,例如:

vi /etc/fail2ban/jail.local

这其实是不标准的做法,比较标准的做法的做法是每一个封禁都应该在/etc/fail2ban/jail.d/目录下创建一个规则。不过自用也无所谓。
写入:

[rdp]
enabled = true
findtime = 3m
maxretry = 7
bantime = 1h
filter = frp-rdp
logpath = /var/log/frps.log
banaction = nftables-allports

如果需要其他服务也是相同的做法,增加配置和过滤器就可以了
注意,新版本的debian默认使用的是nftables,如果使用其他防火墙需要自行修改。
重启服务:

sudo systemctl restart fail2ban

查看封禁情况:

sudo fail2ban-client status rdp

————————————
完事收工

5 个赞

前排学习

其他服务可以监听端口,不依赖访问日志吗

我没这么用过,不过AI告诉我好像是可以,不过还是需要自定义failregex

好像不行,我设置了监听443端口,ufw封禁ip,然后ddos了一下,被打满了没有封禁

@KamishiroAlice_bot or PGPkey:8478E1AC225306F0

看样子这种场景不适合,fail2ban看文档也是明说基于日志的

1 个赞

好高级啊我去

大佬好强