29.5 Fail2Ban(基于 IPFW、PF 与 IPF)
网络安全实践中,暴力破解(brute-force attack)是针对身份认证系统的常见威胁之一。
Fail2Ban 是一款基于日志的入侵防御系统(Intrusion Prevention System, IPS),通过动态更新防火墙规则实现自适应访问控制,为服务器提供实时防护。
根据 官方说明,Fail2Ban 通过更新系统防火墙规则,拒绝多次身份验证失败的 IP 地址发起的新连接(详见 Fail2Ban 工作原理)。Fail2Ban 几乎完全由 Python 实现(Python 代码占比约 96%)。本节适配了 FreeBSD 常见的三种防火墙(IPFW、PF 与 IPF),无需同时配置所有防火墙,只需选择其中一种即可。
安装 Fail2Ban
Fail2Ban 的安装过程如下,用户可选择 pkg 或 Ports 安装。
使用 pkg 安装:
# pkg install security/py-fail2ban或者使用 Ports 安装:
# cd /usr/ports/security/py-fail2ban/
# make install clean安装完成后,需启用服务使其开机自动启动。
启用 fail2ban 服务:
# service fail2ban enable查看 Fail2Ban 安装后的说明
安装完成后,可通过以下命令查看软件包提供的配置说明。
# pkg info -D security/py-fail2banFail2Ban 配置解读
下文解读 Fail2Ban 的配置。
注意
此处的
jail并非 BSD 系统中的 Jail(容器)。在 Fail2Ban 中,jail 是指对特定服务的监控和封禁配置单元,每个 jail 对应一个需要防护的服务(如 SSH、FTP 等)。
Fail2Ban 的工作流程分为两个部分:filter(过滤器)解析日志,识别失败的登录尝试;action(动作)调用防火墙规则执行封禁操作。
涉及的文件结构:
配置文件示例为 /usr/local/etc/fail2ban/jail.conf 文件(请勿直接编辑,参见上文说明),下文仅列出本书所需内容:
① 列出 Fail2Ban 的过滤器选项:
需要注意,以 bsd- 开头的文件(如 bsd-sshd.conf)是 FreeBSD Port 维护者为适配特定环境提供的变体,但由于 sshd.conf 与 Fail2Ban 标准配置的兼容性更好,本节应直接使用它。
② 查看 Fail2Ban 支持的防火墙:
Fail2Ban 封禁配置
创建并编辑文件 /usr/local/etc/fail2ban/jail.d/sshd.conf,写入如下内容:
技巧
上述示例中的 192.168.0.0/24 为占位符,须替换为实际的值。
配置说明:
白名单,表示不会被封禁的 IP 段。192.168.0.0/24 表示从 192.168.0.0 到 192.168.0.255。
bsd-ipfw是示例防火墙,可自行选择,参见下文。
在 FreeBSD 中,Fail2Ban 提供了两个 IPFW 相关的动作配置:ipfw 和 bsd-ipfw。其中 bsd-ipfw 系专门为 FreeBSD 优化的版本,与系统的集成度更高。
警告
如果使用 IPFW 防火墙,必须选择
bsd-ipfw,而不能使用ipfw,否则无法生效。
配置防火墙
完成 Fail2Ban 配置后,还需配置对应防火墙,随后启动服务。
启动 Fail2Ban 服务:
IPFW
IPFW 是 FreeBSD 内置的防火墙。Fail2Ban 配置同上。
配置开机启动服务
启用防火墙,实现开机自动启动:
警告
请勿立即执行
start命令,否则可能导致无法通过 SSH 连接。
修改 IPFW 默认规则
IPFW 规则的默认策略是“默认拒绝”,即规则 65535 会阻断所有未匹配的流量。为避免配置过程中访问被阻断,可先将其修改为“默认允许”:
显示当前 IPFW 防火墙规则列表:
参考文献
FreeBSD Project. ipfw(8) - IP firewall and traffic shaper control program[EB/OL]. [2026-03-26]. https://man.freebsd.org/cgi/man.cgi?query=ipfw&sektion=8. FreeBSD 官方防火墙管理工具参考手册,提供了 IPFW 完整命令说明。
dapeng.li. fail2ban[EB/OL]. [2026-03-26]. https://dapeng.li/learning/fail2ban/d4.html. 本节架构基于此,是 Fail2Ban 与 FreeBSD 的集成方案。
FreeBSD Project. Chapter 33. Firewalls[EB/OL]. [2026-04-14]. https://docs.freebsd.org/en/books/handbook/firewalls/. FreeBSD Handbook 防火墙章节,介绍了 PF、IPFW 和 IPFILTER 的基本配置。
FreeBSD Foundation. FreeBSD's Firewall Feast[EB/OL]. [2026-04-14]. https://freebsdfoundation.org/wp-content/uploads/2017/06/FreeBSDs-Firewall-Feast.pdf. FreeBSD Foundation 发布的防火墙对比技术文章。
PF
PF(Packet Filter,包过滤器)是源自 OpenBSD 的防火墙,其配置如下。
在 PF 中,table 用于存储需要封禁的 IP 地址列表,anchor 用于组织和管理特定的规则集。Fail2Ban 向 PF 的 table 中添加 IP 地址,再通过 anchor 应用相应规则来封禁。
Fail2Ban 配置文件
将上方配置文件 /usr/local/etc/fail2ban/jail.d/sshd.conf 中 action=bsd-ipfw 改为 action=pf[port={22 23}, name=ssh],其他配置项无需修改。
修改 PF 配置文件
需要先准备 PF 的配置文件,涉及的目录结构:
要让 PF 正常启动,需将示例 PF 配置文件复制到 /etc 目录以便修改和使用:
编辑 /etc/pf.conf 文件,写入:
em0:示例中的em0为网卡名称,需根据实际网卡修改,可使用命令ifconfig查看。
服务
PF 服务的启动和配置如下。
参考文献
Xavier Humbert. PF - fail2ban does not feed pf table[EB/OL]. [2026-03-26]. https://forums.freebsd.org/threads/fail2ban-does-not-feed-pf-table.67798/. FreeBSD 社区论坛讨论 Fail2Ban 与 PF 集成问题。
mfechner. Fail2ban on FreeBSD drops complete pf firewall rules[EB/OL]. [2026-03-26]. https://github.com/fail2ban/fail2ban/issues/1915. GitHub Issue 记录的 Fail2Ban 与 PF 规则冲突问题。
IPFILTER (IPF)
IPFILTER(IPF)是一款开源防火墙,其配置如下。
Fail2Ban 配置文件
ipfilter action 会调用 IPF 的命令来添加和删除封禁规则,因此将上方配置文件 /usr/local/etc/fail2ban/jail.d/sshd.conf 中 action=bsd-ipfw 改为 action=ipfilter,其他配置项无需修改。
服务
IPF 服务的配置和启动如下。
要使 IPF 正常启动并工作,需复制示例文件作为默认配置规则集文件(示例文件自带的规则不影响使用):
配置守护进程:
测试效果
配置完成后,可以测试 Fail2Ban 是否能正常封禁 IP。使用 Fail2Ban 客户端手动将一个 IP 加入封禁列表以验证功能。
为了查看效果,使用 Fail2Ban 客户端将 IP 192.168.179.1 在 sshd 监控下加入封禁列表:
TTY 输出:该输出显示 SSH 服务检测到来自 192.168.179.1 的多次认证失败。
已建立的 SSH 连接也会被强制断开。
查看状态
可以通过以下命令查看 Fail2Ban 的运行状态。
查看 Fail2Ban 对 sshd 监控的状态,包括被封禁的 IP 列表:
解禁 IP
如果需要解除对特定 IP 的封禁,可执行以下操作。
从 sshd 监控中解除对指定 IP 的封禁:
故障排除与未竟事宜
如果遇到问题,可查看日志排查。
Fail2Ban 的日志位于 /var/log/fail2ban.log 文件。
最后更新于