概述 — 这个页面做什么
封禁列表与信誉(/security/blocklist)讲述 Kitsune ML 与 Suricata IDS 一直在自动封禁的威胁网段的来龙去脉,并为运维人员提供一个可以手动封禁(添加)· 解除 · 重新封禁网段的控制台。
- 数据源表是
legacy_glory连接上的blacklist_info(约 8,000–9,000 行)。封禁的单位不是单个 IP,而是 /24 网段(c_class,例如203.0.113.0/24)。 - 该表由检测采集器(
kts_tx.js·srct_tx.js)和这个运维界面写入;sync_black守护进程(sync_black.mjs)读取它,并在每台主机上以 ipset/iptables 的 DROP 规则强制执行封禁。因此这里的添加/解除属于控制平面,真正的丢包由 sync_black 施加。 reason字段中的来源标签([Kitsune ...]·[Suricata Auto-Block]·[Manual] ...)与证据数值(score · port · ja3 · hits …)会被解析成人类可读的“为什么被抓到”标签(解析过程与语言无关)。
一次“封禁”始终覆盖整个 /24 网段。即使你输入的是单个 IP,也只保留前三段,并规范化为
x.y.z.0/24。误报应通过白名单豁免,而不是缩小封禁范围。
何时使用
- 一眼看清自动防御当前封禁了什么、封禁了多少(生效数量 · 引擎贡献 · 来源国家/地区)。
- 对你在威胁、检测或 IP 调查弹窗中发现的恶意 IP 执行手动封禁(通过
?add=深度链接跳转并预填)。 - 解除你误封的网段,或重新封禁已解除但又恢复活动的网段。
- 将被封网段的代表 IP 与 AbuseIPDB 信誉交叉核对。
页面布局
顶部 KPI
由 summary() 计算,带 30 秒缓存(infr:sec:blocklist:summary)。
| KPI | 含义 | 计算方式 |
|---|---|---|
| 生效中的封禁 | 当前正在强制执行的 /24 网段 | COUNT(*) WHERE is_use=1 |
| 受保护的地址数(副标题) | 生效封禁覆盖的地址数 | active × 256(/24 ≈ 256) |
| 今日封禁 | 最近 24 小时的新增封禁 | is_use=1 AND created_at >= today 00:00 |
| 自动防御比例 | 由 AI/IDS 自动处理的占比 | (kitsune + suricata) / active × 100 |
| 关注的国家/地区 | 生效网段中不同国家/地区的数量 | COUNT(DISTINCT country) WHERE is_use=1 |
| 已解除 | 当前已解除(等待重新封禁) | COUNT(*) WHERE is_use=0 |
自动防御引擎的贡献
生效中的封禁按来源标签拆分为占比条和磁贴。分类依据是对 reason 的 LIKE 匹配。
| 引擎 | 匹配规则 | 含义 |
|---|---|---|
| Kitsune ML | reason LIKE '%Kitsune%' |
集成自编码器异常检测 |
| Suricata IDS | reason LIKE '%Suricata%' |
扫描 / 协议违规的自动封禁 |
| 手动 | reason LIKE '%Manual%' 或 %수동% |
运维人员指定的封禁 |
| 其他 | 上述均未匹配的部分 | active − (kitsune+suricata+manual),下限为 0 |
威胁来源地
blockByCountry(12) 将生效网段聚合成前 12 个国家/地区(GROUP BY country ORDER BY COUNT DESC),以国旗表情符号加排名条展示。点击某个条形可将列表筛选到该国家/地区。
最近的防御活动信息流
blockFeed(16) 以 4×4 网格显示不分状态的最近 16 行(ORDER BY created_at DESC, id DESC)——让你实时感受刚刚抓到了什么。
可筛选的封禁列表
每页 40 张卡片(PER_PAGE=40,ORDER BY created_at DESC, id DESC)。每张卡片显示网段 · 国家/地区 · 来源徽章 · 证据标签(行为 + 关键数值)· 封禁时间 · 状态,行操作为 [信誉] · [详情] · [解除]/[重新封禁]。如果某网段属于已登记的内部网络,会获得 Internal 徽章,并隐藏其信誉按钮(internal_scope.js)。
筛选条件:
- 状态 —
active(默认)·released·all - 来源 —
kitsune·suricata·manual(留空 = 全部) - 国家/地区 — 精确匹配(不超过 64 个字符)
- 搜索(q) — 仅限 CIDR 前缀(正则
^[0-9.]{0,20}$,例如211.→c_class LIKE '211.%')
如何使用
读懂封禁依据
每张卡片的证据标签会从 reason 字符串中挑出权重最高的那一条规则集,并以标签加代表数值的形式呈现。在 srct 的启发式分类中,按下列权重顺序选出最高的一项:
| 分类标记 | 权重 | behavior 键 | 标签 | 代表数值(详情) |
|---|---|---|---|---|
[A2:...] |
6 | brute | 后台暴力破解 | hits=N → N hits |
[A:...] |
5 | scanner | 脆弱路径扫描 | hits=N → N hits |
[D:...] |
4 | ja3 | JA3 僵尸网络指纹 | ja3=N → ja3×N |
[B:...] |
3 | bot_ua | 恶意机器人访问 | hits=N → N hits |
[C:...] |
2 | err_flood | 4xx 错误洪水 | err_rate=NN% |
[E:...] |
1 | short_scan | TCP 端口扫描 | port=N 或 N scan |
如果来源是 Kitsune,或 reason 中含有 score=,则会优先于任何分类被归为 ml_anomaly(机器学习异常),并显示 top=(误差最大的分量)与 score。手动/其他则回退为 manual / auto。
从 reason 中额外提取的事实:score=、top=、port=、short_scan_sessions=、bytes=。reason 示例:
[Kitsune v2.2] anomaly top=TLS score=0.83
[Suricata Auto-Block] [A:URL] hits=42 port=443
[Manual] repeated login abuse (uid=5)
添加手动封禁
- 列表标题栏的 [手动封禁] 会打开添加弹窗。(从威胁/IP 调查跳转过来时,IP 会由
?add=203.0.113.10预填。) - 输入 IP 或 CIDR。单个 IP 会扩展为
/24(203.0.113.10→203.0.113.0/24)。 - 可选填写原因(不超过 160 个字符),然后点击 [封禁]。
- 服务端行为:
- 输入通过
cclassCidr()规范化为x.y.z.0/24(非 IPv4 会以invalid_cidr拒绝)。 - 对于完整的 IPv4,国家/地区会从
ip_info_loop补全(否则沿用已有值 /Unknown)。 - 如果
(server_index=0, c_class)已存在,则更新为is_use=1(重新启用);否则插入一行新记录。原因为"[Manual] <note> (uid=N)"。 - 摘要缓存被清空,并返回刷新后的列表与摘要。
- 输入通过
封禁会立即写入
blacklist_info,但真正的防火墙 DROP 要等到每台主机的sync_black守护进程下一次把它同步进 ipset/iptables 时才生效。如果那个批处理没有运行,防火墙层面就不会真正执行封禁。
解除 / 重新封禁
- [解除] 会设置
is_use=0,于是 sync_black 将其从 ipset 中移除(记录本身保留)。执行前会有确认对话框。 - [重新封禁] 会把已解除的网段恢复为
is_use=1。 - 若目标记录不存在,两者都会返回
not_found。
轮询
security-blocklist.js 每 30 秒调用一次 /security/blocklist/live,以刷新摘要和当前页。
数据来源
| 项目 | 来源 | 说明 |
|---|---|---|
| 封禁台账 | blacklist_info(legacy_glory) |
id, server_index, c_class, country, reason, is_use, created_at, updated_at · UNIQUE(server_index, c_class) |
| 国家/地区补全 | ip_info_loop(legacy_glory) |
添加时对完整 IPv4 的国家/地区查询 |
| 内网判定 | SecurityScope::internalMatchers() |
已登记实例的 IP + 运维策略白名单 → Internal 徽章 |
| 防火墙执行 | sync_black 守护进程 |
blacklist_info → ipset/iptables DROP |
| 自动封禁来源 | kts_tx.js · srct_tx.js |
写入 reason 的来源标签与证据字符串 |
| 审计日志 | infr_audit_log |
sec.block_add · sec.block_release · sec.block_readd |
读取骨干是 App\Repositories\SecurityRepository;叙述与写入由 App\Services\Security\BlocklistService 编排。凭据只来自 config('database.connections.legacy_glory')——绝不硬编码。
访问权限
- 查看页面 — 你必须属于安全角色域(sitemap
min_req=2)。在已部署的等级体系中,staff(5)和 admin(10)可以看到安全类页面;demo(1)在安全范围之外。 - 写操作(添加/解除/重新封禁) — 服务端强制要求
infr_user_level >= 2(canWrite)。低于该等级返回403 forbidden。因此 demo(1)无法写入,staff 与 admin 可以。 - 每一次写操作都会记录到
InfrAuditLog,并可在审计日志中追溯(meta 中含操作者、目标 CIDR、是否重新启用等)。
由于这些属于破坏性的安全操作,界面会在执行前弹出确认(step-up)对话框。请仔细核对 CIDR,以免误封一大片网段。
排障与常见问题
- 我封禁了,但攻击还在继续。 这个页面只更新台账。请确认目标主机上的
sync_black正在运行,并且 ipset 确实被更新了。另外,封禁是按 /24 进行的,来自其他网段的攻击需要各自单独封禁。 - [手动封禁] 返回 403。 你的登录等级低于 2。请改用 staff/admin 账号重试(参见 RBAC 等级)。
- 输入被判为“不是有效的 IP/CIDR”。 只接受
a.b.c/a.b.c.d/a.b.c.d/nn。不支持 IPv6 和主机名。 - 国家/地区显示为 Unknown。 该 IP 没有
ip_info_loop补全数据,或者你只输入了 CIDR。添加一个完整的 IPv4 有可能补上国家/地区。 - KPI/列表没有变化。 摘要有 30 秒缓存。写操作之后会立即清空,但采集器带来的变化最多可能延迟 30 秒。
- 我误封了一个正常网段。 请立即解除;如果重新封禁的误报反复出现,就把它加入白名单,让 srct_tx 在封禁前予以豁免。
相关内容
- 威胁 — 通过
?add=把恶意 IP 转交到这里进行封禁 - 白名单 — 封禁豁免(防止误报,带有效期)
- 检测与 JA3 — Kitsune / srct / JA3 检测的工作原理
- 自动封禁 — 计划执行的自动封禁流水线
- IP 信誉(AbuseIPDB) — 交叉核对代表 IP
- 审计日志 — 追溯封禁/解除历史
