使用 VPC 流日志
VPC 流日志记录虚拟机实例(包括用作 GKE 节点的实例)发送和接收的网络流样本。这些日志可用于网络监控、取证、实时安全分析和费用优化。
本页面假定您熟悉 VPC 流日志中介绍的概念。
启用 VPC 流日志
启用 VPC 流日志时,可以为子网中的所有虚拟机启用日志记录。但是,您可以减少写入日志记录的信息量。如需详细了解您可以控制的参数,请参阅日志采样和汇总。
如需自定义元数据字段或配置日志过滤,请使用 gcloud CLI 或 API。
创建子网时启用 VPC 流日志
控制台
gcloud
-
在 Google Cloud 控制台中,激活 Cloud Shell。
Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。
运行以下命令:
gcloud compute networks subnets create SUBNET_NAME \ --enable-flow-logs \ [--logging-aggregation-interval=AGGREGATION_INTERVAL] \ [--logging-flow-sampling=SAMPLE_RATE] \ [--logging-filter-expr=FILTER_EXPRESSION] \ [--logging-metadata=LOGGING_METADATA] \ [--logging-metadata-fields=METADATA_FIELDS] \ [other flags as needed]
替换以下内容:
AGGREGATION_INTERVAL
:该子网中流日志的汇总时间间隔。该时间间隔可以设置为以下任何值:5 秒(默认)、30 秒、1 分钟、5 分钟、10 分钟或 15 分钟。SAMPLE_RATE
:流采样率。流采样的范围可以设置为从0.0
(不采样)到1.0
(所有日志)。默认值为0.5
。FILTER_EXPRESSION
:用于定义要保留的日志的表达式。表达式的长度上限为 2,048 个字符。如需了解详情,请参阅日志过滤。LOGGING_METADATA
:您希望包括在日志中的元数据注释:include-all
:包括所有元数据注释exclude-all
:排除所有元数据注释(默认)custom
:包括您在METADATA_FIELDS
中指定的元数据字段的自定义列表。
METADATA_FIELDS
:您希望包括在日志中的元数据字段的逗号分隔列表。例如src_instance,dst_instance
。只有当LOGGING_METADATA
设置为custom
时才能设置此项。
API
在创建新子网时启用 VPC 流日志。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks { "logConfig": { "aggregationInterval": "AGGREGATION_INTERVAL", "flowSampling": SAMPLING_RATE, "filterExpr": EXPRESSION, "metadata": METADATA_SETTING, "metadataFields": METADATA_FIELDS, "enable": true }, "ipCidrRange": "IP_RANGE", "network": "NETWORK_URL", "name": "SUBNET_NAME" }
请将占位符替换为有效值:
PROJECT_ID
是将在其中创建子网的项目的 ID。REGION
是将在其中创建子网的地区。AGGREGATION_INTERVAL
设置该子网中流日志的汇总时间间隔。此时间间隔可以设置为以下任何值:INTERVAL_5_SEC
、INTERVAL_30_SEC
、INTERVAL_1_MIN
、INTERVAL_5_MIN
、INTERVAL_10_MIN
或INTERVAL_15_MIN
。SAMPLING_RATE
是流采样率。流采样的范围可以设置为从0.0
(不采样)到1.0
(所有日志)。默认值为.0.5
。EXPRESSION
是用于过滤实际写入的日志的过滤表达式。 表达式的长度上限为 2,048 个字符。如需了解详情,请参阅日志过滤。METADATA_SETTING
指定是否记录所有元数据 (INCLUDE_ALL_METADATA
)、不记录任何元数据 (EXCLUDE_ALL_METADATA
),或者仅记录特定元数据 (CUSTOM_METADATA
)。如果此字段设置为CUSTOM_METADATA
,还需要填充metadataFields
字段。 默认值为EXCLUDE_ALL_METADATA
。如需了解详情,请参阅元数据注释。METADATA_FIELDS
是您设置metadata: CUSTOM_METADATA
后希望捕获的元数据字段。这是一个以英文逗号分隔的元数据字段列表,例如src_instance, src_vpc.project_id
。IP_RANGE
是子网的主要内部 IP 地址范围。NETWORK_URL
是将在其中创建子网的 VPC 网络的网址。SUBNET_NAME
是子网的名称。
如需了解详情,请参阅 subnetworks.insert
方法。
Terraform
您可以使用 Terraform 模块创建自定义模式 VPC 网络和子网。
以下示例会创建三个子网,如下所示:
subnet-01
停用了 VPC 流日志。创建子网时,VPC 流日志会被停用,除非您明确启用。subnet-02
启用了 VPC 流日志,并进行了默认流日志设置。subnet-03
启用了 VPC 流日志,并进行了一些自定义设置。
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
为现有子网启用 VPC 流日志
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击要更新的子网。
点击修改。
在流日志部分,选择开启。
如果要调整日志采样和汇总,请点击配置日志并调整以下任意项:
- 汇总时间间隔。
- 是否在最后的日志条目中包含元数据。默认情况下,包括元数据将包括所有字段。
- 采样率。
100%
表示保留所有条目。
点击保存。
gcloud
-
在 Google Cloud 控制台中,激活 Cloud Shell。
Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。
运行以下命令:
gcloud compute networks subnets update SUBNET_NAME \ --enable-flow-logs \ [--logging-aggregation-interval=AGGREGATION_INTERVAL] \ [--logging-flow-sampling=SAMPLE_RATE] \ [--logging-filter-expr=FILTER_EXPRESSION] \ [--logging-metadata=LOGGING_METADATA] \ [--logging-metadata-fields=METADATA_FIELDS] \ [other flags as needed]
替换以下内容:
AGGREGATION_INTERVAL
:该子网中流日志的汇总时间间隔。该时间间隔可以设置为以下任何值:5 秒(默认)、30 秒、1 分钟、5 分钟、10 分钟或 15 分钟。SAMPLE_RATE
:流采样率。流采样的范围可以设置为从0.0
(不采样)到1.0
(所有日志)。默认值为0.5
。FILTER_EXPRESSION
是定义要保留的日志的表达式。表达式的长度上限为 2,048 个字符。如需了解详情,请参阅日志过滤。LOGGING_METADATA
:您希望包括在日志中的元数据注释:include-all
:包括所有元数据注释exclude-all
:排除所有元数据注释(默认)custom
:包括您在METADATA_FIELDS
中指定的元数据字段的自定义列表。
METADATA_FIELDS
:您希望包括在日志中的元数据字段的逗号分隔列表。例如src_instance,dst_instance
。只有当LOGGING_METADATA
设置为custom
时才能设置此项。
API
为现有子网启用 VPC 流日志。
PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME { "logConfig": { "enable": true ...other logging fields. }, "fingerprint": "SUBNETWORK_FINGERPRINT" }
请将占位符替换为有效值:
PROJECT_ID
是子网所在项目的 ID。REGION
是子网所在的地区。SUBNET_NAME
是现有子网的名称。SUBNET_FINGERPRINT
是现有子网的指纹 ID,由您在描述子网时提供。- 如需了解其他日志记录字段,请参阅在创建子网时启用 VPC 流日志记录。
如需了解详情,请参阅 subnetworks.patch
方法。
查看现有子网的估算日志量
Google Cloud 控制台会为现有子网提供日志量估算,然后您可以使用该估算值来估算启用流日志的费用。估算值基于过去 7 天内按照 5 秒的时间间隔为子网捕获的流。此外,每个日志的大小都取决于您是否启用了元数据注释。
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击要为其估算费用的子网。
点击修改。
在流日志部分,选择开启。
点击配置日志。
查看估算的每日生成日志量,以了解估算值。
点击取消以免保存任何更改。
查看哪些子网启用了 VPC 流日志
您可以检查网络中的哪些子网启用了 VPC 流日志。
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
查看流日志列,了解日志记录功能是处于开启还是关闭状态。
gcloud
-
在 Google Cloud 控制台中,激活 Cloud Shell。
Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。
运行以下命令:
gcloud compute networks subnets list \ --project PROJECT_ID \ --network="NETWORK" \ --format="csv(name,region,logConfig.enable)"
替换以下内容:
PROJECT_ID
:您正在查询的项目的 ID。NETWORK
:子网所在网络的名称。
更新 VPC 流日志参数
您可以修改日志采样参数。如需详细了解您可以控制的参数,请参阅日志采样和汇总。
如需自定义元数据字段或配置日志过滤,请使用 gcloud CLI 或 API。
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击要更新的子网。
点击修改。
如果要调整日志采样和汇总,请点击配置日志并调整以下任意项:
- 汇总时间间隔。
- 是否在最后的日志条目中包含元数据。默认情况下,包括元数据将包括所有字段。
- 采样率。
100%
表示保留所有条目。
点击保存。
gcloud
-
在 Google Cloud 控制台中,激活 Cloud Shell。
Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。
运行以下命令:
gcloud compute networks subnets update SUBNET_NAME \ [--logging-aggregation-interval=AGGREGATION_INTERVAL] \ [--logging-flow-sampling=SAMPLE_RATE] \ [--logging-filter-expr=FILTER_EXPRESSION] \ [--logging-metadata=LOGGING_METADATA] \ [--logging-metadata-fields=METADATA_FIELDS] \
替换以下内容:
AGGREGATION_INTERVAL
:该子网中流日志的汇总时间间隔。该时间间隔可以设置为以下任何值:5 秒(默认)、30 秒、1 分钟、5 分钟、10 分钟或 15 分钟。SAMPLE_RATE
:流采样率。流采样的范围可以设置为从0.0
(不采样)到1.0
(所有日志)。默认值为0.5
。FILTER_EXPRESSION
是定义要保留的日志的表达式。 表达式的长度上限为 2,048 个字符。如需了解详情,请参阅日志过滤。LOGGING_METADATA
:您希望包括在日志中的元数据注释:include-all
:包括所有元数据注释exclude-all
:排除所有元数据注释(默认)custom
:包括您在METADATA_FIELDS
中指定的元数据字段的自定义列表。
METADATA_FIELDS
:您希望包括在日志中的元数据字段的逗号分隔列表。例如src_instance,dst_instance
。只有当LOGGING_METADATA
设置为custom
时才能设置此项。
API
修改各日志采样字段,以更新 VPC 流日志行为。
PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME { "logConfig": { ...fields to modify }, "fingerprint": "SUBNETWORK_FINGERPRINT" }
请将占位符替换为有效值:
PROJECT_ID
是子网所在项目的 ID。REGION
是子网所在的地区。SUBNET_NAME
是现有子网的名称。SUBNET_FINGERPRINT
是现有子网的指纹 ID,由您在描述子网时提供。- 如需了解您可以修改的字段,请参阅在创建子网时启用 VPC 流日志记录。
如需了解详情,请参阅 subnetworks.patch
方法。
为子网停用 VPC 流日志
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击要更新的子网。
点击修改。
在流日志部分,选择关闭。
点击保存。
gcloud
-
在 Google Cloud 控制台中,激活 Cloud Shell。
Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。
运行以下命令:
gcloud compute networks subnets update SUBNET_NAME \ --no-enable-flow-logs
API
在子网上停用 VPC 流日志即可停止收集日志记录。
PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME { "logConfig": { "enable": false }, "fingerprint": "SUBNETWORK_FINGERPRINT" }
请将占位符替换为有效值:
PROJECT_ID
是子网所在项目的 ID。REGION
是子网所在的地区。SUBNET_NAME
是现有子网的名称。SUBNET_FINGERPRINT
是现有子网的指纹 ID,由您在描述子网时提供。
如需了解详情,请参阅 subnetworks.patch
方法。
使用 Logging 访问日志
您可以使用 Logs Explorer 查看 VPC 流日志。要使用以下查询,您需要您的项目的 ID。
配置 IAM
如需配置日志记录的访问权限控制,请参阅 Logging 访问权限控制指南。
访问所有流日志
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
点击资源。
在选择资源列表中,点击子网,然后点击应用。
点击日志名称。
在选择日志名称列表中,点击 vpc_flows,然后点击应用。
或者,您也可以使用:
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
如果您在“查询”窗格中没有看到查询编辑器字段,请点击显示查询切换开关。
将以下内容粘贴到查询编辑器字段中。将
PROJECT_ID
替换为您的项目 ID。resource.type="gce_subnetwork" logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows"
点击运行查询。
访问特定子网的日志
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
点击资源。
在选择资源列表中,点击子网。
在子网 ID 列表中,选择子网,然后点击应用。
在选择日志名称列表中,点击 vpc_flows,然后点击应用。
或者,您也可以使用:
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
如果您在“查询”窗格中没有看到查询编辑器字段,请点击显示查询切换开关。
将以下内容粘贴到查询编辑器字段中。将
PROJECT_ID
替换为您的项目 ID,将SUBNET_NAME
替换为您的子网。resource.type="gce_subnetwork" logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows" resource.labels.subnetwork_name="SUBNET_NAME"
点击运行查询。
访问特定虚拟机的日志
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
如果您在“查询”窗格中没有看到查询编辑器字段,请点击显示查询切换开关。
将以下内容粘贴到查询编辑器字段中。将
PROJECT_ID
替换为您的项目 ID,将VM_NAME
替换为您的虚拟机名称。resource.type="gce_subnetwork" logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows" jsonPayload.src_instance.vm_name="VM_NAME"
点击运行查询。
访问发往特定子网范围的流量的日志
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
如果您在“查询”窗格中没有看到查询编辑器字段,请点击显示查询切换开关。
将以下内容粘贴到查询编辑器字段中。将
PROJECT_ID
替换为您的项目 ID,将SUBNET_RANGE
替换为 CIDR 范围,例如192.168.1.0/24
。resource.type="gce_subnetwork" logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows" ip_in_net(jsonPayload.connection.dest_ip, SUBNET_RANGE)
点击运行查询。
访问特定 GKE 集群的日志
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
如果您在“查询”窗格中没有看到查询编辑器字段,请点击显示查询切换开关。
将以下内容粘贴到查询编辑器字段中。将
PROJECT_ID
替换为您的项目 ID,将SUBNET_NAME
替换为您的子网名称。resource.type="k8s_cluster" logName="projects/PROJECT_ID/logs/vpc_flows" resource.labels.cluster_name="CLUSTER_NAME"
点击运行查询。
仅访问子网出站流量的日志
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
如果您在“查询”窗格中没有看到查询编辑器字段,请点击显示查询切换开关。
将以下内容粘贴到查询编辑器字段中。将
PROJECT_ID
替换为您的项目 ID,并将SUBNET_NAME
替换为要查看其出站流量的子网的名称。logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows" AND jsonPayload.reporter="SRC" AND jsonPayload.src_vpc.subnetwork_name="SUBNET_NAME" AND (jsonPayload.dest_vpc.subnetwork_name!="SUBNET_NAME" OR NOT jsonPayload.dest_vpc.subnetwork_name:*)
点击运行查询。
访问来自 VPC 网络的所有出站流量的日志
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
如果您在“查询”窗格中没有看到查询编辑器字段,请点击显示查询切换开关。
将以下内容粘贴到查询编辑器字段中。将
PROJECT_ID
替换为您的项目 ID,将VPC_NAME
替换为您的 VPC 网络名称。logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows" AND jsonPayload.reporter="SRC" AND jsonPayload.src_vpc.vpc_name="VPC_NAME" AND (jsonPayload.dest_vpc.vpc_name!="VPC_NAME" OR NOT jsonPayload.dest_vpc:*)
点击运行查询。
访问特定端口和协议的日志
针对单个目标端口
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
如果您在“查询”窗格中没有看到查询编辑器字段,请点击显示查询切换开关。
将以下内容粘贴到查询编辑器字段中。将
PROJECT_ID
替换为您的项目 ID,将PORT
替换为目标端口,并将PROTOCOL
替换为协议。resource.type="gce_subnetwork" logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows" jsonPayload.connection.dest_port=PORT jsonPayload.connection.protocol=PROTOCOL
点击运行查询。
针对多个目标端口
控制台
在 Google Cloud 控制台中,转到日志浏览器页面。
如果您在“查询”窗格中没有看到查询编辑器字段,请点击显示查询切换开关。
将以下内容粘贴到查询编辑器字段中。将
PROJECT_ID
替换为您的项目 ID,将PORT1
和PORT2
替换为目标端口,并将PROTOCOL
替换为协议。resource.type="gce_subnetwork" logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows" jsonPayload.connection.dest_port=(PORT1 OR PORT2) jsonPayload.connection.protocol=PROTOCOL
点击运行查询。
将日志路由到 BigQuery、Pub/Sub 和自定义目标
您可以参照 Logging 文档中的路由和存储概览部分,将 Logging 中的流日志路由到您选择的目的地。请参阅上一节中的示例过滤条件。
问题排查
Logging 中的 gce_subnetwork
资源不显示任何 vpc_flows
- 确认给定子网已启用日志记录。
- 只有 VPC 网络支持 VPC 流。 如果您使用的是旧式网络,则不会看到任何日志。
- 在共享 VPC 网络中,日志只会出现在宿主项目中,不会出现在服务项目中。务必在宿主项目中查找日志。
- Logging 排除过滤条件会屏蔽指定的日志。确保没有会舍弃 VPC 流日志的排除规则。
- 转到资源使用情况。
- 点击排除项标签页。
- 确保没有可能会舍弃 VPC 流日志的排除规则。
某些日志中没有 RTT 或字节值
- 如果没有获取足够的数据包作为样本来捕获 RTT,RTT 测量结果可能会缺失。在低容量连接中发生这种情况的几率更高。
- RTT 值仅适用于 TCP 流。
- 发送的某些数据包没有负载。如果抽样的是仅有标头的数据包,则字节值为 0。
某些流缺失
- 入站数据包依照入站 VPC 防火墙规则进行采样。确保没有任何入站防火墙规则拒绝您希望记录的数据包。如果您不确定 VPC 防火墙规则是否会阻止入站数据包,则可以启用防火墙规则日志记录并检查日志。
- 仅支持 TCP、UDP、ICMP、ESP 和 GRE 协议。VPC 流日志不支持任何其他协议。
- 对日志进行采样。某些数据包流的容量极小,可能会丢失。
某些日志中缺少 GKE 注释
确保您的 GKE 集群是受支持的版本。
某些 GKE 流缺少日志
确保已在集群中启用了节点内可见性。否则,系统不会记录同一节点上两个 pod 之间的流。
即使您启用了流日志,看似仍处于停用状态
当您为内部应用负载均衡器配置代理专用子网并且使用
gcloud compute networks subnets
命令启用 VPC 流日志时,该命令看似执行成功,但流日志实际上并未启用。如果您还添加了--purpose=INTERNAL_HTTPS_LOAD_BALANCER
标志,则--enable-flow-logs
标志不会生效。使用 Google Cloud 控制台或 API 启用流日志时,您会看到错误消息:“字段 'resource.enableFlowLogs':'true' 的值无效。具有 INTERNAL_HTTPS_LOAD_BALANCER 用途的子网中设置的字段无效”。
由于代理专用子网没有虚拟机,因此 VPC 流日志不受支持。这是预期行为。
后续步骤
- 查看 Logging 文档
- 查看 Logging 接收器文档