防火墙规则日志记录概述

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

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

如果您对某个防火墙规则启用了日志记录,则每当该规则允许或拒绝流量时,Google Cloud Platform (GCP) 都会创建一个名为“连接记录”的条目。您可以将这些连接记录导出到 Stackdriver LoggingCloud Pub/SubBigQuery 进行分析。

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

规范

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

连接日志记录限制

每个虚拟机实例可记录的最大连接数根据其机器类型而定。连接日志记录限制是指在五秒间隔内可记录的最大连接数。

实例机器类型 在 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 命令可用于创建防火墙规则:

  1. 规则 A:出站拒绝规则,适用于 TCP 80、所有实例和目标 10.20.0.99

    gcloud beta 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
    
  2. 规则 B:入站允许规则,适用于 TCP 80、所有实例和来源 10.10.0.99

    gcloud beta 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 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 命令可用于创建这两条防火墙规则:

  1. 规则 A:出站允许规则,适用于 TCP 80、所有实例和目标 10.20.0.99 (VM2):

    gcloud beta 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
    
  2. 规则 B:入站允许规则,适用于 TCP 80、所有实例和来源 10.10.0.99 (VM1):

    gcloud beta 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 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 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=subnet-east
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=subnet-west
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 命令可用于创建防火墙规则:

  1. 规则 C:入站允许规则,适用于 TCP 80、所有实例和任何来源:

    gcloud beta 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
    
  2. 规则 D:出站拒绝规则,适用于所有协议、所有实例和任何目标:

    gcloud beta 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,但由于 GCP 防火墙规则为有状态规则,因此仍允许 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 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

防火墙日志格式

根据规范,如果向进出虚拟机实例的流量应用了已启用日志记录的防火墙规则,则在 Stackdriver Logging 中为其中每个规则生成一个日志条目。

防火墙规则遵循下表所示的格式。

Stackdriver LogEntry JSON 负载字段包含以下格式的相关信息。

字段 说明
connection IpConnection
一个五元组,它表示此连接的源 IP 地址、目标 IP 地址、源端口、目标端口以及 IP 协议。
disposition 字符串
指示是已允许连接还是已拒绝连接。
rule RuleDetails
此连接所应用的规则的详细信息。
instance InstanceDetails
虚拟机实例详情。请注意,在共享 VPC 配置中,project_id 与服务项目的该 ID 进行对应。
vpc VpcDetails
VPC 网络详细信息。请注意,在共享 VPC 配置中,project_id 与宿主项目的该 ID 进行对应。
remote_instance InstanceDetails
如果连接的远程端点是 Google Compute Engine 中的虚拟机,则此字段中填充虚拟机实例详情。
remote_vpc VpcDetails
如果连接的远程端点是 Google VPC 上的虚拟机,则此字段中填充 VPC 网络详细信息。
remote_location GeographicDetails
如果连接的远程端点未在 Google VPC 中,则此字段中填充可用位置元数据。

IpConnection

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

RuleDetails

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

IpPortDetails

字段 类型 说明
ip_protocol 字符串 防火墙规则所应用的 IP 协议。
port_range[] 字符串 规则的适用端口范围列表。例如:"8080-9090"

InstanceDetails

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

VpcDetails

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

GeographicDetails

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

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页