防火墙规则日志记录概览

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

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

启用防火墙规则日志记录后,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 的日志条目。

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

字段
connection src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=tcp
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 报告的防火墙日志记录。

字段
connection src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=tcp
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 报告的防火墙日志记录。

字段
connection src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=tcp
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 没有日志条目。

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

字段
connection src_ip=203.0.113.114
src_port=[EPHEMERAL_PORT]
dest_ip=10.10.0.99
dest_port=80
protocol=tcp
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 字符串 外部端点所在的城市

后续步骤