使用防火墙规则日志记录

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

本页面介绍如何为虚拟私有云的防火墙规则启用和停用日志记录。如需了解防火墙政策规则的日志记录,请参阅使用分层防火墙政策和规则

本页面还介绍了如何查看生成的日志。如需详细了解所记录的内容、日志记录示例和日志格式,请参阅防火墙规则日志记录

如果您对某防火墙规则启用了日志记录,则可以通过“防火墙数据分析”查看针对该规则的数据分析和建议。如需了解详情,请参阅 Network Intelligence Center 文档中的防火墙数据分析

权限

如需修改防火墙规则或访问日志,IAM 主账号需要具备以下角色之一。

任务 所需的角色
创建、删除或更新防火墙规则 Project Owner 或 Editor,或者 Security Admin
查看日志 Project Owner、Editor 或 Viewer,或者 Logs Viewer
如需详细了解 Logging IAM 角色和权限,请参阅 Logging 访问权限控制指南

启用和停用防火墙规则日志记录

创建防火墙规则时,可选择启用防火墙规则日志记录。如需了解详情,请参阅创建防火墙规则

如需为现有防火墙规则启用或停用防火墙规则日志记录,请按照以下说明操作。启用日志记录后,您可以控制是否包括元数据字段。如果省略,则可以节省存储费用。

启用防火墙规则日志记录

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。

    转到“防火墙政策”

  2. 日志列中,确定为每个防火墙规则启用还是停用防火墙日志记录。

  3. 如需为一个或多个防火墙规则启用日志记录,请选中要更新的每个规则旁边的复选框。

  4. VPC 防火墙规则操作栏中,点击配置日志

  5. 配置日志对话框中,选择开启

  6. 如需省略元数据字段,请展开显示日志详细信息,然后清除包括元数据复选框。

  7. 点击 Save configuration(保存配置)。

gcloud

gcloud compute firewall-rules update RULE_NAME \
    --enable-logging \
    --logging-metadata=LOGGING_METADATA

请替换以下内容:

  • RULE_NAME:防火墙规则的名称。
  • LOGGING_METADATA:指定防火墙规则日志记录是否将元数据字段包括在防火墙规则日志中。只有在启用了日志记录的情况下,您才能配置此字段。值必须为 exclude-allinclude-all。默认包括元数据字段。

如需了解详情,请参阅 SDK 参考文档

Terraform

您可以使用 Terraform 资源创建启用日志记录的防火墙规则。

resource "google_compute_firewall" "rules" {
  project     = var.project_id # Replace this with your project ID in quotes
  name        = "my-firewall-rule"
  network     = "default"
  description = "Creates firewall rule targeting tagged instances"

  log_config {
    metadata = "INCLUDE_ALL_METADATA"
  }

  allow {
    protocol = "tcp"
    ports    = ["80", "8080", "1000-2000"]
  }
  target_tags = ["web"]
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

API

为现有防火墙规则启用防火墙规则日志记录。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/RULE_NAME
{
  "name": "RULE_NAME,
  "logConfig": {
    "enable": true,
    "metadata": LOGGING_METADATA
  }
}

请将占位符替换为有效值:

  • PROJECT_ID:防火墙规则所在项目的 ID。
  • RULE_NAME:防火墙规则的名称。
  • LOGGING_METADATA:指定防火墙规则日志记录是否将元数据字段包括在防火墙规则日志中。只有在启用了日志记录的情况下,您才能配置此字段。值必须为 exclude-allinclude-all。默认包括元数据字段。

如需了解详情,请参阅 firewalls.patch 方法。

停用防火墙规则日志记录

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。

    转到“防火墙政策”

  2. 日志列中,确定为每个防火墙规则启用还是停用防火墙日志记录。

  3. 如需为一个或多个防火墙规则停用日志记录,请选中要更新的每个规则旁边的复选框。

  4. VPC 防火墙规则操作栏中,点击配置日志

  5. 配置日志对话框中,选择关闭,然后点击保存配置

gcloud

gcloud compute firewall-rules update RULE_NAME \
    --no-enable-logging

RULE_NAME 替换为防火墙规则的名称。

API

为现有防火墙规则停用防火墙规则日志记录。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/RULE_NAME
{
  "name": "RULE_NAME,
  "logConfig": {
    "enable": false
  }
}

请替换以下内容:

  • PROJECT_ID:防火墙规则所在项目的 ID。
  • RULE_NAME:防火墙规则的名称。

如需了解详情,请参阅 firewalls.patch 方法。

查看日志

防火墙规则日志是在托管网络的项目中创建的,该网络包含虚拟机实例和防火墙规则。使用共享 VPC 时,虚拟机实例会在服务项目中创建,但它们会使用宿主项目中的共享 VPC 网络。防火墙规则日志存储在该宿主项目中。

如需查看防火墙规则日志,请使用 Google Cloud 控制台的 Logs Explorer 部分

下列查询展示了如何搜索特定防火墙事件。

查看所有防火墙日志

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 点击资源

  3. 选择资源列表中,点击子网,然后点击应用

  4. 点击日志名称,然后在列表中选择防火墙

  5. 点击应用

或者:

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 点击查询

  3. 如果您在查询窗格中没有看到查询编辑器字段,请点击显示查询切换开关。

  4. 将以下内容粘贴到查询窗格的查询编辑器字段中。请将 PROJECT_ID 替换为您的项目 ID。

    resource.type="gce_subnetwork"
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Ffirewall"
    
  5. 点击运行查询

查看特定子网的日志

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 点击资源

  3. 选择资源列表中,点击子网

  4. 选择要查看其日志的子网,然后点击应用

  5. 点击日志名称,然后在列表中选择防火墙

  6. 点击应用

或者:

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 点击查询

  3. 如果您在查询窗格中没有看到查询编辑器字段,请点击显示查询切换开关。

  4. 将以下内容粘贴到查询窗格的查询编辑器字段中。将 PROJECT_ID 替换为您的项目 ID,将 SUBNET_NAME 替换为您的子网。

    resource.type="gce_subnetwork"
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Ffirewall"
    resource.labels.subnetwork_name="SUBNET_NAME"
    
  5. 点击运行查询

查看特定虚拟机中的日志

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 点击资源

  3. 选择资源列表中,点击虚拟机实例

  4. 选择要查看其日志的实例,然后点击应用

  5. 点击日志名称,然后在列表中选择防火墙

  6. 点击应用

或者:

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 点击查询

  3. 如果您在查询窗格中没有看到查询编辑器字段,请点击显示查询切换开关。

  4. 将以下内容粘贴到查询窗格的查询编辑器字段中。将 PROJECT_ID 替换为您的项目 ID,将 INSTANCE_ID 替换为要查看其日志的虚拟机的 ID。

    resource.type="gce_subnetwork"
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Ffirewall"
    jsonPayload.instance.vm_name="INSTANCE_ID"
    
  5. 点击运行查询

查看来自特定国家/地区的连接的日志

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 点击查询

  3. 如果您在查询窗格中没有看到查询编辑器字段,请点击显示查询切换开关。

  4. 将以下内容粘贴到查询窗格的查询编辑器字段中。将 PROJECT_ID 替换为您的项目 ID,将 COUNTRY 替换为采用 ISO 3166-1alpha-3 标准的编码。

    resource.type="gce_subnetwork"
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Ffirewall"
    jsonPayload.remote_location.country=COUNTRY
    

导出日志

如需导出防火墙规则日志,请参阅配置和管理接收器

您可以使用示例查询来缩小所导出日志的范围。

交互表

  • 如果是虚拟机之间的通信,则两个虚拟机都可能生成日志记录,具体取决于其各自的防火墙规则。
  • 如果防火墙允许初始数据包,则记录的连接包含双向流动的数据包。
  • 对于给定的虚拟机,系统会根据该虚拟机上配置的防火墙规则来匹配传入连接,并会根据该虚拟机上配置的出站防火墙规则来匹配传出连接。
  • 对于与设有“允许并进行日志记录”的防火墙规则相匹配的被允许的连接,系统仅记录一次。即使连接持续,系统也不会每 5 秒钟重复记录一次日志条目。
  • 如果某个被拒的连接与设有“拒绝并进行日志记录”的防火墙规则相匹配,那么只要这一被拒的连接中存在数据包,系统就会每 5 秒钟重复记录一次日志条目。

下表介绍了单个虚拟机的防火墙日志记录行为。

如果 VM1 具有入站规则 R1 和出站规则 R2,且它们均与数据包匹配,则防火墙日志记录的行为如下所示:

VM1 具有入站规则 R1(匹配数据包) VM1 具有出站规则 R2(匹配数据包) 连接方向 操作 日志
允许并记录 允许 入站流量 允许 一个日志条目:
disposition=allow, rule=R1
拒绝
允许并记录
拒绝并记录
允许 允许 入站流量 允许 无日志记录
拒绝
允许并记录
拒绝并记录
拒绝并记录 不适用 入站流量 拒绝 每 5 秒一个日志条目:
disposition=deny, rule=R1
拒绝 不适用 入站流量 拒绝 无日志记录
允许 允许并记录 Egress 允许 一个日志条目:
disposition=allow, rule=R2
拒绝
允许并记录
拒绝并记录
允许 允许 Egress 允许 无日志记录
拒绝
允许并记录
拒绝并记录
不适用 拒绝并记录 Egress 拒绝 每 5 秒一个日志条目:
disposition=deny, rule=R2
不适用 拒绝 Egress 拒绝 无日志记录

请注意,入站和出站是对称的。

下面是防火墙日志语义的详细说明:

  • 允许并记录(只有 TCP 和 UDP 支持日志记录)

    • 如果连接是应用了规则的方向发起的,则系统会创建一条日志记录。
    • 出于连接跟踪目的,回复流量会被允许。无论该方向的防火墙规则如何,回复流量均不会产生任何日志记录。
    • 如果防火墙导致连接过期(处于非活动状态 10 分钟或收到 TCP RST),则任一方向的其他数据包都有可能触发日志记录。
    • 日志记录基于五元组。TCP 标志不影响日志记录行为。
  • 拒绝并记录(只有 TCP 和 UDP 支持日志记录)

    • 丢弃数据包(不发起任何连接)。
    • 与唯一五元组对应的每个数据包均会被记录为一次失败的连接尝试。
    • 如果继续收到数据包,则系统会每 5 秒钟重复记录一次同一五元组。

问题排查

无法查看日志

如果您无法在 Google Cloud 控制台的 Logs Explorer 部分中查看防火墙规则日志,请检查以下内容:

可能的原因:权限不足

联系项目 Owner,确保您的 IAM 主账号至少具有该项目的 Logs Viewer 角色。如需了解详情,请参阅权限
可能的原因:不支持旧版网络
您无法在旧版网络中使用防火墙规则日志记录。仅支持 VPC 网络
可能的原因:确保您所查看的是正确的项目
防火墙规则日志存储在包含此网络的项目中,因此必须确保在相应的项目中查找日志。使用共享 VPC 时,虚拟机实例会在服务项目中创建,但它们会使用宿主项目中的共享 VPC 网络。对于共享 VPC 方案,防火墙规则日志存储在该宿主项目中。

如果涉及到共享 VPC,则需具备适当的宿主项目权限才能查看防火墙规则日志。即使虚拟机实例本身位于服务项目中,其防火墙规则日志仍在此宿主项目中。

缺少日志条目

可能的原因:连接可能与您预期的防火墙规则不匹配

确保您预期的防火墙规则位于实例的适用防火墙规则列表中。使用 Google Cloud 控制台查看相关实例的详细信息,然后在其虚拟机实例详情页面的网络接口部分中点击查看详情按钮。在虚拟机的“网络接口详情”页面的“防火墙和路由详情”部分中,检查适用的防火墙规则。

如需确保正确创建防火墙规则,请参阅 VPC 防火墙规则

您可以在虚拟机上使用 tcpdump 来确定其发送或接收的连接是否具有与您预期的防火墙相匹配的地址、端口和协议。

可能的原因:可能适用的是某条具有更高优先级且停用了防火墙规则日志记录的规则

防火墙规则根据其优先级进行评估。从虚拟机实例来看,流量仅应用一条防火墙规则。

您认为具有最高优先级的适用规则可能实际上并不具备最高优先级,实际上可能适用的是某条具有更高优先级并且未启用日志记录的规则。

如需排查问题,您可以暂时对可能适用于虚拟机的所有防火墙规则启用日志记录。使用 Google Cloud 控制台查看相关虚拟机的详细信息,然后在其虚拟机实例详情页面的网络接口部分中点击查看详情按钮。在虚拟机的“网络接口详情”页面的“防火墙和路由详情”部分中,检查适用的防火墙规则,并在该列表中找到您的自定义规则。暂时对所有自定义防火墙规则启用日志记录。

启用日志记录后,即可识别适用的规则。完成识别后,请务必对实际上无此需要的所有规则停用日志记录。

部分日志条目缺少元数据

可能的原因:配置传播延迟

如果您更新了已启用防火墙日志记录的防火墙规则,Google Cloud 可能需要几分钟才能完成所需更改的传播,以便记录与更新后的规则部分相匹配的流量日志。

后续步骤