防火墙规则日志记录概览

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

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

如果您对某个防火墙规则启用了日志记录,则每当该规则允许或拒绝流量时,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 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 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 命令可用于创建这两条防火墙规则:

  1. 规则 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
    
  2. 规则 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=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 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 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_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

防火墙日志格式

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

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

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

字段 说明
connection IpConnection
一个五元组,它表示此连接的源 IP 地址、目标 IP 地址、源端口、目标端口以及 IP 协议。
disposition 字符串
指示是已允许连接还是已拒绝连接。
rule_details 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 字符串 外部端点所在的城市

后续步骤

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

发送以下问题的反馈:

此网页