防火墙规则日志记录概览

通过防火墙规则日志记录,您可以审核、验证和分析防火墙规则所带来的影响。例如,您可以确定用于拒绝流量的防火墙规则是否如期发挥作用。如果您需要确定某特定防火墙规则影响的连接数,防火墙规则日志记录也非常有用。

对于您需要记录其连接的每一条防火墙规则,您都要单独启用防火墙规则日志记录。防火墙规则日志记录选项适用于所有防火墙规则,与规则的操作(allowdeny)或方向(入站或出站)无关。

防火墙规则日志记录会记录进出 Compute Engine 虚拟机实例的流量。这包括在 Compute Engine 虚拟机上构建的 Google Cloud 产品,例如 Google Kubernetes Engine (GKE) 集群App Engine 柔性环境实例。

启用防火墙规则日志记录后,Google Cloud 会在规则允许或拒绝流量时创建称为连接记录的条目。您可以在 Cloud Logging 中查看这些记录,并将日志导出至 Cloud Logging 导出功能支持的任意目的地。

每一条连接记录都包含来源和目的地 IP 地址、协议和端口、日期和时间,以及对流量所应用的防火墙规则的引用。

防火墙规则日志记录可用于 VPC 防火墙规则和分层防火墙政策。

如需了解如何查看日志,请参阅使用防火墙规则日志记录

规范

防火墙规则日志记录具有以下规范:

日志记录示例

每次向流量应用已启用日志记录的防火墙规则,即会生成一个日志条目。一个给定的数据包流总共可生成多个日志条目。 但从给定虚拟机的角度来看,如果该虚拟机所应用的防火墙规则启用了日志记录,则最多可生成一个日志条目。

以下示例展示了防火墙日志的工作原理。

出站拒绝示例

在此示例中:

  • example-proj 项目中 example-net VPC 网络内的虚拟机实例之间的流量为例。
  • 这两个虚拟机实例分别是:
    • us-west1-a 地区中的 VM1,在 west-subnetus-west1 区域)中的 IP 地址为 10.10.0.99
    • us-east1-a 地区中的 VM2,在 east-subnetus-east1 区域)中的 IP 地址为 10.20.0.99
  • 规则 A:出站拒绝防火墙规则,该规则的目标是网络中的所有实例,目的地为 10.20.0.99 (VM2),应用于 TCP 端口 80。
    • 此规则启用了日志记录。
  • 规则 B:入站允许防火墙规则,该规则的目标是网络中的所有实例,来源为 10.10.0.99 (VM1),应用于 TCP 端口 80。
    • 此规则也启用了日志记录。

以下 gcloud 命令可用于创建防火墙规则:

  • 规则 A:针对 TCP 80 的出站拒绝规则,适用于所有实例,目的地为 10.20.0.99

    gcloud compute firewall-rules create rule-a \
        --network example-net \
        --action deny \
        --direction egress \
        --rules tcp:80 \
        --destination-ranges 10.20.0.99/32 \
        --priority 10 \
        --enable-logging
    
  • 规则 B:针对 TCP 80 的入站允许规则,适用于所有实例,来源为 10.10.0.99

    gcloud compute firewall-rules create rule-b \
        --network example-net \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 10.10.0.99/32 \
        --priority 10 \
        --enable-logging
    
VM1 到 VM2 的连接(点击可放大)
VM1 到 VM2 的连接(点击可放大)

假设 VM1 尝试通过 TCP 端口 80 连接到 VM2。系统会记录以下防火墙规则:

  • 当 VM1 尝试连接到 10.20.0.99 (VM2) 时,系统会根据 VM1 生成规则 A 的日志条目。
  • 由于规则 A 实际上会阻止流量,而规则 B 绝不会被考虑,因此系统不会根据 VM2 生成规则 B 的日志条目。

在以下示例中,系统会生成防火墙日志记录。

字段
连接 src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=6
disposition DENIED
rule_details reference = "network:example-net/firewall:rule-a"
priority = 10
action = DENY
destination_range = 10.20.0.99/32
ip_port_info = tcp:80
direction = egress
instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_instance project_id="example-proj"
instance_name=VM2
region=us-east1
zone=us-east1-a
remote_vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=east-subnet
remote_location 无信息。只有目的地在 VPC 网络外部时才使用此字段。

出站允许且入站允许示例

在此示例中:

  • example-proj 项目中 example-net VPC 网络内的虚拟机实例之间的流量为例。
  • 这两个虚拟机实例分别是:
    • us-west1-a 地区中的 VM1,在 west-subnetus-west1 区域)中的 IP 地址为 10.10.0.99
    • us-east1-a 地区中的 VM2,在 east-subnetus-east1 区域)中的 IP 地址为 10.20.0.99
  • 规则 A:出站允许防火墙规则,该规则的目标是网络中的所有实例,目的地为 10.20.0.99 (VM2),应用于 TCP 端口 80。
    • 此规则启用了日志记录。
  • 规则 B:入站允许防火墙规则,该规则的目标是网络中的所有实例,来源为 10.10.0.99 (VM1),应用于 TCP 端口 80。
    • 此规则也启用了日志记录。

以下 gcloud 命令可用于创建这两个防火墙规则:

  • 规则 A:针对 TCP 80 的出站允许规则,适用于所有实例,目的地为 10.20.0.99 (VM2):

    gcloud compute firewall-rules create rule-a \
        --network example-net \
        --action allow \
        --direction egress \
        --rules tcp:80 \
        --destination-ranges 10.20.0.99/32 \
        --priority 10 \
        --enable-logging
    
  • 规则 B:针对 TCP 80 的入站允许规则,适用于所有实例,来源为 10.10.0.99 (VM1):

    gcloud compute firewall-rules create rule-b \
        --network example-net \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 10.10.0.99/32 \
        --priority 10 \
        --enable-logging
    
VM1 到 VM2 的连接(点击可放大)
VM1 到 VM2 的连接(点击可放大)

假设 VM1 尝试通过 TCP 端口 80 连接到 VM2。系统会记录以下防火墙规则:

  • 当 VM1 连接到 10.20.0.99 (VM2) 时,系统会根据 VM1 生成规则 A 的日志条目。
  • 当 VM2 允许来自 10.10.0.99 (VM1) 的入站连接时,系统会根据 VM2 生成规则 B 的日志条目。

在以下示例中,系统会生成 VM1 报告的防火墙日志记录。

字段
连接 src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=6
disposition ALLOWED
rule_details reference = "network:example-net/firewall:rule-a"
priority = 10
action = ALLOW
destination_range = 10.20.0.99/32
ip_port_info = tcp:80
direction = egress
instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_instance project_id="example-proj"
instance_name=VM2
region=us-east1
zone=us-east1-a
remote_vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=east-subnet
remote_location 无信息。只有目的地在 VPC 网络外部时才使用此字段。

在以下示例中,系统会生成 VM2 报告的防火墙日志记录。

字段
连接 src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=6
disposition ALLOWED
rule_details reference = "network:example-net/firewall:rule-b"
priority = 10
action = ALLOW
source_range = 10.10.0.99/32
ip_port_info = tcp:80
direction = ingress
instance project_id="example-proj"
instance_name=VM2
region=us-east1
zone=us-east1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=east-subnet
remote_instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
remote_vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_location 无信息。只有目的地在 VPC 网络外部时才使用此字段。

互联网入站示例

在此示例中:

  • 以从 example-net VPC 网络外部的系统到该网络中的虚拟机实例的流量为例。该网络位于 example-proj 项目中。
  • 该系统在互联网上的 IP 地址为 203.0.113.114
  • us-west1-a 地区中的 VM1,在 west-subnetus-west1 区域)中的 IP 地址为 10.10.0.99
  • 规则 C:入站允许防火墙规则,该规则的目标是网络中的所有实例、来源为任何 IP 地址 (0.0.0.0/0),应用于 TCP 端口 80。
    • 此规则启用了日志记录。
  • 规则 D:出站拒绝防火墙规则,该规则的目标是网络中的所有实例、目的地为任何 IP 地址 (0.0.0.0/0),应用于所有协议。
    • 此规则也启用了日志记录。

以下 gcloud 命令可用于创建防火墙规则:

  • 规则 C:针对 TCP 80 的入站允许规则,适用于所有实例,来源不限:

    gcloud compute firewall-rules create rule-c \
        --network example-net \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 0.0.0.0/0 \
        --priority 10 \
        --enable-logging
    
  • 规则 D:出站拒绝规则,适用于所有协议、所有实例和任何目标:

    gcloud compute firewall-rules create rule-d \
        --network example-net \
        --action deny \
        --direction egress \
        --rules all \
        --destination-ranges 0.0.0.0/0 \
        --priority 10 \
        --enable-logging
    
互联网到虚拟机的连接(点击可放大)
互联网到虚拟机的连接(点击可放大)

假设 IP 地址为 203.0.113.114 的系统尝试通过 TCP 端口 80 连接到 VM1,会发生以下情况:

  • 当 VM1 接受来自 203.0.113.114 的流量时,系统会根据 VM1 生成规则 C 的日志条目。
  • 尽管存在规则 D,但由于 Google Cloud 防火墙规则为有状态规则,因此仍允许 VM1 回复传入请求。如果允许传入请求,则不能通过任何类型的出站规则阻止已建立的响应。
  • 由于规则 D 不适用,并且绝不会被考虑,因此规则 D 没有日志条目。

在以下示例中,系统会生成防火墙日志记录。

字段
连接 src_ip=203.0.113.114
src_port=[EPHEMERAL_PORT]
dest_ip=10.10.0.99
dest_port=80
protocol=6
disposition ALLOWED
rule_details reference = "network:my-vpc/firewall:rule-c"
priority = 10
action = ALLOW
source_range = 0.0.0.0/0
ip_port_info = tcp:80
direction = ingress
instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_location continent
country
region
city

防火墙日志格式

根据规范,如果对进出虚拟机实例的流量应用了已启用日志记录的防火墙规则,则系统会在 Cloud Logging 中为每条规则生成一个日志条目。日志记录包含在 Logging LogEntry 的 JSON 载荷字段中。

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

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

字段 说明 字段类型:基本或可选元数据
connection IpConnection
一个 5 元组,描述了此连接的来源 IP 地址和目的地 IP 地址、来源端口和目的地端口以及 IP 协议。
基本
disposition string
指示连接是 ALLOWED 还是 DENIED
基本
rule_details RuleDetails
此连接所应用的规则的详细信息。
rule.reference 字段 基本
其他规则详细信息字段 元数据
instance InstanceDetails
虚拟机实例详细信息。在共享 VPC 配置中,project_id 与服务项目的此内容相对应。
元数据
vpc VpcDetails
VPC 网络详细信息。在共享 VPC 配置中,project_id 与宿主项目的相应参数相对应。
元数据
remote_instance InstanceDetails
如果连接的远程端点是位于 Google Compute Engine 中的虚拟机,则此字段会填充虚拟机实例详细信息。
元数据
remote_vpc VpcDetails
如果连接的远程端点是位于 VPC 网络中的虚拟机,则此字段会填充网络详细信息。
元数据
remote_location GeographicDetails
如果连接的远程端点在 VPC 网络的外部,则此字段会填充可用位置元数据。
元数据

IpConnection

字段 类型 说明
src_ip 字符串 来源 IP 地址。如果来源是 Compute Engine 虚拟机,则 src_ip 是主要内部 IP 地址或虚拟机网络接口的别名 IP 范围内的地址。系统不显示外部 IP 地址。如果虚拟机在数据包标头上发现虚拟机的 IP 地址,则 Logging 将显示此地址,这与您在虚拟机上运行 TCP 转储一样。
src_port 整数 源端口
dest_ip 字符串 目的地 IP 地址。如果目的地是 Google Cloud 虚拟机,则 dest_ip 是主要内部 IP 地址或虚拟机网络接口的别名 IP 范围内的地址。即使使用外部 IP 地址进行连接,系统也不会显示此地址。
dest_port 整数 目标端口
protocol 整数 连接的 IP 协议

RuleDetails

字段 类型 说明
reference 字符串 对防火墙规则的引用;格式:
"network:{network name}/firewall:{firewall_name}"
priority 整数 防火墙规则的优先级。
action 字符串 ALLOW 或 DENY
source_range[ ] string 防火墙规则适用的源范围列表。
destination_range[ ] string 防火墙规则适用的目的地范围列表。
ip_port_info[ ] IpPortDetails 规则的 IP 协议和适用端口范围列表。
direction string 防火墙规则适用的方向(入站或出站)。
source_tag[ ] string 防火墙规则适用的所有源标记的列表。
target_tag[ ] string 防火墙规则适用的所有目标标记的列表。
source_service_account[ ] string 防火墙规则适用的所有源服务帐号的列表。
target_service_account[ ] string 防火墙规则适用的所有目标服务帐号的列表。

IpPortDetails

字段 类型 说明
ip_protocol 字符串 防火墙规则所应用的 IP 协议。如果应用到所有协议,则为“All”。
port_range[ ] string 规则的适用端口范围列表;例如,8080-9090

InstanceDetails

字段 类型 说明
project_id 字符串 包含此虚拟机的项目的 ID
vm_name 字符串 虚拟机的实例名称
region 字符串 虚拟机的区域
zone 字符串 虚拟机的地区

VpcDetails

字段 类型 说明
project_id 字符串 包含此网络的项目的 ID
vpc_name 字符串 运行虚拟机的网络
subnetwork_name 字符串 运行虚拟机的子网

GeographicDetails

字段 类型 说明
continent 字符串 外部端点所在的大洲
country 字符串 外部端点所在的国家/地区
region 字符串 外部端点所在的区域
city 字符串 外部端点所在的城市

后续步骤