Fail2ban 与防火墙集成
Fail2ban 与防火墙集成 是 Linux 服务器安全加固中最实用、性价比最高的组合之一。它通过监控日志中的异常行为(如暴力破解尝试),自动调用防火墙规则临时封禁恶意 IP,从而极大降低暴力攻击、扫描和爬虫对服务的干扰。
下面从原理、当前主流集成方式、生产推荐配置、常见问题排查到与更现代工具的对比。
一、Fail2ban 的工作原理简述
Fail2ban 主要由三部分组成:
- Filter:正则匹配日志文件,识别可疑行为(如 SSH 连续失败登录、Nginx 403/404 异常频繁等)。
- Action:当触发阈值时执行封禁动作(最常见的是修改防火墙规则)。
- Jail:把 Filter + Action + 日志路径 + 阈值(maxretry、findtime、bantime)组合成一个防护单元。
关键点:Fail2ban 本身不具备防火墙功能,它依赖后端防火墙来实现真正的 IP 封禁。 因此“Fail2ban 与防火墙集成”其实就是选择正确的 banaction(封禁动作)。
二、2026 年主流防火墙后端与 Fail2ban 的集成方式
| 防火墙后端 | 发行版主流情况 | Fail2ban banaction 推荐写法 | 是否原生支持 | 备注与建议 |
|---|---|---|---|---|
| iptables | 老系统、部分 Debian/Ubuntu | banaction = iptables-multiport | 原生 | 已被逐步淘汰,性能不如 nftables |
| nftables | Debian 12+、Fedora、Ubuntu 24.04+ 后端 | banaction = nftables-multiport 或 nftables[type=multiport] | 原生 | 2026 年最推荐,性能更高、规则更清晰 |
| firewalld | RHEL 9、Rocky、Alma、CentOS Stream | banaction = firewallcmd-rich-rules 或 firewallcmd-ipset | 需要额外配置 | 需安装 fail2ban-firewalld 包或手动适配 |
| ufw | Ubuntu 主流前端 | banaction = ufw | 原生 | 简单易用,但底层仍是 iptables/nftables |
当前趋势(2026 年):
- 新系统几乎全部使用 nftables 作为后端(即使你看到 iptables 命令,也可能是 iptables-nft 兼容层)。
- Fail2ban 从 0.11+ 版本开始对 nftables 有很好的原生支持,推荐直接使用 nftables-multiport 或 nftables-allports。
- firewalld 用户需特别注意兼容性配置,否则封禁不生效。
三、生产环境推荐配置(nftables 为主)
- 全局默认配置(/etc/fail2ban/jail.local 或 jail.d/ 目录下)
ini
[DEFAULT]
bantime = 4h # 首次封禁 4 小时
findtime = 10m # 10 分钟内
maxretry = 5 # 失败 5 次触发
ignoreip = 127.0.0.1/8 ::1 你的公司IP段/24 VPN网段/24
banaction = nftables-multiport # ← 最推荐
banaction_allports = nftables[type=allports]
protocol = tcp
chain = INPUT- SSH 示例 jail(/etc/fail2ban/jail.d/sshd.local)
ini
[sshd]
enabled = true
port = 5522 # 如果你改了端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # SSH 更严格一点
bantime = 1d # 封一天
findtime = 10m- 重启并验证
Bash
fail2ban-client reload
fail2ban-client status sshd看到 banned IP 列表说明集成成功。
firewalld 用户额外步骤(常见遗漏点):
- 安装适配包:dnf install fail2ban-firewalld(或 yum)
- 设置 banaction = firewallcmd-rich-rules
- 或使用 action = %(action_firewallcmd-rich-rules)s
四、常见问题排查与解决
- 封禁记录有,但 IP 仍然能连
- 检查 banaction 是否匹配当前防火墙后端(最常见 nftables vs iptables 写错)
- nft list ruleset | grep fail2ban 查看是否有对应 set 和规则
- fail2ban-client get sshd banip 确认 IP 被 ban
- 重启 fail2ban:systemctl restart fail2ban
- nftables 报错 "Script error" 或 "table fail2ban not exist"
- 确保 /etc/fail2ban/action.d/nftables*.conf 存在且未被覆盖
- 手动创建表(临时):nft add table inet fail2ban
- 升级 fail2ban 到最新版(Debian/Ubuntu 建议 backports 或官方源)
- firewalld 不生效
- 确认安装了 python3-firewall 和 fail2ban-firewalld
- 检查 /etc/fail2ban/action.d/firewallcmd-rich-rules.conf 是否正确
- 测试手动 ban:fail2ban-client set sshd banip 1.2.3.4
- IPv6 不封禁
- 确保 banaction 支持 inet 族(如 nftables)
- 检查 jail 是否配置 chain = INPUT(inet 表)
五、Fail2ban vs CrowdSec
| 项目 | Fail2ban | CrowdSec | 推荐选择场景 |
|---|---|---|---|
| 检测方式 | 本地正则 + 阈值 | 本地场景 + 社区共享情报(可主动封禁已知坏 IP) | CrowdSec 更前瞻 |
| 性能与资源 | 极轻 | 稍重(有 redis/数据库选项) | 单机低负载 → Fail2ban |
| 扩展性 | 纯本地,多机需手动同步 | 原生支持分布式 + 社区情报 | 多服务器 → CrowdSec |
| 社区活跃度 | 稳定但增长缓慢 | 2024–2026 年增长极快 | 新项目 → CrowdSec |
| 与防火墙集成 | 优秀(nftables/firewalld/ufw 均支持) | 同样优秀,且支持更多 bouncer | — |
一句话判断: 如果你是单机/小团队、追求极简 → 继续用 Fail2ban + nftables。 如果服务器 ≥ 3 台、希望提前封禁已知攻击者、愿意接受稍高资源消耗 → 迁移到 CrowdSec。
结语
Fail2ban 与防火墙的集成核心只有一句话:选对 banaction,让封禁动作真正落到防火墙规则上。
2026 年最稳妥的组合是:
- nftables 作为防火墙后端
- Fail2ban 使用 nftables-multiport / nftables-allports
- 配合白名单 IP + 合理的 bantime/findtime/maxretry
- 开启 recidive jail(多次被 ban → 永久封禁)
这样配置后,你的 SSH、Nginx、WordPress 等服务暴力破解噪音会降低 90% 以上,告警也更干净。
如果你当前遇到具体报错(如 nftables 不生效、firewalld 无反应),欢迎贴出日志或 jail 配置,我可以帮你快速定位。
版权声明:
作者:后浪云
链接:https://idc.net/help/442425/
文章版权归作者所有,未经允许请勿转载。
THE END
