防火墙规则日志记录概览

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

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

启用防火墙规则的日志记录后,Google Cloud 会在规则允许或拒绝流量时创建称为连接记录的条目。您可以将这些连接记录导出至 Cloud LoggingPub/SubBigQuery 进行分析。

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

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

规范

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

连接日志记录限制

每个虚拟机实例可记录的最大连接数取决于其机器类型。连接日志记录限制表示为在 5 秒间隔内可记录的最大连接数。

实例机器类型 在 5 秒间隔内记录的最大连接数
f1-micro 100 个连接
g1-small 250 个连接
具有 1–8 个 vCPU 的机器类型 每个 vCPU 500 个连接
具有 8 个以上 vCPU 的机器类型 4000 (500×8) 个连接

日志记录示例

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

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

出站拒绝示例

在此示例中:

  • 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
region=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 地址、源端口、目标端口以及 IP 协议。
disposition string
指示是已允许连接还是已拒绝连接。
rule_details 规则详细信息
已应用到此连接的规则的详细信息。
instance InstanceDetails
虚拟机实例详细信息。在共享 VPC 配置中,project_id 与服务项目的此内容相对应。
vpc VpcDetails
VPC 网络详细信息。在共享 VPC 配置中,project_id 与宿主项目的此内容相对应。
remote_instance InstanceDetails
如果连接的远程端点是 Compute Engine 中的虚拟机,则此字段中填充虚拟机实例详细信息。
remote_vpc VpcDetails
如果连接的远程端点是 VPC 网络上的虚拟机,则此字段中填充 VPC 网络详细信息。
remote_location GeographicDetails
如果连接的远程端点未在 VPC 网络中,则此字段中填充可用位置元数据。

IpConnection

字段 类型 说明
src_ip 字符串 源 IP 地址。如果源为 Compute Engine 虚拟机,则接口的内部 IP 地址为 src_ip。不显示外部公共 IP 地址。如果虚拟机在数据包标头上发现虚拟机的 IP 地址,则 Logging 将显示此地址,这与您在虚拟机上运行 TCP 转储一样。
src_port 整数 源端口
dest_ip 字符串 目标 IP 地址。如果目标为 Google Cloud 虚拟机,则接口的内部专用 IP 地址为 dest_ip。即使使用外部公共 IP 地址进行连接,也不显示此地址。
dest_port 整数 目标端口
protocol 整数 连接的 IP 协议

RuleDetails

字段 类型 说明
reference string 对防火墙规则的引用;格式:
"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 字符串 外部端点所在的城市

后续步骤