使用防火墙规则

本页面介绍了用于处理防火墙规则的命令,还提供了一些命令用法示例。

准备工作

请参阅防火墙规则概览,以详细了解防火墙规则(例如默认网络的隐式规则和系统生成的规则)。

在配置防火墙规则前,请先查看防火墙规则组件,以熟悉 Google Cloud 中使用的防火墙组件。

创建防火墙规则

防火墙规则是在网络级别定义的,仅会应用于在其中创建它们的网络;但是,您为每条规则选择的名称在项目中必须是唯一的。

防火墙规则可以包含 IPv4 或 IPv6 地址范围,但不能同时包含两者。

创建防火墙规则时,可选择启用防火墙规则日志记录。如果启用日志记录,则可以省略元数据字段以节省存储费用。如需了解详情,请参阅使用防火墙规则日志记录

Google Cloud Console 不支持 IPv6 防火墙规则。请改用 gcloud 命令行工具或 API。

如果您想要为目标或来源服务帐号字段指定多个服务帐号,请使用 gcloud 工具或 API。

控制台

  1. 转到 Google Cloud Console 中的“防火墙”页面。
    转到“防火墙”页面
  2. 点击创建防火墙规则
  3. 输入防火墙规则的名称
    该名称在项目中必须是唯一的。
  4. (可选)您可以启用防火墙规则日志记录
    • 点击日志 > 开启
    • 如需省略元数据,请展开日志详细信息,然后清除包含元数据
  5. 为防火墙规则指定网络
  6. 指定规则的优先级
    数字越小,优先级越高。
  7. 选择“入站”或“出站”作为流量方向
  8. 对于对匹配项执行的操作,选择“允许”或“拒绝”。
  9. 指定规则的目标
    • 如果您希望将规则应用于网络中的所有实例,请选择 All instances in the network
    • 如果您希望按网络(目标)标记将规则应用于部分实例,请选择 Specified target tags,然后在目标标记字段中输入应将规则应用于的标记。
    • 如果您希望按关联的服务帐号将规则应用于部分实例,请选择 Specified service account,在服务帐号范围下指明该服务帐号属于当前项目还是其他项目,然后在目标服务帐号字段中选择或输入服务帐号名称。
  10. 对于入站规则,请指定来源过滤条件
    • 选择 IP ranges,然后在来源 IP 地址范围字段中输入 CIDR 地址块,即可按 IP 地址范围定义传入流量的来源。0.0.0.0/0 表示任意网络来源。
    • 如需按网络标记限制来源,请选择 Source tags,然后在来源标记字段中输入相应网络标记。如需了解针对来源标记数量的限制,请参阅每个网络的限制。只有在未按服务帐号指定目标时,才能按来源标记过滤。如需了解详情,请参阅按服务帐号过滤与按网络标记过滤
    • 如需按服务帐号限制来源,请选择 Service account,在服务帐号范围下指明该服务帐号属于当前项目还是其他项目,然后在来源服务帐号字段中选择或输入服务帐号名称。只有在未通过网络标记指定目标时,才能按源服务帐号过滤。如需了解详情,请参阅按服务帐号过滤与按网络标记过滤
    • 如果需要,请指定次要来源过滤条件。次要来源过滤条件不能与主要过滤条件相同。 来源 IP 地址范围可以与来源标记来源服务帐号同时使用,有效来源集是来源范围内的 IP 地址与网络标记(或服务帐号)所标识实例的并集
    • 来源标记来源服务帐号不能同时使用。
  11. 对于出站规则,请指定目标过滤条件
    • 选择 IP ranges,然后在目标 IP 地址范围字段中输入 CIDR 地址块,即可按 IP 地址范围定义传出流量的目的地。0.0.0.0/0 表示任意位置。
  12. 定义规则适用的协议和端口

    • 选择 Allow allDeny all(具体取决于执行的操作)可将规则应用于所有协议和目的地端口。

    • 定义特定协议和目的地端口:

      • 选择 tcp 以包括 TCP 协议和目的地端口。输入 all 或英文逗号分隔的目的地端口列表,例如 20-22, 80, 8080
      • 选择 udp 以包括 UDP 协议和目的地端口。输入 all 或英文逗号分隔的目的地端口列表,例如 67-69, 123
      • 选择其他协议以包括 icmpsctp 等协议。
  13. (可选)您可以创建防火墙规则但不实施,只需将其实施状态设置为已停用即可。具体方法为:点击停用规则,然后选择已停用

  14. 点击创建

gcloud

用于创建防火墙规则的 gcloud 命令如下所示:

gcloud compute firewall-rules create NAME \
    [--network NETWORK; default="default"] \
    [--priority PRIORITY;default=1000] \
    [--direction (ingress|egress|in|out); default="ingress"] \
    [--action (deny | allow )] \
    [--target-tags TAG[,TAG,...]] \
    [--target-service-accounts=IAM_SERVICE_ACCOUNT[,IAM_SERVICE_ACCOUNT,...]] \
    [--source-ranges CIDR_RANGE[,CIDR_RANGE,...]] \
    [--source-tags TAG,TAG,] \
    [--source-service-accounts=IAM_SERVICE_ACCOUNT[,IAM_SERVICE_ACCOUNT,...]] \
    [--destination-ranges CIDR_RANGE[,CIDR_RANGE,...]] \
    [--rules (PROTOCOL[:PORT[-PORT]],[PROTOCOL[:PORT[-PORT]],...]] | all ) \
    [--disabled | --no-disabled] \
    [--enable-logging | --no-enable-logging] \
    [--logging-metadata LOGGING_METADATA]

请使用如下参数。如需详细了解各个参数,请参阅 SDK 参考文档

  • --network 规则的网络。如果省略此参数,则会在 default 网络中创建规则。如果您没有默认网络或者想要在特定网络中创建规则,则必须使用该字段。
  • --priority:表示规则优先级的数值。数字越小,优先级越高。
  • --direction流量方向ingressegress)。
  • --action对匹配项执行的操作allowdeny)。必须与 --rules 标志结合使用。
  • 可通过下列三种方式之一指定目标
    • 如果应将规则应用于网络中的所有目标,则省略 --target-tags--target-service-accounts
    • --target-tags:使用此标志可按网络标记定义目标
    • --target-service-accounts:使用此标志可按关联的服务帐号定义目标
  • 对于入站规则,请指定来源
    • --source-ranges:使用此标志可以以 CIDR 格式指定来源 IPv4 或 IPv6 地址的范围。
    • 如果省略 --source-rangessource-tags--source-service-accounts,则入站流量来源是任何 IPv4 地址 0.0.0.0/0
    • --source-tags:使用此标志可以按网络标记指定来源实例。只有在未按服务帐号指定目标时,才能按来源标记过滤。如需了解详情,请参阅按服务帐号过滤与按网络标记过滤
    • --source-ranges--source-tags 可同时使用。如果同时指定了两者,则有效来源集就是来源范围内的 IP 地址与网络标记所标识实例的并集,即使所标记实例的 IP 地址不在来源范围内也是如此。
    • --source-service-accounts:使用此标志可以按实例使用的服务帐号指定实例。只有在未按网络标记指定目标时,才能按来源服务帐号过滤。如需了解详情,请参阅按服务帐号过滤与按网络标记过滤--source-ranges--source-service-accounts 可同时使用。如果同时指定了两者,则有效来源集就是来源范围内的 IP 地址与来源服务帐号所标识实例的并集,即使来源服务帐号所标识的实例的 IP 地址不在来源范围内也是如此。
  • 对于出站规则,请指定目的地
    • --destination-ranges:使用此标志可以以 CIDR 格式指定目标 IPv4 或 IPv6 地址的范围。
    • 如果省略 --destination-ranges,则出站流量目的地是任何 IPv4 地址 0.0.0.0/0
  • --rules:规则适用的协议和目标端口列表。使用 all 可使规则适用于所有协议和所有目的地端口。需要用到 --action 标志。
  • 默认情况下,防火墙规则会在创建后自动实施;不过,您可以更改此行为。
    • 如果同时省略 --disabled--no-disabled,则系统会创建并实施防火墙规则。
    • --disabled:添加此标志可以创建防火墙规则,但不会实施。防火墙规则会保持停用状态,直到您更新防火墙规则以将其启用。
    • --no-disabled:添加此标志可确保实施防火墙规则。
  • --enable-logging | --no-enable-logging:您可以在创建或更新规则时,为规则启用防火墙规则日志记录。通过防火墙规则日志记录,您可以审核、验证和分析防火墙规则所带来的影响。如需了解详情,请参阅防火墙规则日志记录
    • --logging-metadata:如果启用日志记录,则默认情况下防火墙规则日志记录包含基本字段和元数据字段。您可以省略元数据字段以节省存储费用。如需了解详情,请参阅使用防火墙规则日志记录

API

创建防火墙规则。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
{
  "name": "FIREWALL_NAME",
  "network": "projects/PROJECT-ID/global/networks/NETWORK_NAME",
  ... other fields
}

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

  • PROJECT_ID 是 VPC 网络所在项目的 ID。
  • NETWORK_NAME 是创建防火墙规则所在 VPC 网络的名称。
  • FIREWALL_NAME 防火墙规则的名称。

  • 对于入站防火墙规则,请使用以下字段来指定入站来源:sourceRangessourceTagssourceServiceAccountssourceRanges 可以是 IPv4 或 IPv6 范围,但不能是这两者的组合。不指定字段可使用范围 0.0.0.0/0。您不能同时使用 sourceTagssourceServiceAccounts 字段。不过,您可以将 sourceRangessourceTagssourceServiceAccounts 结合使用。如果这样,连接只需要匹配其中一个字段,即可应用防火墙规则。

    对于目标字段,如果您使用 sourceTags 字段,则不能使用 targetServiceAccounts 字段。您必须使用 targetTags 字段或不使用目标字段。同样,如果您使用 sourceServiceAccounts 字段,则不能使用 targetTags 字段。如果您不指定目标字段,则规则将应用于网络中的所有目标。

  • 对于出站防火墙规则,请使用 destinationRanges 字段来指定目的地。destinationRanges 可以是 IPv4 或 IPv6 范围,但不能是这两者的组合。如果您不指定目的地,则 Google Cloud 将使用 0.0.0.0/0。使用 targetTagstargetServiceAccounts 字段可指定规则应用于的目标。如果您不指定目标字段,则规则将应用于网络中的所有目标。

如需详细了解各字段,请参阅 firewalls.insert 方法。

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"

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

更新防火墙规则

您可以修改防火墙规则的某些组成部分,例如匹配条件的指定协议和目的地端口。您不能修改防火墙规则的名称、网络、对匹配项执行的操作流量方向

如果您需要更改名称、网络、操作或方向组件,则必须删除现有规则,然后改为创建新规则

Google Cloud Console 不支持 IPv6 防火墙规则。请改用 gcloud 命令行工具或 API。

如果您要添加或移除多个服务帐号,请使用 gcloud 命令行工具或 API。您无法使用控制台来指定多个目标服务帐号或来源服务帐号。

控制台

  1. 转到 Google Cloud Console 中的“防火墙”页面。
    转到“防火墙”页面
  2. 点击要修改的防火墙规则。
  3. 点击修改
  4. 根据您的需求修改任何可修改的组成部分

    指定的协议和端口字段中,使用英文分号分隔列表来指定多个协议以及协议和目的地端口组合。

  5. 点击保存

gcloud

用于更新防火墙规则的 gcloud 命令如下所示:

gcloud compute firewall-rules update NAME \
    [--priority=PRIORITY] \
    [--description=DESCRIPTION] \
    [--target-tags=TAG,...] \
    [--target-service-accounts=IAM_SERVICE_ACCOUNT,_] \
    [--source-ranges=CIDR_RANGE,...] \
    [--source-tags=TAG,...] \
    [--source-service-accounts=IAM_SERVICE_ACCOUNT,_] \
    [--destination-ranges=CIDR_RANGE,...] \
    [--rules=[PROTOCOL[:PORT[-PORT]],…]] \
    [--disabled | --no-disabled] \
    [--enable-logging | --no-enable-logging]

每个标志的说明均与创建防火墙规则部分相同。如需详细了解各个标志,请参阅 SDK 参考文档

API

使用 PATCH 可更新以下字段:alloweddescriptionsourceRangessourceTagstargetTags。对所有其他字段使用 PUT 或 POST。

(PATCH|(POST|PUT)) https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/FIREWALL_NAME
{
  "name": "FIREWALL_NAME",
  "network": "projects/PROJECT-ID/global/networks/NETWORK_NAME",
  ... other fields
}

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

  • PROJECT_ID 是 VPC 网络所在项目的 ID。
  • NETWORK_NAME 是防火墙规则所在 VPC 网络的名称。
  • FIREWALL_NAME 是要更新的防火墙规则的名称。

如需详细了解各字段,请参阅 firewalls.patchfirewalls.update 方法。

列出 VPC 网络的防火墙规则

在 Cloud Console 中,您可以列出您的项目或特定 VPC 网络的所有防火墙规则。对于每个防火墙规则,Cloud Console 都会显示详细信息,例如规则的类型、目标和过滤条件。

如果您启用了防火墙规则日志记录,则防火墙数据分析可以提供有关您的防火墙规则的数据分析,以帮助您更好地了解并安全地优化防火墙配置。例如,您可以查看最近六周未使用哪些 allow 规则。如需了解详情,请参阅防火墙数据分析文档中的使用防火墙规则详情屏幕

控制台

要显示项目中所有网络的所有防火墙规则,请执行以下操作:

要显示特定网络中的防火墙规则,请执行以下操作:

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击某个 VPC 网络的名称以转到其详情页面。
  3. 在该网络的详情页面上,点击防火墙规则标签页。

gcloud

以下命令会生成给定网络 ([NETWORK-NAME]) 经过排序的防火墙规则列表。

gcloud compute firewall-rules list --filter network=NETWORK_NAME \
    --sort-by priority \
    --format="table(
        name,
        network,
        direction,
        priority,
        sourceRanges.list():label=SRC_RANGES,
        destinationRanges.list():label=DEST_RANGES,
        allowed[].map().firewall_rule().list():label=ALLOW,
        denied[].map().firewall_rule().list():label=DENY,
        sourceTags.list():label=SRC_TAGS,
        targetTags.list():label=TARGET_TAGS
        )"

API

列出给定网络的所有防火墙规则。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/?filter=network="NETWORK_NAME

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

  • PROJECT_ID 是 VPC 网络所在项目的 ID。
  • NETWORK_NAME 是包含所要列出防火墙规则的 VPC 网络的名称。

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

列出虚拟机实例网络接口的防火墙规则

对于每个网络接口,Cloud Console 列出了适用于相应接口的所有防火墙规则以及被该接口实际使用的规则。防火墙规则可以屏蔽其他规则,因此并非所有适用于接口的规则都会被该接口实际使用。

防火墙规则通过规则的目标参数关联并适用于虚拟机实例。通过查看所有适用的规则,您可以检查特定规则是否适用于接口。

如果您启用了防火墙规则日志记录,则防火墙数据分析可以提供有关您的防火墙规则的数据分析,以帮助您更好地了解并安全地优化防火墙配置。例如,您可以查看最近六周内界面上有哪些规则命中。如需了解详情,请参阅防火墙数据分析文档中的使用虚拟机网络接口详情屏幕

要查看适用于虚拟机实例特定网络接口的防火墙规则,请执行以下操作:

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面并找到要查看的实例。
    转到“虚拟机实例”页面
  2. 在该实例的更多操作菜单 () 中,选择查看网络详情
  3. 如果某个实例具有多个网络接口,请在网络接口详情部分选择要查看的网络接口。
  4. 点击防火墙规则标签以查看适用于该网络接口的所有规则。

并非适用于网络接口的所有规则都会被接口使用。某些规则可能会被具有更具体范围或更高优先级的规则替换。通过查看正在使用的规则,您可以快速验证实例上打开或关闭的 IP 地址范围、协议和目的地端口。

如需查看虚拟机实例特定网络接口所使用的规则,请执行以下操作:

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面并找到要查看的实例。
    转到“虚拟机实例”页面
  2. 在该实例的更多操作菜单 () 中,选择查看网络详情
  3. 如果某个实例具有多个网络接口,请在网络接口详情部分选择要查看的网络接口。
  4. 网络分析部分,选择入站流量分析出站流量分析标签页。
  5. 查看按照 IP 地址范围特定性从高到低排序的表,以确定是否允许流量进出特定 IP 地址。

查看防火墙规则详情

您可以检查防火墙规则,以查看其名称、适用网络和组成部分(包括规则是否处于启用状态)。

控制台

  1. 列出您的防火墙规则。您可以查看规则的完整列表,也可以仅查看特定网络中的规则。
  2. 点击要查看的规则。

gcloud

以下命令可描述单个防火墙规则。请将 [FIREWALL-NAME] 替换为防火墙规则的名称。防火墙规则名称在项目中是唯一的,因此您在描述现有规则时无需指定网络。

gcloud compute firewall-rules describe [FIREWALL-NAME]

API

描述给定防火墙规则。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/FIREWALL_NAME

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

  • PROJECT_ID 是防火墙规则所在项目的 ID。
  • FIREWALL_NAME 是要说明的防火墙规则的名称。

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

删除防火墙规则

控制台

  1. 列出您的防火墙规则。您可以查看规则的完整列表,也可以仅查看特定网络中的规则。
  2. 点击要删除的规则。
  3. 点击删除
  4. 再次点击删除进行确认。

gcloud

以下命令可删除防火墙规则。请将 [FIREWALL-NAME] 替换为要删除的规则的名称。

gcloud compute firewall-rules delete [FIREWALL-NAME]

API

删除防火墙规则。

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/FIREWALL_NAME

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

  • PROJECT_ID 是防火墙规则所在项目的 ID。
  • FIREWALL_NAME 是要删除的防火墙规则的名称。

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

监控防火墙规则

您可以为防火墙规则启用日志记录,以便了解哪条规则允许流量、哪条规则会阻止流量以及这些流量的具体信息。如需了解相关说明,请参阅使用防火墙规则日志记录

配置示例

下图演示了一个防火墙配置示例。该场景涉及 my-network,其中包含以下内容:

  • 子网 subnet1,IP 范围为 10.240.10.0/24
  • 子网 subnet2,IP 范围为 192.168.1.0/24
  • subnet2 中的实例 vm1,标记为 webserver,内部 IP 为 192.168.1.2
  • subnet2 中的实例 vm2,标记为 database,内部 IP 地址为 192.168.1.3
网络配置示例(点击可放大)
网络配置示例(点击可放大)

示例 1:拒绝所有入站 TCP 连接(从 subnet1 到端口 80 的连接除外)

此示例会创建一组防火墙规则,以拒绝所有入站 TCP 连接(从 subnet1 到端口 80 的连接除外)。

  1. 创建一条防火墙规则,以拒绝流向带有 webserver 标记的实例的所有入站 TCP 流量。

    gcloud compute firewall-rules create deny-subnet1-webserver-access \
        --network NETWORK_NAME \
        --action deny \
        --direction ingress \
        --rules tcp \
        --source-ranges 0.0.0.0/0 \
        --priority 1000 \
        --target-tags webserver
    
  2. 创建一条防火墙规则,以允许 subnet1 (10.240.10.0/24) 中的所有 IP 访问带有 webserver 标记的实例上的 TCP 端口 80

    gcloud compute firewall-rules create vm1-allow-ingress-tcp-port80-from-subnet1 \
        --network NETWORK_NAME \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 10.240.10.0/24 \
        --priority 50 \
        --target-tags webserver
    

示例 2:拒绝所有出站 TCP 连接(与 vm1 的端口 80 的连接除外)

  1. 创建一条防火墙规则,以拒绝所有出站 TCP 流量。

    gcloud compute firewall-rules create deny-all-access \
        --network NETWORK_NAME \
        --action deny \
        --direction egress \
        --rules tcp \
        --destination-ranges 0.0.0.0/0 \
        --priority 1000
    
  2. 创建一条防火墙规则,以允许定向到 vm1 的端口 80 的 TCP 流量。

    gcloud compute firewall-rules create vm1-allow-egress-tcp-port80-to-vm1 \
        --network NETWORK_NAME \
        --action allow \
        --direction egress \
        --rules tcp:80 \
        --destination-ranges 192.168.1.2/32 \
        --priority 60
    

示例 3:允许与外部主机的端口 443 的出站 TCP 连接

创建一条防火墙规则,以允许带有 webserver 标记的实例将出站 TCP 流量发送到示例外部 IP 地址 192.0.2.5 的端口 443

gcloud compute firewall-rules create vm1-allow-egress-tcp-port443-to-192-0-2-5 \
    --network NETWORK_NAME \
    --action allow \
    --direction egress \
    --rules tcp:443 \
    --destination-ranges 192.0.2.5/32 \
    --priority 70 \
    --target-tags webserver

示例 4:允许从 vm2vm1 的 SSH 连接

创建一条防火墙规则,以允许 SSH 流量从带有 database 标记的实例 (vm2) 到达带有 webserver 标记的实例 (vm1)。

gcloud compute firewall-rules create vm1-allow-ingress-tcp-ssh-from-vm2 \
    --network NETWORK_NAME \
    --action allow \
    --direction ingress \
    --rules tcp:22 \
    --source-tags database \
    --priority 80 \
    --target-tags webserver

示例 5:允许 1443 端口的 TCP 流量从网络服务器流向数据库(使用服务帐号)

如需详细了解服务帐号和角色,请参阅向服务帐号授予角色

请考虑下图中的情景,其中有两个通过模板自动扩缩的应用,一个是 Web 服务器应用 my-sa-web,另一个是数据库应用“my-sa-db”。安全管理员希望允许 TCP 流量通过目的地端口 1443my-sa-web 流向 my-sa-db

将防火墙规则与服务帐号搭配使用(点击可放大)
将防火墙规则与服务帐号搭配使用(点击可放大)

配置步骤(包括创建服务帐号的步骤)如下所示:

  1. 项目 EDITOR 或项目 OWNER 创建服务帐号 my-sa-webmy-sa-db

    gcloud iam service-accounts create my-sa-web \
        --display-name "webserver service account"
    
    gcloud iam service-accounts create my-sa-db \
        --display-name "database service account"
    
  2. 项目 OWNER 通过设置 Identity and Access Management (IAM) 政策,为服务帐号 my-sa-web 的网络服务器开发者 web-dev@example.com 分配了 serviceAccountUser 角色。

    gcloud iam service-accounts add-iam-policy-binding \
       my-sa-web@my-project.iam.gserviceaccount.com \
       --member='user:web-dev@example.com' \
       --role='roles/iam.serviceAccountUser'
    
  3. 项目 OWNER 通过设置 IAM 政策针对服务帐号 my-sa-db 为数据库开发者“db-dev@example.com”分配 serviceAccountUser 角色。

    gcloud iam service-accounts add-iam-policy-binding \
       my-sa-db@my-project.iam.gserviceaccount.com \
       --member='user:db-dev@example.com' \
       --role='roles/iam.serviceAccountUser'
    
  4. 具有 Instance Admin 角色的开发者 web-dev@example.com 创建 Web 服务器实例模板,并授权实例以服务帐号 my-sa-web 的身份运行。

    gcloud compute instance-templates create [INSTANCE_TEMPLATE_NAME]  \
        --service-account my-sa-web@my-project-123.iam.gserviceaccount.com
    
  5. 具有 Instance Admin 角色的开发者 db-dev@example.com 创建数据库实例模板,并授权实例以服务帐号 my-sa-db 的身份运行。

    gcloud compute instance-templates create [INSTANCE_TEMPLATE_NAME] \
        --service-account my-sa-db@my-project-123.iam.gserviceaccount.com
    
  6. Security Admin 使用服务帐号创建防火墙规则,允许流量 TCP:1443 从服务帐号 my-sa-web 流向服务帐号 my-sa-db

    gcloud compute firewall-rules create FIREWALL_NAME \
        --network network_a \
        --allow TCP:1443 \
        --source-service-accounts my-sa-web@my-project.iam.gserviceaccount.com \
        --target-service-accounts my-sa-db@my-project.iam.gserviceaccount.com
    

问题排查

创建或更新防火墙规则时出现错误消息

您可能会看到以下某条错误消息:

  • Should not specify destination range for ingress direction.

    目标地址范围不是入站防火墙规则的有效参数。 除非明确指定方向为 egress,否则防火墙规则假定为入站规则。如果您创建的规则未指定方向,则该规则为入站规则,此类规则不允许使用目标范围。此外,对出站规则来说,来源范围也是无效参数。

  • Firewall direction cannot be changed once created.

    现有防火墙规则的方向无法更改。您必须使用正确的参数创建新规则,然后删除旧规则。

  • Firewall traffic control action cannot be changed once created.

    现有防火墙规则的操作无法更改。您必须使用正确的参数创建新规则,然后删除旧规则。

  • Service accounts must be valid RFC 822 email addresses. 防火墙规则中指定的服务帐号必须采用符合 RFC 822 规范的电子邮件地址格式。

    gcloud compute firewall-rules create bad --allow tcp --source-service-accounts invalid-email
    
    Creating firewall...failed.
    ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource:
    – Invalid value for field 'resource.sourceServiceAccounts[0]': 'invalid-email'. Service accounts must be valid RFC 822 email addresses.
    
  • ServiceAccounts and Tags are mutually exclusive and can't be combined in the same firewall rule. 您不能在同一条规则中同时指定服务帐号和标记。

    gcloud compute firewall-rules create bad --allow tcp --source-service-accounts test@google.com --target-tags target
    
    Creating firewall...failed.
     ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource:
    – ServiceAccounts and Tags are mutually exclusive and can't be combined in the same firewall rule.
    

无法连接到虚拟机实例

如果无法连接到虚拟机实例,请检查您的防火墙规则。

  1. 如果您是从其他虚拟机实例发起连接,请列出该实例的出站防火墙规则。

    gcloud compute firewall-rules list --filter network=[NETWORK-NAME] \
        --filter EGRESS \
        --sort-by priority \
        --format="table(
            name,
            network,
            direction,
            priority,
            sourceRanges.list():label=SRC_RANGES,
            destinationRanges.list():label=DEST_RANGES,
            allowed[].map().firewall_rule().list():label=ALLOW,
            denied[].map().firewall_rule().list():label=DENY,
            sourceTags.list():label=SRC_TAGS,
            sourceServiceAccounts.list():label=SRC_SVC_ACCT,
            targetTags.list():label=TARGET_TAGS,
            targetServiceAccounts.list():label=TARGET_SVC_ACCT
            )"
    
  2. 检查目标 IP 是否被任何出站规则拒绝。优先级最高的规则(优先级数值最小)将替换优先级较低的规则。如果两个规则的优先级相同,则拒绝规则优先。

  3. 检查目标虚拟机实例所在网络的入站防火墙规则。

    gcloud compute firewall-rules list --filter network=[NETWORK-NAME] \
        --filter INGRESS \
        --sort-by priority \
        --format="table(
            name,
            network,
            direction,
            priority,
            sourceRanges.list():label=SRC_RANGES,
            destinationRanges.list():label=DEST_RANGES,
            allowed[].map().firewall_rule().list():label=ALLOW,
            denied[].map().firewall_rule().list():label=DENY,
            sourceTags.list():label=SRC_TAGS,
            sourceServiceAccounts.list():label=SRC_SVC_ACCT,
            targetTags.list():label=TARGET_TAGS,
            targetServiceAccounts.list():label=TARGET_SVC_ACCT
            )"
    

    示例输出。您的输出取决于防火墙规则列表。

    NAME                    NETWORK  DIRECTION  PRIORITY  SRC_RANGES    DEST_RANGES  ALLOW                         DENY  SRC_TAGS  SRC_SVC_ACCT      TARGET_TAGS  TARGET_SVC_ACCT
    default-allow-icmp      default  INGRESS    65534     0.0.0.0/0                  icmp
    default-allow-internal  default  INGRESS    65534     10.128.0.0/9               tcp:0-65535,udp:0-65535,icmp
    default-allow-rdp       default  INGRESS    65534     0.0.0.0/0                  tcp:3389
    default-allow-ssh       default  INGRESS    65534     0.0.0.0/0                  tcp:22
    firewall-with-sa        default  INGRESS    1000                                 tcp:10000                                     test1@google.com               target@google.com
    
  4. 此外,如果流量被任何入站流量或出站流量防火墙规则丢弃,您还可以在某个 VPC 网络中的虚拟机实例与其他 VPC 网络或非 Google Cloud 网络之间运行连接测试,以便排查问题。如需详细了解如何运行连接测试以排查各种场景问题,请参阅运行连接测试

我的防火墙规则是否处于启用状态?

要了解某条防火墙规则是否处于启用状态,请查看防火墙规则详情

Google Cloud Console 中的实施下,查找 EnabledDisabled

gcloud 命令行工具输出中,查找 disabled 字段。 如果该字段显示 disabled:false,则表明规则已启用且正在实施。如果该字段显示 disabled: true,则表明规则已停用。

虚拟机实例上正应用哪些路由?

假设您将新的防火墙规则添加到 VPC 网络,以允许流量通过 tcp:1433 进入 IP 地址为 10.1.2.3 的数据库服务器。创建规则后,您可以检查它是否在特定实例上得到正确应用。 如需了解详情,请参阅列出虚拟机实例网络接口的防火墙规则

在以下示例中,控制台在此虚拟机实例的出站流量分析标签页中列出了 database-access 规则,这意味着系统允许流向目的地端口 143310.1.2.3 出站流量。由于 deny-database-subnet 防火墙规则,10.1.0.0/16 范围内的其他出站流量被阻止。

虚拟机实例允许的出站流量(点击放大)
虚拟机实例允许的出站流量(点击可放大)

使用来源标记的防火墙规则不会立即生效

使用来源标记的入站防火墙规则可能需要一段时间才能生效。如需了解详情,请参阅与入站防火墙规则的来源标记相关的注意事项

后续步骤