AI 检测攻击 → Slack 确认 → 自动在防火墙中添加封禁规则 #
我们在 BASTION 原有的“检测 → 通知”流程中新增了“自动响应”功能。当 AI 检测到端口扫描时,会在 Slack 上发布封禁提案;经人工批准后,封禁规则会立即添加到 OPNsense 防火墙中。24 小时后自动解除。
仅靠检测与通知是不够的 #
此前 BASTION 的工作方式是分析日志以检测异常,并通过 Slack 发出通知(参见第一篇)。但通知之后的动作——即在防火墙中封禁攻击源 IP——此前需要人工手动打开 OPNsense 管理控制台进行操作。
凌晨 3 点收到通知,第二天早上登录后才执行封禁。在这 6 个小时里,攻击者可以自由地进行扫描。
为此,我们在 BASTION 中实现了反应式防御。当 AI 检测到攻击时,会自动提出添加防火墙封禁的提案,在 Slack 上批准后即可立即将规则应用到 OPNsense。
整体流程 #
| 步骤 | 执行主体 | 操作内容 |
|---|---|---|
| 1. 攻击检测 | analyze.sh(每 15 分钟) | 通过日志分析检测端口扫描与暴力破解尝试,严重程度标记为 HIGH |
| 2. 封禁提案 | propose-block.sh | 白名单检查 → 去重 → 将提案发布到 Slack |
| 3. 人工批准 | 运维人员 | Slack 命令:@OpenClaw-Monitor approve block-XXXXX |
| 4. 执行封禁 | fw-action.sh | 通过 OPNsense API 将 IP 添加到 Alias(BASTION_AutoBlock) |
| 5. 自动解除 | auto-expire.sh(每小时定时任务) | 24 小时后将 IP 从 Alias 中移除 |
实际运行情况 #
1. 封禁提案发布到 Slack #
当每 15 分钟一次的常规分析检测到 severity: HIGH 时,会自动向 Slack 发布针对攻击源 IP 的封禁提案。
封禁提案 [block-20260423-003]
攻击源 IP:xxx.xxx.119.51
检测原因:port_scan — 3,003 次封禁/失败
严重程度:HIGH
自动解除:24 小时后
批准:@OpenClaw-Monitor approve block-20260423-003
拒绝:@OpenClaw-Monitor reject block-20260423-003
※ 若 30 分钟内无响应,将自动拒绝。
封禁提案 [block-20260423-004]
攻击源 IP:xxx.xxx.47.173
检测原因:port_scan — 977 次封禁/失败
严重程度:HIGH
自动解除:24 小时后
封禁提案 [block-20260423-005]
攻击源 IP:xxx.xxx.102.23
检测原因:port_scan — 965 次封禁/失败
严重程度:HIGH
自动解除:24 小时后
每次分析最多发布 3 条提案。按封禁次数由多到少选取排名靠前的 IP。
2. 批准后立即反映到防火墙 #
在 Slack 上发送批准命令后,fw-action.sh 会调用 OPNsense API,将该 IP 添加到封禁列表中。
封禁执行完成 [block-20260423-003]
IP:xxx.xxx.119.51
自动解除:2026-04-24T13:37:14+09:00
在 OPNsense 一侧,该 IP 会被添加到名为 BASTION_AutoBlock 的 Alias 中。系统预先配置了引用该 Alias 的 WAN 封禁规则,因此通过 API 将 IP 加入 Alias 后,封禁会立即生效。
3. 24 小时后自动解除 #
auto-expire.sh 通过每小时执行一次的定时任务,自动移除已到期的封禁。
自动解除:xxx.xxx.119.51(已过 24 小时)
如果同一 IP 在解除后再次进行扫描,将在下一次分析中重新被提出封禁提案。
安全机制 #
由于是通过 AI 来自动化防火墙操作,因此需要有安全机制来防止误判导致封禁正常流量。我们实现了 5 层防御。
| 层级 | 内容 | 目的 |
|---|---|---|
| 白名单 | 内部 IP、DNS、公司全局 IP 永不封禁 | 防止封禁自身流量 |
| Slack 审批把关 | 执行前由人工确认(初期阶段) | 捕捉 AI 的误判 |
| 速率限制 | 每小时最多封禁 10 次 | 防止异常的大量封禁 |
| 自动解除 | 24 小时后自动移除封禁 | 即使误判也能自动恢复 |
| 紧急清空 | 可通过 Slack 即时移除所有封禁 | 业务受到影响时可紧急回滚 |
白名单匹配的实现 #
白名单匹配使用 Python 的 ipaddress 模块实现,支持 CIDR 表示法(如 10.0.0.0/8),并通过内置检查自动排除私有 IP、回环地址、链路本地地址、组播地址与保留地址。
# Whitelist matching flow 1. Built-in check: is_private / is_loopback / is_link_local / is_multicast / is_reserved 2. File matching: Check each line in block-whitelist.txt (single IP or CIDR) 3. Result: exit 0=block prohibited / exit 1=block allowed
OPNsense API 集成 #
封禁机制本身是一个 OPNsense Alias(IP 地址组)。我们预先创建一个名为“BASTION_AutoBlock”的 Alias,并配置一条以该 Alias 为来源的 WAN 封禁规则。
# Add IP (execute block)
curl -k -u "${API_KEY}:${API_SECRET}" \
-X POST "${OPNSENSE}/api/firewall/alias_util/add/BASTION_AutoBlock" \
-d '{"address":"attack_source_ip"}'
# Remove IP (remove block)
curl -k -u "${API_KEY}:${API_SECRET}" \
-X POST "${OPNSENSE}/api/firewall/alias_util/delete/BASTION_AutoBlock" \
-d '{"address":"attack_source_ip"}'alias_util 会直接操作运行时表,因此仅需一次 API 调用即可立即生效,无需重新加载防火墙规则。
审计日志 #
所有的封禁、解除、批准、拒绝以及超时都会被记录到审计日志中。
2026-04-23 13:31:33 [PROPOSE] new block-20260423-003 ip=xxx.xxx.119.51 reason=port_scan count=3003 2026-04-23 13:37:14 [BLOCK] approved block-20260423-003 ip=xxx.xxx.119.51 expires=2026-04-24T13:37:14 2026-04-24 00:00:03 [EXPIRE] auto-expire block-20260423-003 ip=xxx.xxx.119.51 api=done
可通过标签([PROPOSE] / [BLOCK] / [EXPIRE] 等)进行 grep,仅提取特定操作。
逐步自主化 #
目前我们采用的是 Slack 审批把关的方式,但在设计上支持随着成果的积累逐步实现自主化。
| 阶段 | 模式 | 迁移条件 |
|---|---|---|
| 阶段 1(当前) | Slack 审批把关 | — |
| 阶段 2 | 条件性自主 | 高置信度 + 达到一定封禁次数以上 → 自动执行。否则仍走审批把关 |
| 阶段 3 | 完全自主 | 连续 3 个月误判率低于 0.1% |
为什么要循序渐进? #
在 BASTION 开发过程中,我们遇到过 LLM 出现幻觉、“捏造出并不存在的事件”的情况。有一个账户被报告“被锁定 18 次”,但日志中实际的事件数量为零。如果当时就已经实现了反应式防御,我们可能就会因为这些幽灵攻击而误封 IP。正是这段经历,成为我们决定“执行前先由人工确认”这一设计的依据。
Slack 审批把关的局限性已经显现 #
在通过 OpenClaw 进行 Slack 批准的过程中,我们也遇到过 LLM 在批处理中未能执行部分命令、却报告“已完成”的情况。只要中间存在基于 agent 的 LLM,这种不确定性在结构上就无法避免。而在完全自动化(直接的 analyze.sh → propose-block.sh → fw-action.sh 流水线)中,由于绕过了 LLM 的回复生成环节,这个问题就不会出现。
总结 #
BASTION 的反应式防御实现了“日志分析 → 封禁提案 → Slack 批准 → OPNsense API 封禁 → 24 小时自动解除”这一流程的全自动化。白名单、审批把关、速率限制、自动解除、紧急清空这 5 层安全机制,将误判带来的业务影响降到最低。
目前我们仍以 Slack 审批把关的方式运行,但今后会不断积累成果数据,逐步引入自主化。此前止步于“检测 → 通知”的监控系统,如今已在“检测 → 判断 → 响应 → 自动解除”这一完整闭环中运转。
BASTION 是一项在隔离环境中实现 AI 安全监控的服务。