fail2ban通过自定义action实现封禁需新建action文件(如nft-custom.conf),定义banaction/unbanaction等指令调用iptables/nftables等命令,并在jail中指定该action,最后执行reload生效。

Fail2Ban 通过自定义过滤器(filter)识别恶意行为,再用动作(action)执行封禁操作。要让 Fail2Ban 执行自定义防火墙指令(如 iptables、nftables 或 ufw),关键不是“重写整个动作”,而是正确配置或扩展已有的 action,使其调用你指定的命令。
理解 Fail2Ban 的 action 机制
Fail2Ban 的封禁逻辑分两步:检测(filter)→ 响应(action)。Action 定义在 /etc/fail2ban/action.d/ 目录下,常见如 iptables.conf、ufw.conf。每个 action 是一个配置文件,包含 banaction、unbanaction 等指令,实际调用的是 shell 命令模板(如 iptables -I INPUT -s <ip> -j DROP</ip>)。
- 动作本质是参数化 shell 脚本,变量如
<ip></ip>、<port></port>、<chain></chain>在运行时被替换 - 不建议直接修改系统自带的
iptables.conf,而应新建自定义 action 文件,避免升级覆盖 - 所有 action 必须声明
[Definition]段,并至少提供banaction和unbanaction
编写自定义 action 文件(以 nftables 为例)
假设你想用 nft 命令封禁 IP 到名为 fail2ban-block 的链中,创建 /etc/fail2ban/action.d/nft-custom.conf:
[Definition]
banaction = nft add rule ip filter fail2ban-block ip saddr <ip> drop
unbanaction = nft delete rule ip filter fail2ban-block handle <nft_handle>
# 可选:支持获取规则 handle(用于精准删除)
actioncheck = nft list chain ip filter fail2ban-block 2>/dev/null | grep -q "ip saddr <ip>"
actionstart = nft add chain ip filter fail2ban-block { type filter hook input priority -1 \; }
actionstop = nft delete chain ip filter fail2ban-block 2>/dev/null || true
</ip></nft_handle></ip>
-
banaction执行封禁;unbanaction需配合actioncheck获取规则 handle 才能可靠删除(Fail2Ban 5.0+ 支持<nft_handle></nft_handle>自动注入) -
actionstart在 jail 启用时初始化链;actionstop在停用时清理 - 确保
nft命令可用,且用户fail2ban有执行权限(通常需sudo或设为 root 运行)
在 jail 中启用你的自定义 action
编辑 /etc/fail2ban/jail.local,为某个 jail 指定新 action:
[sshd] enabled = true filter = sshd action = nft-custom[name=sshd, port="ssh", protocol="tcp"] logpath = /var/log/auth.log maxretry = 3 bantime = 1h
-
action = nft-custom[...]表示使用nft-custom.conf,方括号内传入参数(会被<name></name>、<port></port>等变量捕获) - 若同时需要日志通知或邮件,可用多 action 语法:
action = nft-custom[...] sendmail[...] - 修改后务必运行
fail2ban-client reload生效,用fail2ban-client status sshd验证
调试与验证要点
自定义 action 容易因权限、语法或路径问题失败,排查时重点关注:
- 检查 Fail2Ban 日志:
journalctl -u fail2ban -f,搜索ERROR或Command关键词 - 手动测试命令:切换到
fail2ban用户(sudo -u fail2ban -s),运行 action 中的banaction命令,确认无权限拒绝或命令未找到 - 验证封禁效果:触发一次失败登录后,运行
nft list chain ip filter fail2ban-block或iptables -L -n -v | grep DROP - 确保防火墙服务(如
nftables或iptables)开机自启,且规则未被其他工具覆盖











