概述 —— 这个画面做什么
端口连接 是 基础设施 ▸ 连通性与流量 的旗舰画面,即 PORT OVERVIEW。它为运维策略中定义的每个 受监控端口(例如 80、443、22、3306 …)渲染一张卡片,并在卡片内把绑定到该端口的 TCP 会话 按服务器 拆解为按状态的 100% 堆叠条。目标是在一个视图里看清「此刻谁连到了这个端口、有多少条、处于什么状态」。
数据来源是旧版流量数据库(legacy_glory 连接)的 traffic_session_ct 表,由 check_ct.js 采集器定期写入。这里应用是 只读 的 —— 本画面不写入任何数据。
每个服务器磁贴显示:
- TCP 状态 100% 堆叠条 —— ESTABLISHED / LISTEN / SYN SENT / SYN RECV / FIN WAIT / CLOSE WAIT / TIME WAIT 的占比(其余一律归入
other)。ESTABLISHED 始终排在最前,其余按会话数降序排列。 - SRC 圆圈 —— 绑定到该服务器·端口的 不同来源 IP(
remote_ip)的数量。点击可打开来源 IP 列表弹窗。 - 前 3 个来源 IP —— 会话数最多的三个远端 IP,并附带数量。
何时使用
- 发现连接激增/异常状态:某个端口上 SYN_RECV(半开)或 TIME_WAIT 激增,往往提示 SYN 洪水、连接风暴或应用的连接泄漏。
- 看清负载压在哪台服务器上:即便是同一个端口,各服务器的会话分布也不同 —— 由此可以暴露负载均衡器的倾斜或过载的节点。
- 追踪可疑来源:点击某个主要来源 IP 或 SRC 圆圈,可下钻查看它命中了哪些服务器·端口、命中量有多大,以及地理位置/ASN 与历史,随后可转入信誉查询或封禁。
- 深链接入口:从其他画面(例如 服务 ▸ Web)带着
?src_ip=…&port=…进入时,会自动筛选到该端口并打开 IP 调查弹窗。
布局
顶部控件
| 元素 | 行为 |
|---|---|
| 计时器 1 分钟 / 5 分钟 / 1 小时 | 会话聚合窗口的宽度。所选项会保存到 localStorage(infr:timer:traffic-ports),跨次访问保持不变。 |
| 端口标签 | 受监控端口列表(运维策略)。点击标签可切换对应卡片的显示与隐藏。All 用于切换全选/全不选。筛选仅在本次会话内有效(不会保存)—— 每次新访问的默认状态始终是全部端口。 |
| 快照时间 | 锚定当前窗口的最新快照时间戳(已按显示时区校正)。 |
| 刷新/轮询 | 每 30 秒自动轮询 /infra/traffic/ports/live 以刷新卡片。 |
端口卡片(瀑布流)
卡片 可拖拽排序,顺序保存在 localStorage(infr:order:traffic-ports)。由于卡片高度不一,采用 行跨度瀑布流(sortable_masonry mixin)无缝排布。卡片内部,服务器磁贴按 不同来源 IP 数 → 会话总数 → 服务器索引 排序。
TCP 状态图例
堆叠条的颜色来自语义化 CSS 令牌(var(--infr-state-*))。图例把颜色对应到状态。
| 令牌 | 标签 | 含义 |
|---|---|---|
established |
ESTABLISHED | 正常建立的连接 |
listen |
LISTEN | 监听中(服务端套接字) |
syn_sent |
SYN SENT | 发起连接尝试(客户端) |
syn_recv |
SYN RECV | 已收到 SYN/半开 —— 激增提示 SYN 洪水 |
fin_wait |
FIN WAIT | 正在关闭(合并 FIN_WAIT1/2) |
close_wait |
CLOSE WAIT | 对端已关闭而应用未关闭 —— 持续堆积意味着连接泄漏 |
time_wait |
TIME WAIT | 关闭后的等待 |
other |
Other | 上述七种之外的任何状态 |
使用方法
- 选择计时器 —— 想看最紧凑、最近的一批快照就用
1min;想看更平滑的趋势就用5min/1hour。 - 用标签收窄到你关心的端口 —— 例如只保留 80·443 以观察 Web。
- 读懂堆叠条 —— ESTABLISHED 占比偏低而 SYN_RECV/TIME_WAIT 偏大,就是异常信号。
- 点击 SRC 圆圈 —— 打开该服务器·端口的 来源 IP 列表 弹窗(远端 IP、远端端口、会话数、首次/最近出现时间)。
- 点击某个 IP → 单 IP 调查 —— 拆解它命中的服务器·端口·状态、地理位置/ASN 以及历史(5 分钟 · 按小时 · 按天汇总)。从这里可以继续进行 信誉查询 或封禁。
- 重排卡片 —— 把常看的端口拖到最上面;顺序会被保存。
按天(
1day)的历史受汇总设计所限,是按该 IP 的 /24 网段(256 个 IP) 聚合的,而不是单个 IP。当弹窗显示形如by 211.224.128.0/24的 CIDR 标签时,该数值是整个网段的合计。
数据来源
所有查询都在 legacy_glory 连接上执行,并以 参数绑定 的查询构建器调用隔离在 App\Repositories\TrafficRepository 中(不做字符串拼接)。
窗口锚定
显示窗口并非锚定在应用的 now(),而是锚定在 最新的数据快照(MAX(snapshot_ts))上。采集器的写入时钟可能比应用时钟落后数小时,因此若以 now() 为锚点,窗口就会落在数据范围之外,画面一片空白。
| 计时器 | SQL 边界(snapshot_ts) |
|---|---|
| 1min | 最新快照所在分钟的 startOfMinute … endOfMinute |
| 5min | (最新 − 4 分钟)的 startOfMinute … 最新的 endOfMinute |
| 1hour | (最新 − 59 分钟)的 startOfMinute … 最新的 endOfMinute |
snapshot_ts的 WHERE 边界使用旧库中存储的原始时间。只有 画面上显示的快照时间 才会叠加运维策略的显示偏移(traffic_tz_offset_hours)。
核心查询 —— portOverview()
SELECT a.local_port, a.server_name, a.server_index, a.remote_ip,
a.state_code, b.state_name,
SUM(a.session_count) AS total_sessions
FROM traffic_session_ct AS a
LEFT JOIN protocol_state AS b ON a.state_code = b.state_code
WHERE a.snapshot_ts BETWEEN :min AND :max
AND a.local_port IN (:ports) -- 运维策略中的受监控端口
GROUP BY a.local_port, a.server_name, a.server_index,
a.remote_ip, a.state_code, b.state_name;
traffic_session_ct⋈protocol_state把整数状态码解析成可读的状态名,供图例和堆叠条使用。- 紧凑的
snapshot_ts BETWEEN窗口加上local_port IN白名单,把这张庞大的快照表(约 60.5 万行)收窄下来。
相关表
| 表 | 连接 | 作用 | 写入方 |
|---|---|---|---|
traffic_session_ct |
legacy_glory | 会话快照(主机/远端/状态/数量) | check_ct.js |
protocol_state |
legacy_glory | TCP 状态码 → 名称的查找表 | — |
traffic_session_ct_5min/_1hour/_1day |
legacy_glory | 供 IP 调查弹窗使用的时间段历史 | aggregate.js |
ip_info_loop |
legacy_glory | IP 弹窗的地理位置/ASN/ISP 富化信息 | — |
服务端响应结构(节选)
{
"ports": [80, 443, 22],
"timer": 1,
"snapshot": "2026-08-13 10:24:00",
"ports_data": [
{ "port": 443, "server_data": [
{ "alias": "web1", "idx": 12, "host_count": 84,
"top_req": [ { "remote_ip": "203.0.113.10", "session_count": 61 } ],
"connections": [ { "state": "established", "count": 420, "pct": 78 } ],
"total": 538 }
] }
]
}
portsData() 会缓存 20 秒(以计时器加端口列表的哈希为键),以减少远程往返。
访问权限
基础设施角色区域最低需要 user_level 1(查看者)即可浏览。端口连接是 只读 的,因此没有单独的写入门槛 —— 演示(1)、员工(5)和管理员(10)都可以查看。该路由只要求 infr.auth 会话认证。
| 操作 | 所需级别 |
|---|---|
| 查看端口连接、轮询、打开 IP 调查弹窗 | 1(任何已认证用户) |
| 编辑受监控端口列表(运维策略) | 10(管理) —— 运维策略 |
由 IP 调查弹窗延伸出的 封禁 操作会交接给 安全 ▸ 封禁列表,那里需要写入级别
user_level2 及以上并记录审计日志。本画面自身不执行任何封禁。
故障排查与常见问题
卡片出现了,但服务器数据是空的。
该窗口内没有会话绑定到这个端口。把计时器放宽到 5min/1hour,或确认该端口确实开放且有流量。
所有卡片都是空的,并显示「暂无连接快照」。
legacy_glory 上的 traffic_session_ct 没有近期快照(check_ct.js 采集器已停止,或数据库连接失败)。如果连最新快照时间都没有显示,请检查采集器。
我想看的端口没有出现。
如果它不在受监控端口列表(infra_monitored_ports)里,就不会创建卡片。请在 管理 ▸ 运维策略 中以 CSV 形式添加(1–65535,最多 30 个,保留输入顺序)。默认值:
infra_monitored_ports = 80,443,22,3306,25,465,27017,21,53,3030,8080,6379,6001
快照时间差了好几个小时。
当旧库的存储时钟与你的显示时区不一致时,请在运维策略中设置 traffic_tz_offset_hours(±14 小时)来校正显示时间。它只作用于显示,绝不会作用于查询边界。
按天的历史是空的。
_1day 汇总可能滞后一天,并且按 /24 网段聚合。请改为查看 5 分钟或按小时的粒度。
相关内容
- IP 连接(主机视图) —— 每台服务器的远端对端 IP × 端口强度
- 流量(网络 I/O) —— server_traffic 的进出字节·数据包时间序列
- 运维策略 —— 受监控端口列表与时区偏移设置
- IP 信誉 —— 从调查弹窗发起的 AbuseIPDB 信誉查询
- 防火墙(攻击面) —— 物理开放端口的暴露监控
- 封禁列表与信誉 —— 由调查弹窗延伸出的 IP 封禁
