最近放到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
————————————
完事收工