概述 — 这个页面做什么
IP 连接 是 基础设施 ▸ 连接与流量 的第二个页面(即 host view)。端口连接 以「端口 → 服务器」为轴,而本页面以 「服务器(主机) → 远端对端 IP」 为轴。每张服务器卡片按连接强度排序列出当前连接到该服务器的远端 IP,并为每个 IP 显示 按受监控端口划分的会话强度圆点。目标是一眼看清哪个 IP 在哪台服务器的哪个端口上连接、以及强度有多大。
点击对端 IP 会打开共享的 IP 调查弹窗,可在同一处查看该 IP 的连接明细(哪台服务器 / 端口 / TCP 状态 / 会话数)、汇总表的连接历史迷你图、地理/ASN/ISP 富化信息、外部信誉链接,以及跳转到 封禁列表 的封禁深链。
- 路由:
/infra/traffic/ips(页面)·/infra/traffic/ips/live(轮询 JSON)·/infra/traffic/ip-detail(调查 JSON) - 控制器:
App\Http\Controllers\Infra\TrafficController@ips - 构建器:
App\Services\Traffic\SessionQueryService::ipsData()+ipDetail() - 来源查询:
App\Repositories\TrafficRepository(遗留的legacy_glory连接,只读) - 来源表:
traffic_session_ct(外加汇总表traffic_session_ct_5min/_1hour/_1day,富化表ip_info_loop)
所有数据均以 只读 方式从遗留流量库(
legacy_glory)读取。本页面从不写入任何内容 — 封禁等写操作通过弹窗深链移交给 封禁列表 页面,写入在那里完成。
何时使用
- 发现 远端对端数量异常 的服务器(扫描、僵尸网络、爬虫洪流)。
- 捕捉某个 IP 同时命中多台服务器/多个端口 的横向扩散模式。
- 从 流量视角 回溯由 IDS/防火墙告警浮现出来的 IP(实际上是哪台服务器、哪个端口、哪种状态存在会话)。
- 在决定封禁之前,核实该 IP 的 连接量、历史、地理位置和信誉。
- 深入分析从 端口连接 的 SRC 圆圈进入的来源 IP。
页面布局
页首 · 计时器
右上角是设置显示窗口的 计时器切换(1 分钟 / 5 分钟 / 1 小时)、最新快照时间戳以及手动刷新按钮。计时器即以最新快照为锚点的查询窗口长度。
| 计时器 | 查询窗口 |
|---|---|
1(默认) |
仅最新快照的那一分钟 |
5 |
从最新快照往前 5 分钟 |
60 |
从最新快照往前 60 分钟 |
所选计时器会保存到 localStorage['infr:timer:traffic-ips'],跨访问保留。仅允许 1/5/60,其他值一律强制为 1。
强度图例 + 服务器标签
- 强度图例: 圆点颜色表示每个端口的会话数区间 —
1–9(good)·10–49(warn)·50+(crit)。 - 服务器标签: 用于筛选要显示哪些服务器(主机)。默认全选,且标签筛选 仅在本次会话有效(不写入 localStorage),因此重新访问会回到全选。
[All]标签用于切换全选/清空。
服务器(主机)卡片
每台被选中的服务器一张卡片。表头显示主机名与对端数量,主体是一张表格。
- 行(对端) = 一个远端 IP。列为
Remote IP·Total(会话总数)· 随后是 按受监控端口划分的强度圆点(前 8 个受监控端口)。 - 对端按 连接(会话)总数降序 排列,每台服务器最多显示 100 个对端。
- 强度圆点用颜色表示该对端在各端口上持有的会话数量(见下表)。
- 点击某一行会打开该 IP 的调查弹窗。
卡片可通过握柄拖拽重排(顺序保存到 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 驱动。它有两种模式。
- sources 模式 — 某个(服务器, 端口)窗口内的来源 IP 列表。从 端口连接 的 SRC 圆圈进入。
- 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/5/60 分钟)设置窗口。越短越接近「此刻正在连接」。
- 用 服务器标签 缩小到你关心的服务器(默认全选)。
- 在服务器卡片上,寻找带 红色强度圆点(50 个以上会话)的对端,或 跨越多个端口 的对端。
- 点击可疑对端所在的行 打开调查弹窗。
- 在弹窗中用 连接明细 查看它命中了哪台服务器/端口/状态,用 历史 判断持续性(一次性还是反复出现),用 地理/ASN 判断来源。
- 如有需要,通过 信誉 ↗ 查看外部举报历史;若确认恶意,用 封禁 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。
深链
?src_ip=203.0.113.10— 页面加载时自动打开该 IP 的调查弹窗(从其他页面或告警跳转过来时使用)。?alias=…/?servers=…/?server=…— 预先应用服务器标签筛选(以逗号/空格分隔,不区分大小写 匹配)。仅对本次访问生效,不做保存。
/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 秒。
访问权限
- 本页面属于基础设施角色域(最低
user_level1)— 它是 只读 的,因此任何已登录用户(demo=1)都可以查看。 - 页面、
/live与/ip-detail都位于infr.auth(登录)之下,没有额外的等级门槛。 - 这里不存在写入操作。 弹窗中的 封禁 IP 只是通往 封禁列表 页面的深链;真正的封禁(一次
blacklist_info写入)在那里执行,需要user_level≥ 2 并记录审计日志。
疑难排查与常见问题
卡片是空的,只显示「该窗口内没有对端」。
这说明最新快照在受监控端口上没有任何连接。(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 个受监控端口会作为列显示。
相关内容
- 端口连接 — 端口 → 服务器的 PORT OVERVIEW(状态条、SRC 圆圈)
- 流量(网络 I/O) — 各服务器的进/出字节数与数据包吞吐量
- 封禁列表与信誉 — 弹窗「封禁 IP」深链的落点(写入 + 审计)
- IP 信誉 — 控制台内的 AbuseIPDB 可信度仪表盘弹窗
- 运维策略 — 配置受监控端口(
infra_monitored_ports) - 告警 — 阈值突破时向负责人发送短信/邮件
