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/Ubuntubanaction = iptables-multiport原生已被逐步淘汰,性能不如 nftables
nftablesDebian 12+、Fedora、Ubuntu 24.04+ 后端banaction = nftables-multiport 或 nftables[type=multiport]原生2026 年最推荐,性能更高、规则更清晰
firewalldRHEL 9、Rocky、Alma、CentOS Streambanaction = firewallcmd-rich-rules 或 firewallcmd-ipset需要额外配置需安装 fail2ban-firewalld 包或手动适配
ufwUbuntu 主流前端banaction = ufw原生简单易用,但底层仍是 iptables/nftables

当前趋势(2026 年)

  • 新系统几乎全部使用 nftables 作为后端(即使你看到 iptables 命令,也可能是 iptables-nft 兼容层)。
  • Fail2ban 从 0.11+ 版本开始对 nftables 有很好的原生支持,推荐直接使用 nftables-multiport 或 nftables-allports。
  • firewalld 用户需特别注意兼容性配置,否则封禁不生效。

三、生产环境推荐配置(nftables 为主)

  1. 全局默认配置(/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
  1. 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
  1. 重启并验证
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

四、常见问题排查与解决

  1. 封禁记录有,但 IP 仍然能连
    • 检查 banaction 是否匹配当前防火墙后端(最常见 nftables vs iptables 写错)
    • nft list ruleset | grep fail2ban 查看是否有对应 set 和规则
    • fail2ban-client get sshd banip 确认 IP 被 ban
    • 重启 fail2ban:systemctl restart fail2ban
  2. nftables 报错 "Script error" 或 "table fail2ban not exist"
    • 确保 /etc/fail2ban/action.d/nftables*.conf 存在且未被覆盖
    • 手动创建表(临时):nft add table inet fail2ban
    • 升级 fail2ban 到最新版(Debian/Ubuntu 建议 backports 或官方源)
  3. firewalld 不生效
    • 确认安装了 python3-firewall 和 fail2ban-firewalld
    • 检查 /etc/fail2ban/action.d/firewallcmd-rich-rules.conf 是否正确
    • 测试手动 ban:fail2ban-client set sshd banip 1.2.3.4
  4. IPv6 不封禁
    • 确保 banaction 支持 inet 族(如 nftables)
    • 检查 jail 是否配置 chain = INPUT(inet 表)

五、Fail2ban vs CrowdSec

项目Fail2banCrowdSec推荐选择场景
检测方式本地正则 + 阈值本地场景 + 社区共享情报(可主动封禁已知坏 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 配置,我可以帮你快速定位。

THE END