使用防火墙规则

本文介绍了用于处理防火墙规则的命令,还提供了一些命令用法示例。要详细了解防火墙规则,请参阅防火墙规则概览

创建防火墙规则

如果您不熟悉 GCP 中的防火墙规则,请参阅防火墙规则组件。防火墙规则是在网络一级定义的,仅会应用到其所在的网络;但是,您为每条规则选择的名称在项目中必须是唯一的。

Console

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

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

    • 定义特定协议和端口:

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

  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] \
    [--source-ranges [CIDR-RANGE][,CIDR-RANGE…]] \
    [--source-tags [TAG][,TAG,...]] \
    [--source-service-accounts=[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] (requires `gcloud beta`)

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

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

更新防火墙规则

您可以修改防火墙规则的任何组件,但其名称、网络、对匹配项执行的操作流量方向除外。

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

Console

  1. 转到 Google Cloud Platform 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] (requires `gcloud beta`)

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

列出 VPC 网络的防火墙规则

Console

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

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

  1. 转到 Google Cloud Platform 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]
        )"

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

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

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

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

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

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

要查看某个虚拟机实例特定网络接口正使用的规则,请执行以下操作:

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

查看防火墙规则详情

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

Console

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

gcloud

以下命令可列出某个防火墙规则的详情。请将 [FIREWALL_RULE_NAME] 替换为防火墙规则的名称。防火墙规则名称在项目中是唯一的,因此您在列出现有规则的详情时不必指定网络。

gcloud compute firewall-rules describe [FIREWALL_RULE_NAME]

删除防火墙规则

Console

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

gcloud

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

gcloud compute firewall-rules delete [FIREWALL_RULE_NAME]

监控防火墙规则

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

配置示例

下图是一个防火墙配置示例。在该示例中,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. 创建一条防火墙规则,拒绝所有入站 TCP 流量进入带有 webserver 标记的实例。

    gcloud compute firewall-rules create deny-subnet1-webserver-access \
        --network my-network \
        --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 my-network \
        --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 my-network \
        --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 my-network \
        --action allow \
        --direction egress \
        --rules tcp:80 \
        --destination-ranges 192.168.10.2/32 \
        --priority 60
    

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

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

gcloud compute firewall-rules create vm1-allow-egress-tcp-port443-to-192-0-2-5 \
    --network my-network \
    --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 my-network \
    --action allow \
    --direction ingress \
    --rules tcp:22 \
    --source-tags database \
    --priority 80 \
    --target-tags webserver

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

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

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

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

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

  1. 项目编辑者或项目所有者创建服务帐号 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. 项目所有者通过设置 IAM 政策,为网络服务器开发者 web-dev@example.com 的服务帐号 my-sa-web 分配 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. 项目所有者通过设置 IAM 政策,为数据库开发者“db-dev@example.com”的服务帐号 my-sa-db 分配 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. 拥有实例管理员角色的开发者 web-dev@example.com 创建网络服务器实例模板,并授权实例以服务帐号 my-sa-web 的身份运行。

    gcloud compute instance-templates create [INSTANCE_TEMPLATE_NAME]  \
        --service-account my-sa-web@my-project-123.iam.gserviceaccount.com
    
  5. 拥有实例管理员角色的开发者 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. 安全管理员使用服务帐号创建防火墙规则,允许流量 TCP:1443 从服务帐号 my-sa-web 流向服务帐号 my-sa-db

    gcloud compute firewall-rules create [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
      

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

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

    Google Cloud Platform Console 中的执行下查找 EnabledDisabled

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

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

    想象一下,您将新的防火墙规则添加到 VPC 网络,该网络允许通过 tcp:143310.1.2.3 上的数据库服务器传输流量。创建规则后,您可以检查它是否在特定实例上得到正确应用。有关详情,请参阅列出虚拟机实例网络接口的防火墙规则

    在以下示例中,Console 在此虚拟机实例的出站分析标签中列出了 database-access 规则,这意味着端口 1433 上允许 10.1.2.3 出站流量。由于 deny-database-subnet 防火墙规则,10.1.0.0/16 范围内的其他出站流量被阻止。

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

    后续事项

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

    发送以下问题的反馈:

    此网页