Fail2Ban不支持直接挂载.py或.sh脚本作为检查器,所有日志检测均基于filter.d/下的.conf文件中定义的正则表达式;需先分析日志样本,编写匹配恶意行为的failregex规则,再通过jail关联启用。

Fail2Ban 本身不支持“插件式”的检查脚本(比如 .py 或 .sh 直接挂载为 filter),它的日志检测逻辑完全基于 正则匹配(regex),所有“检查行为”都封装在 filter.d/ 下的 .conf 文件里——也就是所谓“自定义检查脚本”的实际落地方案,是编写或修改 filter 规则文件,而非运行外部脚本。
换句话说:你不是在 Fail2Ban 里“添加一个检查脚本”,而是写一个能精准匹配目标日志行的正则规则,并把它注册为一个新 filter,再关联到 jail 中。
以下是具体操作路径:
一、明确你要监控的日志和异常模式
先确认两点:
- 日志路径(如
/var/log/nginx/access.log、/www/server/panel/logs/login.log) - 哪些日志行代表“恶意行为”?例如:
- Nginx 登录页反复 401(
POST /admin/login.php HTTP/1.1" 401) - 自定义后台爆破(
Failed login attempt from 192.168.1.100) - WAF 拦截记录(
[BTWAF] BLOCKED: ip=203.0.113.55)
- Nginx 登录页反复 401(
没有真实日志样本,就无法写出有效 regex —— 这一步不能跳过。
二、创建自定义 filter 文件
以监控宝塔后台登录失败为例(日志路径 /www/server/panel/logs/login.log,含 login fail 关键字):
sudo nano /etc/fail2ban/filter.d/bt-login.conf
填入内容:
[Definition] failregex = ^.*login fail.*from <HOST>.*$ ignoreregex =
说明:
-
<HOST>是 Fail2Ban 内置宏,自动提取 IPv4/IPv6 地址 -
failregex必须能唯一匹配恶意行,且不误伤正常日志 -
ignoreregex可选,用于排除白名单 IP 或特定 UA(如监控脚本自身)
✅ 验证是否匹配:
sudo fail2ban-regex /www/server/panel/logs/login.log /etc/fail2ban/filter.d/bt-login.conf输出中
Hits / Missed显示命中数,无报错才算可用。
三、新建 jail 并启用该 filter
在 /etc/fail2ban/jail.d/bt.conf 中写:
[bt-login] enabled = true filter = bt-login logpath = /www/server/panel/logs/login.log maxretry = 5 findtime = 600 bantime = 3600 action = %(action_mwl)s
关键点:
-
filter名称必须与filter.d/下文件名一致(不含.conf) -
logpath要指向真实存在的、有读取权限的日志文件(宝塔下注意 SELinux 或权限限制) -
action可沿用默认action_mwl(邮件+iptables 封禁),也可指定自定义 action(如钉钉告警)
四、重启并验证生效
sudo systemctl reload fail2ban sudo fail2ban-client status bt-login
若看到 Status 显示 Started 且 Jail list 包含 bt-login,说明已加载;
再手动触发一条匹配日志(如用 curl 模拟失败登录),稍等 10 秒后执行:
sudo fail2ban-client status bt-login
查看 Currently banned 是否增加 IP。
不复杂但容易忽略。

















