关于 VPC 流日志记录

本页面介绍了 VPC 流日志记录格式,包括可用的基本字段和元数据字段,还介绍了如何使用日志过滤,以便仅生成符合特定条件的日志。

记录格式

日志记录包含基本字段(即每个日志记录的核心字段)以及添加额外信息的元数据字段。可以省略元数据字段,以节省存储费用。

某些日志字段采用多字段格式,在给定字段中包含多段数据。例如,connection 字段采用 IpConnection 格式,它在单个字段中包含来源 IP 地址和目的地 IP 地址、端口以及协议。记录格式表下方介绍了这些采用多字段格式的字段。

元数据字段的值并非基于数据层面路径;这些值属于近似值,可能缺失或不正确。与元数据字段不同,基本字段的值直接取自数据包标头。

字段 字段格式 字段类型:基本或可选元数据
连接 IpConnection
描述流的 5 元组。
基本
reporter 字符串
报告流的一方。可以是 SRCDESTSRC_GATEWAYDEST_GATEWAY
基本
rtt_msec int64
在时间间隔内测量的延迟时间。此字段仅适用于从虚拟机报告的 TCP 流量。测量延迟是发送 SEQ 和接收相应的 ACK 之间所经历的时间。延迟结果是网络 RTT 与应用所耗用的时间之和。
基本
bytes_sent int64
从来源发送到目的地的字节数。
基本
packets_sent int64
从来源发送到目的地的数据包数量。
基本
start_time 字符串
在汇总时间间隔内观察到的第一个数据包的时间戳(RFC 3339 日期字符串格式)
基本
end_time 字符串
在汇总时间间隔内观察到的最后一个数据包的时间戳(RFC 3339 日期字符串格式)。
基本
来源和目标元数据字段
src_gateway GatewayDetails
如果流的来源是通过网关(例如 Cloud Interconnect 的 VLAN 连接或 Cloud VPN 隧道)连接到 Google Cloud 的本地端点或其他云端点,并且满足以下任一条件,则此字段会填充网关详情:
  • 来源网关是流的报告者。
  • 流的目的地是报告程序,并且来源网关所连接的 VPC 网络与 VPC 流日志报告流目的地日志所在的项目位于同一个 Google Cloud 项目中。
元数据
dest_gateway GatewayDetails
如果流的目的地是通过网关(例如 Cloud Interconnect 的 VLAN 连接或 Cloud VPN 隧道)连接到 Google Cloud 的本地端点或其他云端点,并且满足以下任一条件,则此字段会填充网关详情:
  • 目的地网关是流的报告者。
  • 流的来源是报告程序,并且目的地网关所连接的 VPC 网络与 VPC 流日志报告流来源日志所在的项目位于同一个 Google Cloud 项目中。
元数据
src_gke_details GkeDetails
如果流的来源是 Google Kubernetes Engine (GKE) 端点,则此字段会填充 GKE 端点详情。
元数据
dest_gke_details GkeDetails
如果流的目的地是 GKE 端点,则此字段会填充 GKE 端点详情。
元数据
src_google_service GoogleServiceDetails
如果流的来源是某个 Google API,则此字段会填充可用的 Google API 元数据。
元数据
dest_google_service GoogleServiceDetails
如果流的目的地是 Google API,则此字段会填充可用的 Google API 元数据。
元数据
src_instance InstanceDetails
如果流的来源是 VPC 网络中的虚拟机,并且满足以下任一条件,则此字段会填充虚拟机实例详情:
  • 来源虚拟机是流的报告程序。
  • 流的目的地是报告程序,并且来源虚拟机或来源虚拟机所连接的 VPC 网络与 VPC 流日志报告流目的地日志所在的项目位于同一个 Google Cloud 项目中。
元数据
dest_instance InstanceDetails
如果流的目的地是 VPC 网络中的虚拟机,并且满足以下任一条件,则此字段会填充虚拟机实例详情。
  • 目的地虚拟机是流的报告程序。
  • 流的来源是报告程序,并且目的地虚拟机或目的地虚拟机所连接的 VPC 网络与 VPC 流日志报告流来源日志所在的项目位于同一个 Google Cloud 项目中。
元数据
src_location GeographicDetails
如果流的来源是位于 VPC 网络之外的公共 IP 地址,则此字段会填充可用位置元数据。
元数据
dest_location GeographicDetails
如果流的目的地是 VPC 网络之外的公共 IP 地址,则此字段会填充可用位置元数据。
元数据
src_vpc VpcDetails
如果流的来源是 VPC 网络中的虚拟机,并且满足以下任一条件,则此字段会填充 VPC 网络详情:
  • 来源虚拟机是流的报告程序。
  • 流的目的地是报告程序,并且来源虚拟机或来源虚拟机所连接的 VPC 网络与 VPC 流日志报告流目的地日志所在的项目位于同一个 Google Cloud 项目中。
元数据
dest_vpc VpcDetails
如果流的目的地是位于 VPC 网络中的虚拟机,并且满足以下任一条件,则此字段会填充 VPC 网络详情:
  • 目的地虚拟机是流的报告程序。
  • 流的来源是报告程序,并且目的地虚拟机或目的地虚拟机所连接的 VPC 网络与 VPC 流日志报告流来源日志所在的项目位于同一个 Google Cloud 项目中。
元数据
其他元数据字段
internet_routing_details InternetRoutingDetails
如果流是 Google Cloud 与互联网之间的连接,则此字段会填充路由详情。仅适用于出站流。
元数据
load_balancing LoadBalancingDetails
如果流通过以下配置之一中的负载均衡器,则此字段会填充 Cloud Load Balancing 详情:
  • 流的报告程序是负载均衡器的客户端,并且负载均衡器类型为 APPLICATION_LOAD_BALANCERPROXY_NETWORK_LOAD_BALANCERPASSTHROUGH_NETWORK_LOAD_BALANCERPROTOCOL_FORWARDING
  • 流的报告程序是负载均衡器的后端,负载均衡器类型为 PASSTHROUGH_NETWORK_LOAD_BALANCERPROTOCOL_FORWARDING
元数据
network_service NetworkServiceDetails
如果设置了差分服务代码点 (DSCP) 标头,则此字段会填充网络服务详情。
元数据
psc PrivateServiceConnectDetails
如果流通过以下任一配置中的 Private Service Connect,则此字段会填充 Private Service Connect 详情:
  • Private Service Connect 流量的报告程序是使用方,并且使用针对已发布服务或全球 Google API 的 Private Service Connect 端点。
  • Private Service Connect 流量的报告者是提供方,使用内部直通式网络负载均衡器或内部协议转发。
元数据

IpConnection 字段格式

字段 类型 说明
协议 int32 IANA 协议编号
src_ip 字符串 来源 IP 地址
dest_ip 字符串 目标 IP 地址
src_port int32 来源端口
dest_port int32 目标端口

GatewayDetails 字段格式

字段 类型 说明
project_id 字符串 网关的 Google Cloud 项目 ID
位置 字符串 网关所在的区域
name 字符串 网关名称
类型 字符串 网关类型。可以是 INTERCONNECT_ATTACHMENTVPN_TUNNEL
vpc VpcDetails 网关的 VPC 网络详情

GkeDetails 字段格式

字段 类型 说明
集群 ClusterDetails GKE 集群元数据
Pod PodDetails GKE Pod 元数据,当流量的来源或目的地是 Pod 时填充
服务 ServiceDetails GKE Service 元数据,仅填充在 Service 端点中。记录最多包含两项 Service。如果有两项以上的相关 Service,则此字段包含一个带有特殊 MANY_SERVICES 标记的 Service。

ClusterDetails 字段格式

字段 类型 说明
cluster_location 字符串 集群的位置。这可以是可用区或区域,具体取决于集群是可用区级还是区域级集群。
cluster_name 字符串 GKE 集群名称。

PodDetails 字段格式

字段 类型 说明
pod_name 字符串 Pod 的名称
pod_namespace 字符串 Pod 的命名空间
pod_workload WorkloadDetails 与控制 Pod 的顶级工作负载资源相关的元数据
WorkloadDetails 字段格式
字段 类型 说明
workload_name 字符串 顶级工作负载控制器的名称
workload_type 字符串 顶级工作负载控制器的类型。可以是 DEPLOYMENTREPLICA_SETSTATEFUL_SETDAEMON_SETJOBCRON_JOBREPLICATION_CONTROLLER

ServiceDetails 字段格式

字段 类型 说明
service_name 字符串 Service 的名称。如果有两个以上的相关 Service,则该字段设置为特殊 MANY_SERVICES 标记。
service_namespace 字符串 Service 的命名空间

示例:

如果有两项 Service,则 Service 字段如下所示:

service: [
 0: {
  service_name: "my-lb-service"
  service_namespace: "default"
 }
 1: {
  service_name: "my-lb-service2"
  service_namespace: "default"
 }
]

如果有两项以上的 Service,则 Service 字段如下所示:

service: [
 0: {
  service_name: "MANY_SERVICES"
 }
]

GoogleServiceDetails 字段格式

字段 类型 说明
类型 字符串 此字段设置为 GOOGLE_API

InstanceDetails 字段格式

字段 类型 说明
project_id 字符串 包含虚拟机资源的 Google Cloud 项目的 ID
区域 字符串 虚拟机的区域
vm_name 字符串 虚拟机的实例名称
可用区 字符串 虚拟机的地区

GeographicDetails 字段格式

字段 类型 说明
asn int32 此端点所属的外部网络的 ASN。
城市 字符串 外部端点所在的城市
continent 字符串 外部端点所在的大洲
国家/地区 字符串 外部端点所在的国家/地区,采用 ISO 3166-1 Alpha-3 国家/地区代码的形式表示
区域 字符串 外部端点所在的区域

VpcDetails 字段格式

字段 类型 说明
project_id 字符串 包含 VPC 的 Google Cloud 项目的 ID。在共享 VPC 配置中,project_id 是宿主项目的 ID。
subnetwork_name 字符串 子网的名称(如果适用)
subnetwork_region 字符串 子网的区域(如果适用)
vpc_name 字符串 网络的名称

InternetRoutingDetails 字段格式

字段 类型 说明
egress_as_path AsPath 相关 AS 路径的列表。如果流有多个可用的 AS 路径,则该字段可能包含多个 AS 路径。

AsPath 字段格式

字段 类型 说明
as_details AsDetails AS 路径中所有系统的 AS 详细信息列表。该列表从 Google Cloud 网络的外部第一个 AS 开始,以远程 IP 地址所属的 AS 结束。

AsDetails 字段格式

字段 类型 说明
asn uint32 AS 的自治系统编号 (ASN)

LoadBalancingDetails 字段格式

字段 类型 说明
forwarding_rule_project_id 字符串 转发规则的 Google Cloud 项目 ID
reporter 字符串 Cloud Load Balancing 报告程序。可以是 CLIENTBACKEND
  • 如果流的报告程序是负载均衡器的客户端,则此字段会设置为 CLIENT
  • 如果流的报告程序是负载均衡器的后端,则此字段会设置为 BACKEND
类型 字符串 负载均衡器类型。可以是 APPLICATION_LOAD_BALANCERPROXY_NETWORK_LOAD_BALANCERPASSTHROUGH_NETWORK_LOAD_BALANCERPROTOCOL_FORWARDING
scheme 字符串 负载均衡器方案。可以是 EXTERNAL_MANAGEDINTERNAL_MANAGEDEXTERNALINTERNALINTERNAL_SELF_MANAGED
url_map_name 字符串 网址映射的名称。如果负载均衡器的类型为 APPLICATION_LOAD_BALANCER,则予以填充。
forwarding_rule_name 字符串 转发规则的名称
backend_service_name 字符串 后端服务的名称。如果报告程序为 BACKEND 且负载均衡器类型为 PASSTHROUGH_NETWORK_LOAD_BALANCER,则予以填充。如果后端群组类型为 TARGET_POOL,则系统不会填充此字段。
backend_group_name 字符串 后端群组的名称。如果报告程序为 BACKEND 且负载均衡器类型为 PASSTHROUGH_NETWORK_LOAD_BALANCER,则予以填充。
backend_group_type 字符串 后端群组的类型。可以是 INSTANCE_GROUPNETWORK_ENDPOINT_GROUPTARGET_POOL。如果报告程序为 BACKEND 且负载均衡器类型为 PASSTHROUGH_NETWORK_LOAD_BALANCER,则予以填充。
backend_group_location 字符串 后端组的位置。可以是可用区或区域,具体取决于后端组的范围是可用区级还是区域级。 如果报告程序为 BACKEND 且负载均衡器类型为 PASSTHROUGH_NETWORK_LOAD_BALANCER,则予以填充。如果后端群组类型为 TARGET_POOL,则系统不会填充此字段。
vpc VpcDetails 负载均衡器的 VPC 网络详情

NetworkServiceDetails 字段格式

字段 类型 说明
dscp int32 如果数据包标头中存在差分服务字段,则此字段会填充 DSCP 值。

PrivateServiceConnectDetails 字段格式

字段 类型 说明
reporter 字符串 Private Service Connect 报告程序。可以是 CONSUMERPRODUCER
psc_endpoint PrivateServiceConnectEndpointDetails 端点详情。如果报告程序为 CONSUMER,则予以填充。
psc_attachment PrivateServiceConnectAttachmentDetails 服务连接详情。如果流量流包含 Private Service Connect 提供方,则予以填充。

PrivateServiceConnectEndpointDetails 字段格式

字段 类型 说明
project_id 字符串 Private Service Connect 端点的 Google Cloud 项目 ID
区域 字符串 端点所在的区域。如果目标服务类型为 GLOBAL_GOOGLE_APIS,则不予以填充。
psc_connection_id 字符串 Private Service Connect 连接 ID
target_service_type 字符串 目标服务类型。可以是 GLOBAL_GOOGLE_APISPUBLISHED_SERVICE
vpc VpcDetails Private Service Connect 端点的 VPC 网络详情

PrivateServiceConnectAttachmentDetails 字段格式

字段 类型 说明
project_id 字符串 服务连接的 Google Cloud 项目 ID
区域 字符串 服务连接的区域
vpc VpcDetails 服务连接的 VPC 网络详情

元数据注解

日志记录包含基本字段和元数据字段。记录格式部分列出了哪些字段是元数据类型,哪些是基本类型。所有基本字段始终包含在内。您可以自定义要保留哪些元数据字段。

  • 如果您选择了所有元数据,则流日志将包含 VPC 流日志记录格式中的所有元数据字段。向记录格式添加新的元数据字段后,流日志会自动包含新字段。

  • 如果您不选择任何元数据,则所有元数据字段都将被忽略。

  • 如果选择自定义元数据,您可以通过父字段(如 src_vpc)或其全名(如 src_vpc.project_id)指定要包含的元数据字段

    将新的元数据字段添加到记录格式后,这些字段会从流日志中排除,除非它们位于您指定要包含的父字段中。

    • 如果使用父字段指定自定义元数据,则在向父字段内的记录格式添加新元数据字段后,流日志将自动包含新字段。

    • 如果使用字段的全名指定自定义元数据,则添加到父字段的新元数据字段会从流日志中排除。

如需了解如何自定义元数据字段,请参阅在创建子网时启用 VPC 流日志记录的 Google Cloud CLI 或 API 说明。

GKE 元数据注解

在 GKE 集群中具有端点的流可以使用 GKE 元数据注释进行注释,其中可以包含该端点的集群、Pod 和 Service 的详细信息。

GKE Service 注释

发送到 ClusterIP、NodePort 或 LoadBalancer 的流量可以接收 Service 注释。如果发送到 NodePort 或 LoadBalancer,则流在连接的两个跃点上接收 Service 注释。

直接发送到 Pod 的 Service 端口的流量通过目的地端点上的 Service 注释进行注释。

发送到 Pod 的 Service 端口的流量(其中 Pod 支持同一 Service 端口上的多个 Service)在目的地端点上标注了多个 Service。这仅限于两项 Service。如果超过了该数量,端点将带有一个特殊的 MANY_SERVICES 标记。

互联网流量上的 Pod 注释

默认情况下,Pod 和互联网之间的流量不会接收 Pod 注解。VPC 流日志无法添加 Pod 注解,因为对于发送到互联网的数据包,伪装代理会在 VPC 流日志查看数据包之前将 Pod IP 地址转换为节点 IP 地址。

由于伪装问题,仅当目的地位于默认非伪装目的地自定义 nonMasqueradeCIDRs 列表之一时,Pod 注释才可见。如果您将互联网目的地添加到自定义 nonMasqueradeCIDRs 列表中,则需要提供一种方法来转换内部 Pod IP 地址,然后才将其传送到互联网。对于专用集群和非专用集群,您可以使用 Cloud NAT。如需了解详情,请参阅 GKE 互动

日志过滤

启用 VPC 流日志时,您可以根据基本字段和元数据字段设置过滤条件,以仅保留与该过滤条件匹配的日志。所有其他日志在写入 Logging 之前都会被舍弃,这样可以节省资金并缩短查找所需信息的时间。

您可以根据记录格式中列出的任意字段子集进行过滤,但以下字段除外:

  • rtt_msec
  • bytes_sent
  • packets_sent
  • start_time
  • end_time

VPC 流日志过滤使用 CEL,这是一种基于特性 (Attribute) 的逻辑表达式的嵌入式表达式语言。VPC 流日志的过滤表达式不得超过 2,048 个字符。如需了解详情,请参阅支持的 CEL 逻辑运算符

如需详细了解 CEL,请参阅 CEL 简介语言定义。生成过滤器功能仅支持有限的 CEL 语法子集。

如需了解如何创建使用日志过滤的子网,请参阅有关创建子网时启用 VPC 流日志的 gcloud CLI 或 API 说明。

如需了解如何配置日志过滤,请参阅 gcloud CLI 或 API 说明,了解如何更新 VPC 流日志参数

示例 1:只允许收集名为 my-vm 的特定虚拟机的日志。在这种情况下,仅记录符合下列条件的日志:流量来源报告的 src_instance 字段为 my-vm,或者流量目的地报告的 dst_instance 字段为 my-vm

gcloud compute networks subnets update my-subnet \
    --logging-filter-expr="(src_instance.vm_name == 'my-vm' && reporter=='SRC') || (dest_instance.vm_name == 'my-vm' && reporter=='DEST')"

示例 2:只允许收集其来源 IP 地址位于 10.0.0.0/8 子网中的数据包的日志。

gcloud compute networks subnets update my-subnet \
    --logging-filter-expr="inIpRange(connection.src_ip, '10.0.0.0/8')"

示例 3:只收集 VPC 外部流量的日志。

gcloud compute networks subnets update my-subnet \
    --logging-filter-expr '!(has(src_vpc.vpc_name) && has(dest_vpc.vpc_name))'

支持的 CEL 逻辑运算符

表达式 受支持的类型 说明
true、false 布尔值 布尔常量

x == y

x != y

布尔值、整数、字符串

比较运算符

示例:connection.protocol == 6

x && y

x || y

布尔值

布尔值逻辑运算符

示例:connection.protocol == 6 && src_instance.vm_name == "vm_1"

!x 布尔值 取反
1, 2.0, 0, ... Int 数字字面常量
x + y 字符串 字符串串联
"foo", 'foo', ... 字符串 字符串字面常量
x.lower() 字符串 返回字符串 x 的小写值
x.upper() 字符串 返回字符串 x 的大写值
x.contains(y) 字符串 如果字符串包含指定的子字符串,则返回 true
x.startsWith(y) 字符串 如果字符串以指定的子字符串开头,则返回 true
x.endsWith(y) 字符串 如果字符串以指定的子字符串结尾,则返回 true
inIpRange(X, Y) 字符串

如果 X 是 IP 地址且 Y 是包含 X 的 IP 地址范围,则返回 true

示例:inIpRange("1.2.3.1", "1.2.3.0/24")

x.containsFieldValue(y) x: list
y: map(string, string)

如果列表包含的对象的字段与指定的键值对匹配,则返回 true

示例:dest_gke_details.service.containsFieldValue({'service_name': 'service1', 'service_namespace': 'namespace1'})

has(x) 字符串

如果该字段存在,则返回 true。

后续步骤