理解 fail2ban 与 iptables 的联动机制
fail2ban 并非静态防火墙,而是一个基于日志分析的动态防御框架。其核心组件包括守护进程、过滤器(Filter)、监狱(Jail)和动作(Action)。过滤器通过正则表达式实时扫描指定日志文件,提取符合恶意特征的行;Jail 将过滤器与具体服务绑定,并设定检测窗口、最大失败次数及封禁时长等阈值。当匹配失败次数超过设定值时,Jail 会触发 Action,调用底层防火墙工具(如 iptables)执行封禁。完整链路为:系统产生认证失败日志 → fail2ban 增量读取并正则匹配 → 计数器累加 → 触发阈值 → 调用 iptables 在 INPUT 链插入 DROP 规则 → 封禁到期后自动移除规则。该方案适用于 SSH、FTP、Web 登录等具备明确失败日志的服务,属于轻量级、反应式的主机边界防护手段,能有效抵御自动化爆破与低频扫描。

安装 fail2ban 并配置 SSH 防护
在 Debian/Ubuntu 系统中可通过 sudo apt install fail2ban 安装,RHEL/CentOS 则使用 sudo yum install fail2ban。安装完成后,切勿直接修改 /etc/fail2ban/jail.conf,因为软件升级会覆盖该文件。正确做法是创建 /etc/fail2ban/jail.local 进行覆盖配置。以 SSH 防护为例,在文件中添加 [sshd] 区块并设置关键参数:enabled = true 启用防护;port = ssh 指定监听端口;logpath = /var/log/auth.log(或 %(sshd_log)s)明确日志来源;backend = systemd 适配现代发行版的日志服务;maxretry = 5 表示允许 5 次失败;findtime = 600 设定 10 分钟检测窗口;bantime = 3600 设定封禁 1 小时。配置完成后执行 sudo systemctl restart fail2ban 加载策略。务必确保日志路径与实际系统一致,否则将无法捕获攻击事件。

让 fail2ban 调用 iptables 实现动态封禁
实现动态封禁的关键在于正确配置 fail2ban 的 Action 模块。在 jail.local 中,通过 banaction = iptables-multiport 指定使用 iptables 多端口封禁动作。当触发封禁时,fail2ban 会自动在 iptables 的 INPUT 链顶部创建名为 f2b-sshd 的自定义链,并插入一条 RETURN 规则,随后将恶意 IP 的 DROP 规则追加至该自定义链中。这种设计避免了直接污染主链,便于集中管理。若服务器同时开放 IPv6,需改用 banaction = iptables-ipset-proto6 或单独配置 ip6tables 动作,因为标准 iptables 仅处理 IPv4 流量。此外,若主机已部署 ufw 或 firewalld,需确保 fail2ban 的 iptables 规则插入位置优先于放行规则,否则封禁将被覆盖。端口兼容性方面,multiport 支持逗号分隔的多个端口,适用于非标准 SSH 端口场景。

验证封禁效果并排查常见问题
部署后需通过多维度命令验证防护是否生效。执行 fail2ban-client status sshd 可查看当前活跃 Jail 状态、已封禁 IP 列表及历史拦截次数;使用 sudo iptables -L f2b-sshd -n -v 能直观看到 DROP 规则及匹配的数据包计数;结合 journalctl -u fail2ban -f 可实时追踪匹配与封禁日志。常见避坑指南如下:若规则未生成,优先检查 logpath 是否指向正确日志文件,或 backend 是否与系统日志服务匹配;若误封管理 IP,可通过 fail2ban-client set sshd unbanip

