添加网络标记

标记只是添加到资源中“标记”字段的字符串,例如 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 网络中具有匹配网络标记的虚拟机发送的流量。

添加、查看和移除标记

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

在创建虚拟机时添加标记

控制台

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

gcloud

如需为实例分配新标记,请使用以下 gcloud 命令。

gcloud compute instances create INSTANCE_NAME \
    --zone ZONE \
    --tags TAGS \
    ...other parameters as needed.

替换以下内容:

  • INSTANCE_NAME:实例的名称。
  • ZONE:实例的可用区。
  • TAGS:以英文逗号分隔的标记列表。

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

Terraform

您可以使用 Terraform 资源创建带有网络标记的虚拟机实例。

resource "google_compute_instance" "default" {
  project      = var.project_id # Replace this with your project ID in quotes
  zone         = "southamerica-east1-b"
  name         = "backend-instance"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    network = "default"
  }
  tags = ["health-check", "ssh"]
}

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

为现有虚拟机添加标记

控制台

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

gcloud

如需为实例分配新标记,请使用以下 gcloud 命令。

gcloud compute instances add-tags INSTANCE_NAME \
    --zone ZONE \
    --tags TAGS

替换以下内容:

  • INSTANCE_NAME:实例的名称。
  • ZONE:实例的可用区。
  • TAGS:以英文逗号分隔的标记列表。

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

查看标记

控制台

  1. 转到“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 查看网络标记列中的标记。

    如果需要,请点击列显示选项以添加网络标记列。

  3. 如需查看使用特定标记进行了标记的实例,请在过滤条件中选择网络标记属性,然后输入要过滤的标记。

gcloud

如需列出实例及其标记,请运行以下命令:

gcloud compute instances list --format='table(name,status,tags.list())'

如需列出使用特定标记进行了标记的实例,请运行以下命令:

gcloud compute instances list --filter='tags:TAG_EXPRESSION'

替换以下内容:

  • TAG_EXPRESSION:要过滤的表达式。例如 tag1tag1 OR tag2tag1 AND tag2。如需详细了解如何过滤输出,请参阅 gcloud 主题过滤条件

移除标记

控制台

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

gcloud

如需从实例中移除标记,请使用以下 gcloud 命令。

gcloud compute instances remove-tags INSTANCE_NAME \
    --zone ZONE \
    --tags TAGS

替换以下内容:

  • INSTANCE_NAME:实例的名称。
  • ZONE:实例的可用区。
  • TAGS:以英文逗号分隔的标记列表。

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

直接 API 请求

您可以通过发出直接 API 请求来设置与实例关联的网络标记。与使用 Google Cloud 控制台或 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,
    ...
    }
    

后续步骤