配置网络标记

标记只是添加到资源中“标记”字段的字符串,例如 Compute Engine 虚拟机实例或实例模板。标记不是单独的资源,因此无法单独创建它。具有该字符串的所有资源都被视为具有该标记。利用标记,您可以将防火墙规则路由应用于特定虚拟机实例。

您可以在创建时为新虚拟机分配网络标记,也可以稍后随时修改已分配的标记集。修改网络标记时,无需停止虚拟机。

规范

分配给实例的网络标记适用于该实例的所有网络接口。网络标记仅适用于直接连接到实例的网络接口的 VPC 网络。即使对于 VPC 网络对等互连也是如此,因为对等互连的网络仍然是不同的网络。因此,网络标记仅在实例的网络接口连接到的网络中才有意义。

网络标记必须以小写字母开头,可以包含小写字母、数字和连字符,必须是小写字母或数字结尾。

权限

本页讨论的任务需要以下 IAM 角色。如需了解详情,请参阅 Compute Engine IAM 角色

任务 所需的角色
在创建新实例后为其分配网络标记 Project Owner 或 Editor,或者 Instance Admin
为现有实例添加或移除网络标记
添加、移除或修改防火墙规则 Project Owner 或 Editor,或者 Security Admin

限制

以下限制适用于网络标记:

限制 说明
每台虚拟机的标记数上限 64 虚拟机的所有标记必须是唯一的。您可以为每台虚拟机最多分配 64 个不同的标记。
每个标记的字符数上限 63
标记可接受的字符 小写字母、数字、短划线 此外:
• 标记必须以小写字母开头。
• 标记必须以数字或小写字母结尾。

防火墙规则和路由

利用网络标记,您可以将防火墙规则和路由应用于特定实例或实例集:

  • 您可以使用目标标记和来源标记将防火墙规则应用于特定实例。

  • 您可以使用标记将路由应用于特定实例。

防火墙规则的目标

Google Cloud 中的每个防火墙规则都必须有一个目标,用于定义要应用该规则的实例。默认目标是网络中的所有实例,但您可以使用目标标记或目标服务帐号将实例指定为目标。

目标标记定义将应用该规则的 Google Cloud 虚拟机。该规则适用于特定的 VPC 网络。它适用于与任何实例(连接到具有匹配网络标记的那个 VPC 网络)的网络接口关联的主要内部 IP 地址。

入站和出站防火墙规则都具有目标:

  • 入站规则应用于进入您的 VPC 网络的流量。 对于入站规则,目标为 Google Cloud 中的目的地虚拟机。

  • 出站规则应用于离开 VPC 网络的流量。 对于出站规则,目标是 Google Cloud 中的来源虚拟机。

考虑允许来自任何来源的 TCP 端口 80 上的流量的入站防火墙规则。该规则的目标标记为 http-server。该规则仅应用于具有 http-server 网络标记的实例,这意味着端口 80 上的传入流量可以进入这些实例。

入站防火墙规则的来源过滤条件

创建入站防火墙规则时,您必须指定来源。您可以使用内部或外部 IP 地址范围或通过引用特定实例来定义来源。您可以使用来源标记或来源服务帐号指定实例。

在 VPC 网络上应用的入站防火墙规则的来源标记可将流量来源定义为来自与网络接口(连接到具有匹配网络标记的任何实例的那个 VPC 网络)相关联的主要内部 IP 地址。

您可以使用 IP 范围和来源标记的组合,也可以使用 IP 范围和来源服务帐号的组合。您不能在同一条规则中同时使用网络标记和服务帐号。如需详细了解来源标记和服务帐号,请参阅按服务帐号过滤与按网络标记过滤

注意事项

如果您将入站防火墙规则与来源标记配合使用,则可能会出现传播延迟。此延迟通常为几秒钟,但在极少数情况下,可能会达到几分钟。当您进行以下更改时,入站防火墙规则可能需要一段时间才能应用到关联的实例或从关联的实例中移除:

  • 启动或停止具有与规则的来源标记关联的标记的实例
  • 启动具有与规则的目标标记关联的标记的实例
  • 如果在规则的来源字段或目标字段中使用了标记,则可以在实例中添加或移除标记
  • 在规则中添加或移除来源标记或目标标记

此传播延迟仅适用于使用来源标记的入站规则。所有其他防火墙规则都会立即在实例上生效。例如,使用来源 IP 地址范围和目标标记的入站规则不会出现传播延迟。

与路由的交互方式

创建路由时,您需要指定 VPC 网络,并且可以指定标记,以便路由仅适用于从网络接口(连接到具有匹配网络标记的实例的那个 VPC 网络)的主要内部 IP 地址发送的流量。

添加和移除标记

您可以在创建虚拟机实例时指定网络标记。您还可以向现有虚拟机添加标记,以及从现有虚拟机中移除标记。

在创建虚拟机时添加标记

Console

  1. 转到“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击创建实例
  3. 点击管理、安全、磁盘、网络、单独租用以打开该部分。
  4. 点击网络标签页。
  5. 网络标记字段中,指定一个或多个标记(以英文逗号分隔)。
  6. 为虚拟机填充其他字段。
  7. 点击创建

gcloud

如需为实例分配新标记,请使用以下 gcloud 命令。 将 [INSTANCE-NAME] 替换为实例名称,将 [ZONE] 替换为实例所在可用区,将 [TAGS] 替换为以英文逗号分隔的字符串列表:

gcloud compute instances create [INSTANCE-NAME] \
    --zone [ZONE] \
    --tags [TAGS] \
    ...other parameters as needed.

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

向现有虚拟机添加标记

Console

  1. 转到“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击实例名称。
  3. 在“虚拟机实例详情”页面上,点击修改
  4. 网络标记部分中,指定一个或多个标记(以英文逗号分隔)。
  5. 点击保存

gcloud

如需为实例分配新标记,请使用以下 gcloud 命令。 将 [INSTANCE-NAME] 替换为实例名称,将 [ZONE] 替换为实例所在可用区,将 [TAGS] 替换为以英文逗号分隔的字符串列表:

gcloud compute instances add-tags [INSTANCE-NAME] \
    --zone [ZONE] \
    --tags [TAGS]

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

移除标记

Console

  1. 转到“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击实例名称。
  3. 在“虚拟机实例详情”页面上,点击修改
  4. 网络标记部分,点击移除图标 (X) 以移除标记。
  5. 点击保存

gcloud

如需从实例中移除标记,请使用以下 gcloud 命令。 将 [INSTANCE-NAME] 替换为实例名称,将 [ZONE] 替换为实例所在的可用区,将 [TAGS] 替换为以英文逗号分隔的待移除标记列表:

gcloud compute instances remove-tags [INSTANCE-NAME] \
    --zone [ZONE] \
    --tags [TAGS]

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

直接 API 请求

您可以通过发出直接 API 请求来设置与实例关联的网络标记。与使用 Cloud Console 或 gcloud 命令不同,通过直接 API 请求更新标记时不会保留任何现有标记。以这种方式更新标记时,请务必指定应与实例关联的整组标记。

要使用直接 API 请求来更新标记,请执行以下操作:

  1. 确定与这些标记关联的最新指纹。指纹用于防止同时发出的 API 请求之间发生冲突。更新实例的网络标记的过程与更新实例元数据类似。

    对实例执行 GET 请求;例如:

    GET https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/example-instance
    

    在响应中寻找 tags.fingerprint 属性:

    200 OK
    {
    ...
    "tags": {
     "items": [
     "http-server",
     "db-client"
     ],
     "fingerprint": "MW8EqhxILtc="
    },
    ...
    }
    

    您还可以使用 gcloud 命令获取 fingerprint,如以下示例所示:

    gcloud compute instances describe [INSTANCE-NAME] \
       --zone [ZONE] \
       --format="get(tags.fingerprint)"
  2. instance().setTags 方法发出 POST 请求。请求正文必须包含应与实例关联的所有标记以及 fingerprint 值。

    示例请求:

    POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/example-instance/setTags
    {
     "items": [
      "http-server",
      "db-client",
      "allow-internet-access"
      ],
     "fingerprint": "MW8EqhxILtc="
    }
    

    示例响应:

    200 OK
    {
          "kind": "compute#operation",
          "id": "9251830049681941507",
          "name": "operation-1442414898862-51fde63aa57b1-422323e0-c439fb04",
          "zone": "https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f",
          "operationType": "setTags",
          "targetLink": "https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/example-instance",
          "targetId": "4392196237934605253",
          "status": "PENDING",
          "user": "user@example.com",
          "progress": 0,
    ...
    }
    

后续步骤