Skip to main content
Fail2ban 没有内置的 Webhook 通知,但它的 action 就是在封禁或解封 IP 时执行的 shell 命令(官方自带的 abuseipdb action 就是用 curl 调用外部 API)。因此不需要单独的 Fail2ban 集成:在 Fail2ban 里添加一个 action 文件,用 curl 把封禁事件 POST 到 Flashduty 的 标准告警事件 集成;解封时再发一条恢复事件,关闭对应告警。

在 Flashduty On-call


您可通过以下两种方式获取集成推送地址,任选其一即可。集成类型都选择标准告警事件,不是 Fail2ban。

使用专属集成

  1. 进入 Flashduty 控制台,选择 协作空间,打开一个协作空间
  2. 选择 配置 → 集成数据 → 专属集成,点击 新增一个集成
  3. 选择 标准告警事件,点击 保存
  4. 打开生成的集成卡片,复制 推送地址,形如 https://api.flashcat.cloud/event/push/alert/standard?integration_key=<集成密钥>

使用共享集成

  1. 进入 Flashduty 控制台,选择 集成中心 → 告警事件
  2. 选择 标准告警事件,填写集成名称
  3. 配置默认路由并选择协作空间;创建后可在 路由 中增加更多规则
  4. 点击 保存,复制生成的 推送地址

在 Fail2ban 中配置


以下操作在运行 Fail2ban 的主机上进行,需要 root 权限。
1

创建 action 文件

新建 /etc/fail2ban/action.d/flashduty.conf:
<name>、<ip>、<failures>、<bantime> 是 Fail2ban 在执行 action 时替换的标签(见 jail.conf(5) 的 Action Tags):<name> 为 jail 名称,<ip> 为被封 IP,<failures> 为触发封禁的失败次数,<bantime> 为封禁时长(秒)。flashduty_url 是 [Init] 中的自定义参数,在 jail 里传入。
不要把 <matches> 放进 JSON。它包含原始日志行,可能带有用户名等敏感内容,也可能含有破坏 JSON 的引号。
2

在 jail 中启用

编辑 /etc/fail2ban/jail.local,在需要通知的 jail 里追加 flashduty action,并把 Flashduty 推送地址传给 flashduty_url。action 可以写多行;第一行保留默认的封禁 action:
如果想让所有 jail 都通知,把这两行 action 写在 [DEFAULT] 段。
3

重载并验证

banip 手动封禁一个 IP,unbanip 手动解封。第一条命令后 Flashduty 应出现标题为 Fail2ban sshd banned / 192.0.2.10 的告警,第二条命令后该告警被关闭。没有收到时,先在主机上用同样的 curl 命令手动请求推送地址,响应里会有错误码,Fail2ban 自己的报错在 /var/log/fail2ban.log。

字段映射


恢复与去重


  • Fail2ban 在封禁时间到期后执行 actionunban,Flashduty 用相同的 alert_key 关闭对应告警。
  • 封禁时间设为永久(bantime = -1)时不会解封,告警不会自动关闭。请在接收该集成的协作空间开启 超时自动关闭,或处理完成后手动关闭。
  • 同一 jail 内同一 IP 再次被封会更新同一条告警,不会产生重复告警。
  • norestored = 1 让 Fail2ban 重启后从数据库恢复的封禁不再通知,避免重启时产生一批重复告警。

排查问题


  • Flashduty 没有收到告警:确认 fail2ban-client reload 已执行;用 curl 在同一台主机上手动请求推送地址,看响应和网络是否可达 api.flashcat.cloud
  • 返回 InvalidParameter:推送地址缺少 integration_key,或 JSON 因引号被破坏;确认 [Definition] 里没有多余的换行
  • 告警没有恢复:确认 actionunban 存在,且 alert_key 与封禁时一致;永久封禁需要开启超时自动关闭
  • 通知太多:只在需要人工响应的 jail(例如 recidive 或 maxretry 较高的 jail)里启用 flashduty,普通的密码输错封禁不必通知