UFW 与 Fail2Ban 配合实现精细化防火墙管理

大家好,我是 33blog 的博主。今天想和大家分享一个我在服务器安全防护方面的实战经验——如何将 UFW(Uncomplicated Firewall)和 Fail2Ban 结合起来,实现精细化的防火墙管理。在实际运维中,单纯依靠 UFW 的基础规则往往不够灵活,而 Fail2Ban 的动态封禁机制正好弥补了这一不足。下面我就带大家一步步配置,并分享一些我在部署过程中踩过的坑。
1. 环境准备与软件安装
首先,确保你的系统是 Ubuntu 或 Debian(其他发行版请适当调整命令)。UFW 通常已预装,如果没有,可以通过以下命令安装:
sudo apt update
sudo apt install ufw fail2ban
安装完成后,先别急着启动服务。我习惯先检查 UFW 状态,确认初始规则是“inactive”,避免误操作导致自己被锁在外面。
2. 配置 UFW 基础规则
UFW 的默认策略是拒绝所有入站、允许所有出站。我一般会先放行 SSH 端口(假设是 22),否则一旦启用 UFW,你可能就无法远程连接了:
sudo ufw allow 22/tcp
sudo ufw enable
踩坑提示:如果你改了 SSH 端口,比如 2222,一定要用 sudo ufw allow 2222/tcp。我有一次忘了改,结果把自己关在门外,只能通过控制台重置……
3. 配置 Fail2Ban 监控与封禁
Fail2Ban 的核心是监控日志文件,当检测到恶意行为(如多次 SSH 密码错误)时,自动调用 UFW 添加封禁规则。我们先创建一个自定义配置文件,避免直接修改默认配置:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
然后编辑 jail.local,找到 [sshd] 部分,修改如下:
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
这里的意思是:如果在 10 分钟(600 秒)内 SSH 登录失败 3 次,就封禁 IP 1 小时(3600 秒)。你可以根据实际需求调整这些参数。
4. 测试与验证规则生效
配置完成后,重启 Fail2Ban 服务:
sudo systemctl restart fail2ban
接着,检查 Fail2Ban 状态和 UFW 规则:
sudo fail2ban-client status sshd
sudo ufw status numbered
如果看到 Fail2Ban 显示 sshd jail 是 active,并且 UFW 规则中有 Fail2Ban 自动添加的条目,说明配置成功。
5. 高级用法:自定义过滤规则
除了 SSH,你还可以用 Fail2Ban 保护其他服务,比如 Nginx。假设你想封禁频繁访问敏感路径的 IP,可以创建一个自定义过滤器:
sudo nano /etc/fail2ban/filter.d/nginx-badrequest.conf
文件内容如下:
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*/admin.*"
ignoreregex =
然后在 jail.local 中添加:
[nginx-badrequest]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 7200
这样,任何 IP 在短时间内多次访问 /admin 路径就会被封禁 2 小时。
6. 总结与注意事项
通过 UFW 和 Fail2Ban 的配合,我们实现了从“静态放行”到“动态封禁”的升级。不过有几点需要注意:
- 定期检查
sudo fail2ban-client status,确认各 jail 运行正常。 - 如果封禁了自己,可以通过控制台登录,用
sudo fail2ban-client set sshd unbanip <你的IP>解封。 - 对于高并发业务,适当调整 maxretry 和 findtime,避免误伤正常用户。
希望这篇教程能帮你提升服务器安全性。如果你有更好的配置技巧,欢迎在评论区分享!


这篇教程写得真详细,跟着操作一遍就成功了!