使用 Fail2Ban 守护服务器!自动封禁恶意 IP
我的个人博客基于 Ubuntu 部署、Nginx 反向代理对外提供服务,公网环境下高频端口扫描、暴力破解等恶意请求易占用服务器资源、影响正常访问并带来安全隐患。为此选用轻量级工具 Fail2Ban,通过实时监控 Nginx 日志、自动识别恶意请求并封禁对应 IP,以极简配置实现低资源占用的自动化 IP 防护,为博客搭建可靠的安全屏障。
环境准备
本次配置基于 Ubuntu 系统,已部署 Nginx 并做反向代理,服务器开启 iptables 防火墙(Ubuntu 默认自带)。
快速安装
Ubuntu 系统可直接通过 apt 源安装:
sudo apt update && sudo apt install fail2ban -y
核心配置:自定义防护规则
为避免修改默认配置文件导致升级覆盖,我们在 /etc/fail2ban/jail.d 目录下创建独立的防护规则文件:
# 拦截高频请求的恶意 IP
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
action = iptables-multiport[name=nginx-limit-req, port="http,https", protocol=tcp, chain="DOCKER-USER"]
logpath =
/srv/docker/nginx-ui/volumes/log/error.log
/srv/docker/nginx-ui/volumes/log/error.local.log
maxretry = 30
findtime = 60
bantime = 3600
# 拦截针对服务器敏感路径的恶意扫描,并自动封禁扫描 IP
[nginx-botsearch]
enabled = true
filter = nginx-botsearch
action = iptables-multiport[name=nginx-botsearch, port="http,https", protocol=tcp, chain="DOCKER-USER"]
logpath =
/srv/docker/nginx-ui/volumes/log/error.log
/srv/docker/nginx-ui/volumes/log/error.local.log
maxretry = 5
findtime = 600
bantime = 3600
注意:如果你的 Nginx 不是通过 Docker 部署的,那么在 action 中不需要添加 chain="DOCKER-USER"
加载配置
配置完成后,先验证配置文件语法是否正确,避免因格式错误导致 Fail2Ban 启动失败:
fail2ban-client -t
若验证无报错,重启 Fail2Ban 使新规则生效:
sudo systemctl restart fail2ban
封禁不生效的问题排查与解决
配置规则后发现恶意 IP 仍能访问,核心原因是:Nginx 通过 Docker 部署,Fail2Ban 默认将封禁规则写入 iptables 的 INPUT 链,而 Docker 容器流量优先走 DOCKER 链,导致规则失效。
问题根源
Docker 运行时会创建独立的 DOCKER 网络链,容器的入站流量不会经过系统默认的 INPUT 链,因此需将封禁规则写入 Docker 官方指定的 DOCKER-USER 链(所有容器流量都会经过此链)。
解决方案
在防护规则的 action 字段中添加 chain="DOCKER-USER" 参数(上文配置已包含此关键项):
# 写入 DOCKER-USER 链,适配 Docker 部署的 Nginx
action = iptables-multiport[name=nginx-botsearch, port="http,https", protocol=tcp, chain="DOCKER-USER"]
日常常用操作
# 1. 查看 Fail2Ban 当前开启的所有防护服务
sudo fail2ban-client status
# 2. 查看防护的详细状态,包括已封禁 IP 列表(核心命令)
sudo fail2ban-client status [配置名]
# 3. 手动解封误封的 IP(替换为实际 IP,配置名对应具体规则)
sudo fail2ban-client set [配置名] unbanip [IP]
# 4. 手动封禁恶意 IP(替换为实际 IP,封禁时长同配置)
sudo fail2ban-client set [配置名] banip [IP]