本页介绍了如何在 Migration Center 中生成和分析网络依赖关系报告。
概览
网络依赖项报告提供有关服务器和数据库连接的每月汇总数据。 借助网络依赖关系报告,您可以查看基础架构中资产的所有连接,以及 Migration Center 观察到这些连接的次数(按月汇总)。
如需收集网络依赖关系数据,请让资产识别客户端运行一段时间,并启用与 Migration Center 的数据同步功能。 收集时间越长,Migration Center 就有更多数据来分析网络依赖关系方面的数据洞见。然后,Migration Center 会识别扫描的资产中的所有网络连接。连接中的目标资产可以是您使用资产识别客户端发现的 Migration Center 目录中的资产、您手动导入的资产,甚至是您环境外部的未知资产。
网络依赖项报告在以下场景中非常有用:
- 收集有关服务器和数据库连接的数据,以识别属于同一应用的资产
- 识别一组资产(例如使用 MySQL 标准端口的所有服务器)中的相关网络连接
- 识别商品目录中缺少的素材资源
您可以从 Migration Center 以 CSV 文件的格式下载网络依赖关系报告。然后,您可以使用 BigQuery 和迁移中心提供的示例查询执行分析,也可以使用任何其他第三方工具。
限制
- 如需在基础架构中收集连接数据,您必须使用发现客户端。
- 网络连接数据仅通过操作系统扫描方法收集。 vSphere 扫描不支持网络数据收集。
准备工作
在创建网络依赖关系报告之前,您必须让性能收集功能与发现客户端协同工作。
在通过 BigQuery 分析网络依赖关系报告之前,请执行以下操作:
- 了解如何将本地数据导入到 BigQuery。
- 了解如何运行查询。
生成网络依赖项报告
如需生成网络依赖项报告,请按以下步骤操作:
在 Google Cloud 控制台中,前往创建报告页面。
点击网络依赖项导出。
从群组列表中,选择要为其生成报告的群组,然后点击导出。
在随即显示的对话框中,点击导出。
生成导出的报告可能需要一个小时。报告生成后,系统会打开网络依赖项页面。
如需下载特定报告,请点击
下载。
在 BigQuery 中分析网络依赖项报告
以下部分提供了一些示例查询,可用于在 BigQuery 中分析常见场景。在运行查询之前,您必须将 CSV 文件上传到 BigQuery。
使用 BigQuery 时,您需要根据 BigQuery 价格付费。
确定连接数最多的资产
以下查询有助于确定群组中连接数最多的资产。
SELECT
LocalVMName, SUM(ConnectionCount) as TotalCount
FROM
PROJECT.DATASET.TABLE
GROUP BY ALL
ORDER BY TotalCount DESC
替换以下内容:
PROJECT
:您上传 CSV 文件的 Google Cloud 项目。DATASET
:BigQuery 数据集。TABLE
:BigQuery 表。
以下是此查询的输出示例:
LocalVMName | TotalCount |
---|---|
VM-x5ua3o2w | 9970 |
VM-glg5np3w | 9763 |
VM-q3z4zfp8 | 9557 |
VM-2nnsrt37 | 9372 |
VM-1oah56hn | 9350 |
按图的深度识别连接
以下查询可用于识别通过特定数量的中间连接连接到给定资产的所有资产。例如:
- 如果图深度为 1,则表示您要查找与主要资产直接关联的所有资产。
- 如果图深度为 2,则会找到直接连接到其他资产的所有资产,而这些资产又直接连接到主要资产。
DECLARE
local_vm_name STRING DEFAULT MAIN_ASSET;
DECLARE
depth INT64 DEFAULT DEPTH;
CREATE TEMP FUNCTION
recursiveConnections(localVmName STRING,
connectionsArray ARRAY<STRING>,
depth INT64)
RETURNS STRING
LANGUAGE js AS r"""
const connections = connectionsArray.map(connection => connection.split('|||'))
.filter(connectionTuple => connectionTuple[1] !== 'Unscanned Device');
const connectedAssets = new Set([localVmName]);
for (let i = 0; i < depth; i++) {
const currentSet = new Set(connectedAssets);
for (const connection of connections) {
/* Look for connections where the asset is the local asset */
if (currentSet.has(connection[0])) {
connectedAssets.add(connection[1]);
}
/* Look for connections where the asset is the remote asset */
if (currentSet.has(connection[1])) {
connectedAssets.add(connection[0]);
}
}
}
connectedAssets.delete(localVmName);
return Array.from(connectedAssets).sort().join(', ');
""";
SELECT
local_vm_name AS LocalVMName,
recursiveConnections(local_vm_name,
ARRAY_AGG(CONCAT(LocalVMName, '|||', RemoteVMName)),
depth) AS Connections
FROM
PROJECT.DATASET.TABLE
替换以下内容:
MAIN_ASSET
:您要确定连接的资产的名称。DEPTH
:图的深度。
以下是此查询的输出示例:
LocalVMName | 连接 |
---|---|
VM-lv8s148f | VM-2z8wp3ey、 VM-66rq2x2y、 VM-94uwyy8h、 VM-ccgmqqmb、 VM-ctqddf0u、 VM-og4n77lb、 ... |
按 IP 和端口范围过滤连接
通过以下查询,您可以识别使用您定义的范围内的 IP 地址和端口的资产。
CREATE TEMP FUNCTION
ipBetween(value STRING,
low STRING,
high STRING) AS ( NET.IPV4_TO_INT64(NET.IP_FROM_STRING(value)) BETWEEN NET.IPV4_TO_INT64(NET.IP_FROM_STRING(low))
AND NET.IPV4_TO_INT64(NET.IP_FROM_STRING(high)) );
SELECT
*
FROM
PROJECT.DATASET.TABLE
WHERE
((LocalPort BETWEEN PORT_START
AND PORT_END)
OR (RemotePort BETWEEN PORT_START
AND PORT_END))
AND (ipBetween(LocalIP,
IP_START,
IP_END)
OR ipBetween(RemoteIP,
IP_START,
IP_END))
替换以下内容:
PORT_START
:端口范围的初始端口,例如0
。PORT_END
:端口范围的最后一个端口,例如1024
。IP_START
:范围的初始 IP 地址,例如"10.26.0.0"
。IP_END
:范围的最终 IP 地址,例如"10.26.255.255"
。
以下是此查询的输出示例:
SampleRange | LocalVMName | LocalAssetID | LocalGroups | LocalIP | LocalPort | 协议 | LocalProcessName | RemoteVMName | RemoteAssetID | RemoteGroups | RemoteIP | RemotePort | ConnectionCount |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2025-06-02T05:59:53Z-2025-06-02T05:59:53Z | VM-0lf60off | projects/982941055174/locations/us-central1/assets/0lf60off | 群组 1 | 10.0.45.138 | 272 | tcp | bash | VM-0spdofr9 | projects/982941055174/locations/us-central1/assets/0spdofr9 | 144.35.88.1 | 272 | 499 | |
2025-07-02T05:59:53Z-2025-07-02T05:59:53Z | VM-goa5uxhi | projects/982941055174/locations/us-central1/assets/goa5uxhi | 群组 3 | 10.187.175.82 | 781 | tcp | bash | VM-27i5d2uj | projects/982941055174/locations/us-central1/assets/27i5d2uj | 22.99.72.109 | 781 | 980 | |
2025-08-02T05:59:53Z-2025-08-02T05:59:53Z | VM-7vwy31hg | projects/982941055174/locations/us-central1/assets/7vwy31hg | 群组 1 | 10.58.166.132 | 21 | tcp | bash | VM-2gq0fl37 | projects/982941055174/locations/us-central1/assets/2gq0fl37 | 147.19.84.135 | 21 | 514 |
识别网络中未扫描的资产
通过以下查询,您可以识别网络中所有未扫描的资产。 未扫描的资产是指与 Migration Center 清单中的任何资产都没有关联的远程 IP 地址连接。这样一来,您就可以确定可能缺少哪些需要扫描的资产,以便进行评估。
CREATE TEMP FUNCTION
ipBetween(value STRING,
low STRING,
high STRING) AS ( NET.IPV4_TO_INT64(NET.IP_FROM_STRING(value)) BETWEEN NET.IPV4_TO_INT64(NET.IP_FROM_STRING(low))
AND NET.IPV4_TO_INT64(NET.IP_FROM_STRING(high)) );
SELECT
STRING_AGG(LocalIP, ', ') AS LocalIPs,
RemoteIP
FROM
PROJECT.DATASET.TABLE
WHERE
RemoteVMName = 'Unscanned Device'
AND ipBetween(LocalIP,
IP_START,
IP_END)
AND ipBetween(RemoteIP,
IP_START,
IP_END)
GROUP BY
RemoteIP
替换以下内容:
IP_START
:范围的初始 IP 地址,例如"10.26.0.0"
。IP_END
:范围的最终 IP 地址,例如"10.26.255.255"
。