配置网络标记

网络标记是您可以添加到 Compute Engine 虚拟机 (VM) 实例中的文本属性。利用标记,您可以将防火墙规则路由应用于特定虚拟机实例。

您只能向虚拟机实例或实例模板添加网络标记,而无法为其他 GCP 资源添加标记。您可以在创建新实例时为其分配网络标记,也可以稍后随时修改已分配的标记集。可以在不停止实例的情况下修改网络标记。

规格

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

权限

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

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

限制

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

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

防火墙规则和路由

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

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

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

防火墙规则的目标

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

目标标记定义应用该规则的目标 GCP 虚拟机。该规则将应用于具有匹配网络标记的任何实例的主要内部 IP 地址。

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

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

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

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

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

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

入站防火墙规则的来源标记可将流量来源定义为来自具有匹配网络标记的任何实例的主要内部 IP 地址。

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

与路由的交互方式

创建路由时,您可以指定标记,让路由仅应用于从具有匹配网络标记的实例的主要内部 IP 地址发送的流量。

添加和移除标记

添加标记

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 请求来设置与实例关联的网络标记。与使用 GCP Console 或 gcloud 命令不同,通过直接 API 请求来更新标记不会保留任何现有标记。以这种方式更新标记时,请务必指定应与实例关联的整组标记。

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

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

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

    GET https://www.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://www.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,
    ...
    }
    

后续步骤