For the complete documentation index, see llms.txt. This page is also available as Markdown.

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-fail2ban

Fail2Ban 配置解读

下文解读 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.0192.168.0.255

  • bsd-ipfw 是示例防火墙,可自行选择,参见下文。

在 FreeBSD 中,Fail2Ban 提供了两个 IPFW 相关的动作配置:ipfwbsd-ipfw。其中 bsd-ipfw 系专门为 FreeBSD 优化的版本,与系统的集成度更高。

警告

如果使用 IPFW 防火墙,必须选择 bsd-ipfw,而不能使用 ipfw,否则无法生效。

配置防火墙

完成 Fail2Ban 配置后,还需配置对应防火墙,随后启动服务。

启动 Fail2Ban 服务:

IPFW

IPFW 是 FreeBSD 内置的防火墙。Fail2Ban 配置同上。

配置开机启动服务

启用防火墙,实现开机自动启动:

警告

请勿立即执行 start 命令,否则可能导致无法通过 SSH 连接。

修改 IPFW 默认规则

IPFW 规则的默认策略是“默认拒绝”,即规则 65535 会阻断所有未匹配的流量。为避免配置过程中访问被阻断,可先将其修改为“默认允许”:

  • 显示当前 IPFW 防火墙规则列表:

参考文献

PF

PF(Packet Filter,包过滤器)是源自 OpenBSD 的防火墙,其配置如下。

在 PF 中,table 用于存储需要封禁的 IP 地址列表,anchor 用于组织和管理特定的规则集。Fail2Ban 向 PF 的 table 中添加 IP 地址,再通过 anchor 应用相应规则来封禁。

Fail2Ban 配置文件

将上方配置文件 /usr/local/etc/fail2ban/jail.d/sshd.confaction=bsd-ipfw 改为 action=pf[port={22 23}, name=ssh],其他配置项无需修改。

修改 PF 配置文件

需要先准备 PF 的配置文件,涉及的目录结构:

  • 要让 PF 正常启动,需将示例 PF 配置文件复制到 /etc 目录以便修改和使用:

  • 编辑 /etc/pf.conf 文件,写入:

  • em0:示例中的 em0 为网卡名称,需根据实际网卡修改,可使用命令 ifconfig 查看。

服务

PF 服务的启动和配置如下。

参考文献

IPFILTER (IPF)

IPFILTER(IPF)是一款开源防火墙,其配置如下。

Fail2Ban 配置文件

ipfilter action 会调用 IPF 的命令来添加和删除封禁规则,因此将上方配置文件 /usr/local/etc/fail2ban/jail.d/sshd.confaction=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 文件。

最后更新于