InfraGuard

IP 连接

以端口强度圆点展示每台服务器的远端对端 IP 的主机视图,并配有 IP 调查弹窗,涵盖连接明细、汇总历史、地理/ASN、信誉以及封禁深链。

概述 — 这个页面做什么

IP 连接 是 基础设施 ▸ 连接与流量 的第二个页面(即 host view)。端口连接 以「端口 → 服务器」为轴,而本页面以 「服务器(主机) → 远端对端 IP」 为轴。每张服务器卡片按连接强度排序列出当前连接到该服务器的远端 IP,并为每个 IP 显示 按受监控端口划分的会话强度圆点。目标是一眼看清哪个 IP 在哪台服务器的哪个端口上连接、以及强度有多大。

点击对端 IP 会打开共享的 IP 调查弹窗,可在同一处查看该 IP 的连接明细(哪台服务器 / 端口 / TCP 状态 / 会话数)、汇总表的连接历史迷你图、地理/ASN/ISP 富化信息、外部信誉链接,以及跳转到 封禁列表 的封禁深链。

所有数据均以 只读 方式从遗留流量库(legacy_glory)读取。本页面从不写入任何内容 — 封禁等写操作通过弹窗深链移交给 封禁列表 页面,写入在那里完成。

何时使用

页面布局

页首 · 计时器

右上角是设置显示窗口的 计时器切换(1 分钟 / 5 分钟 / 1 小时)、最新快照时间戳以及手动刷新按钮。计时器即以最新快照为锚点的查询窗口长度。

计时器 查询窗口
1(默认) 仅最新快照的那一分钟
5 从最新快照往前 5 分钟
60 从最新快照往前 60 分钟

所选计时器会保存到 localStorage['infr:timer:traffic-ips'],跨访问保留。仅允许 1/5/60,其他值一律强制为 1。

强度图例 + 服务器标签

服务器(主机)卡片

每台被选中的服务器一张卡片。表头显示主机名与对端数量,主体是一张表格。

卡片可通过握柄拖拽重排(顺序保存到 infr:order:traffic-ips),使用 row-span masonry 重新排布,并每次分页显示 20 张。

端口强度圆点配色

会话数 令牌 颜色 含义
0 none 浅色 该端口上未连接
1–9 good 绿色 低强度
10–49 warn 琥珀色 中等强度
50+ crit 红色 高强度

IP 调查弹窗

由共享混入 mixins/ip_detail.js +局部视图 infra/partials/ip-detail-modal.blade.php 驱动。它有两种模式。

  1. sources 模式 — 某个(服务器, 端口)窗口内的来源 IP 列表。从 端口连接 的 SRC 圆圈进入。
  2. investigate 模式(本页面的默认入口) — 单个 IP 的深入分析。通过点击对端行进入。

investigate 模式显示的内容:

区域 内容 来源
摘要 KPI 会话总数 · 服务器数 · 端口数 · 首次/最后出现 ipSeenSpan()(整个保留期的 MIN/MAX(created_at))
地理信息 国家 · 城市 · ASN · ISP ip_info_loop(ipEnrichment())
连接历史 粒度(5min / 1hour / 1day)迷你图 汇总表(ipHistory())
连接明细 服务器 × 端口 × TCP 状态的会话数 · 远端端口 · 首次/最后 traffic_session_ct(ipBreakdown())

弹窗底部操作(investigate): 复制 IP · 查看 IP(通过 ?src_ip= 在本页面重新调查)· 信誉 ↗(外部 AbuseIPDB,新标签页)· 封禁 IP(通过 ?add= 深链到 封禁列表)。

弹窗中的 信誉 ↗ 按钮只是一个在新标签页打开外部 abuseipdb.com/check/… 的普通链接。在控制台内部显示可信度仪表盘与举报历史的 应用内信誉弹窗 是安全页面的功能 — 参见 IP 信誉。

使用方法

基本流程

  1. 用 计时器(1/5/60 分钟)设置窗口。越短越接近「此刻正在连接」。
  2. 用 服务器标签 缩小到你关心的服务器(默认全选)。
  3. 在服务器卡片上,寻找带 红色强度圆点(50 个以上会话)的对端,或 跨越多个端口 的对端。
  4. 点击可疑对端所在的行 打开调查弹窗。
  5. 在弹窗中用 连接明细 查看它命中了哪台服务器/端口/状态,用 历史 判断持续性(一次性还是反复出现),用 地理/ASN 判断来源。
  6. 如有需要,通过 信誉 ↗ 查看外部举报历史;若确认恶意,用 封禁 IP 交给 封禁列表。

切换历史粒度

在弹窗的历史区域切换粒度会改变所用的汇总表。默认粒度是 小时级(1hour) — 密度与速度的最佳平衡。

5min    → traffic_session_ct_5min   · 单个 IP · 最新快照 −6h 窗口
1hour   → traffic_session_ct_1hour  · 单个 IP · 最新快照 −3d 窗口   (默认)
1day    → traffic_session_ct_1day   · /24 网段 · 最新快照 −120d 窗口

日级(1day)历史是按该 IP 的 /24 网段(前 3 个八位组,256 个 IP)聚合的,而不是按单个 IP — 因为汇总采集器按 C 类地址存储 _1day。为了让范围一目了然,弹窗随后会显示形如 211.224.128.0/24 的 CIDR 范围标签。5min 与 1hour 则原样使用单个 IP。

深链

/infra/traffic/ips?src_ip=203.0.113.10
/infra/traffic/ips?servers=glory,blue

轮询

页面 每 30 秒 轮询一次 /infra/traffic/ips/live 以自动刷新(不是 Reverb — 采集器在 Laravel 之外写入数据库,因此轮询是合理的选择)。刷新时,如果原先是全选状态,会自动纳入新出现的服务器,并把已经消失的服务器从选择中移除。

数据来源

窗口锚定

显示窗口锚定在 数据的最新快照(MAX(snapshot_ts))上,而不是应用的 now()。采集器的存储时钟可能比应用时钟落后多达约 9 小时,因此基于 now() 的窗口会落到数据范围之外,导致页面空白。

主机视图查询(ipPeers)

-- TrafficRepository::ipPeers(参数绑定)
SELECT server_name, remote_ip, local_port, SUM(session_count) AS total_sessions
  FROM traffic_session_ct
 WHERE snapshot_ts BETWEEN :min AND :max
   AND local_port IN (:ports)          -- OpsPolicy::monitoredPorts()
 GROUP BY server_name, remote_ip, local_port;

monitored ports 不是硬编码的 — 它们来自 运维策略 中的 infra_monitored_ports(CSV)。ipsData() 的结果会缓存 20 秒(键为 infr:traffic:ips:v1:{timer}:{ports})。

调查弹窗的查询

方法 表 作用
ipSeenSpan() traffic_session_ct MIN/MAX(created_at) = 真实观测跨度(保留期约 8 小时),MAX(snapshot_ts) = 该 IP 自己的最新批次(明细的锚点)
ipBreakdown() traffic_session_ct 每个服务器×端口×状态的会话合计 · 远端端口 · 首次/最后(LIMIT 200)
ipHistory() 3 张汇总表 各粒度的会话历史(LIMIT 400)
ipEnrichment() ip_info_loop 国家 · 城市 · ASN · ISP(不存在时优雅返回 null)

连接明细锚定在该 IP 自己的最新快照批次上,而不是全局最新窗口。 这是有意为之,这样即使某个 IP 当下并未连接、但过去曾经访问过我们,也仍能依据其最后一次被观测到的时刻重建并展示其分布。

汇总表索引注意事项(性能关键)

ipHistory() 总是显式指定 direction IN ('inbound','outbound')。

-- _1day 使用复合索引 t_ip(direction, remote_ip)。
-- 不显式给出 direction 时只会扫描 created_at 范围 → 12 秒以上。
-- 给出之后索引即可生效 → 约 20ms(2026-08-06 实测)。
SELECT created_at, SUM(session_count) AS sessions
  FROM traffic_session_ct_1day
 WHERE direction IN ('inbound','outbound')
   AND remote_ip = :cclass_key           -- 日级使用 /24 前 3 个八位组作为键
   AND created_at >= :since
 GROUP BY created_at
 ORDER BY created_at
 LIMIT 400;

这些汇总表非常庞大(_5min ≈ 209M · _1hour ≈ 112M · _1day ≈ 24M),因此 收紧的 created_at >= 窗口 + LIMIT 是必须的。弹窗结果由缓存保护: investigate 为 25 秒,sources 为 20 秒。

访问权限

疑难排查与常见问题

卡片是空的,只显示「该窗口内没有对端」。 这说明最新快照在受监控端口上没有任何连接。(1) 把计时器放宽到 5 或 60,(2) 确认真实的服务端口已在 运维策略 的 infra_monitored_ports 中登记,(3) 检查最近的快照是否正在写入 traffic_session_ct(采集器 check_ct.js)。

全部为空,而且没有快照时间戳。 很可能是 legacy_glory 连接本身有问题,或者 traffic_session_ct 是空的。请核对 .env 中的 legacy_glory 数据库凭据,并确认流量采集器正在运行。查询失败时,返回体会带有 error:true。

只有日级历史显示「该 /24 网段没有日级汇总历史」。 日级聚合可能会滞后一天,并且以 /24 网段为键。请先查看 5min 与小时级粒度。如果该网段尚未生成汇总,这属于预期行为。

我点击了一个 IP,但连接明细是空的。 该 IP 在最近的快照里没有会话,但存在历史观测记录。请先用摘要 KPI 的首次/最后出现时间和连接历史来确认过去的活动(明细是依据该 IP 最后一个快照批次重建的)。

弹窗的「信誉 ↗」打开了新标签页,而不是内联显示。 这是设计如此。这个流量弹窗使用的是外部 AbuseIPDB 链接。若要在控制台内查看可信度仪表盘与举报历史,请使用安全页面的 应用内信誉弹窗。

强度圆点的颜色由什么决定? 由每个端口的 会话数 区间决定 — 1–9 绿色 · 10–49 琥珀色 · 50 以上红色 · 0 为浅色圆点。仅前 8 个受监控端口会作为列显示。

相关内容

IP 연결 — 서버별 원격 peer
IP 연결 — 서버별 원격 peer