如何在Fail2Ban中创建自定义动作执行Bash脚本打印横幅,或提供替代实现方案
嗨,我来帮你搞定这个问题!你之前直接在jail.conf里写脚本路径的做法不是Fail2Ban的标准玩法,咱们用官方推荐的自定义动作方式来实现,这样更规范也不容易出问题。另外,我还会给你一个替代方案,如果你想给攻击者直接显示警告横幅的话。
方法一:创建Fail2Ban自定义动作(IP被封禁时执行脚本)
这个方法适合你想在IP被Fail2Ban封禁时,执行脚本做通知(比如给管理员发消息、记录到专属日志)的场景。
1. 编写自定义动作配置文件
在/etc/fail2ban/action.d/目录下新建一个配置文件,比如custom-banner.conf,内容如下:
[Definition] # 动作启动/停止/检查的操作(这里不需要的话留空即可) actionstart = actionstop = actioncheck = # 核心:当IP被封禁时执行你的脚本,还能传递Fail2Ban的内置变量 actionban = /bin/bash /etc/fail2ban/banner.sh <ip> <name> # 可选:IP被解封时的操作(如果需要的话) actionunban =
这里的<ip>会自动替换为被封禁的IP地址,<name>是对应的jail名称(比如sshd),你可以在banner.sh里接收这些参数,让输出内容更精准。
2. 修改Jail配置
打开jail.local(推荐用这个文件覆盖默认配置,避免系统升级时被重置),找到你要配置的jail(比如sshd),把自定义动作添加到action项里:
[sshd] enabled = true port = ssh logpath = %(sshd_log)s backend = %(sshd_backend)s # 把默认动作和自定义动作结合,比如保留默认的邮件通知+日志记录,再加上你的脚本 action = %(action_mw)s custom-banner
如果你不需要默认动作,直接写action = custom-banner就行。
3. 给脚本加执行权限
别忘了让你的脚本能运行:
chmod +x /etc/fail2ban/banner.sh
4. 重启Fail2Ban生效
systemctl restart fail2ban
方法二:给攻击者显示动态警告横幅(替代方案)
如果你想要的是在攻击者尝试登录时,直接给他们显示警告横幅(比如提示他们已经被监控,再试会被封禁),那可以结合SSH的动态Banner功能来实现,不需要依赖Fail2Ban的动作触发:
1. 编写动态横幅脚本
创建/etc/ssh/custom-banner.sh,内容如下:
#!/bin/bash # 获取当前尝试登录的远程IP REMOTE_IP=$(echo "$SSH_CONNECTION" | awk '{print $1}') # 检查该IP是否已经被Fail2Ban封禁 if fail2ban-client status sshd | grep -q "$REMOTE_IP"; then echo "⚠️ 警告:你的IP已因多次失败登录被封禁,请勿继续尝试!" else # 统计该IP最近的失败登录次数 FAILED_COUNT=$(grep "Failed password for" /var/log/auth.log | grep "$REMOTE_IP" | wc -l) if [ "$FAILED_COUNT" -ge 3 ]; then echo "⚠️ 警告:你已有$FAILED_COUNT次失败登录尝试,再试将被封禁!" else # 正常登录提示(可自定义) echo "欢迎登录本服务器,请注意账户安全!" fi fi
2. 修改SSH配置
打开/etc/ssh/sshd_config,找到Banner项并修改:
Banner /etc/ssh/custom-banner.sh
保存后重启SSH服务:
systemctl restart sshd
这样,任何尝试SSH登录的用户都会根据自己的IP状态看到对应的横幅。
为什么你之前的尝试不生效?
Fail2Ban的action项需要引用已经定义好的动作配置(就是action.d目录里的文件),不能直接写命令路径,所以你之前在jail.conf里加的/bin/bash /etc/fail2ban/banner.sh不会被执行,用上面的自定义动作方法就没问题啦。
备注:内容来源于stack exchange,提问作者prince royce

