保留静态外部 IP 地址

本页面介绍如何为您的资源配置和管理静态外部 IP 地址,包括:

  • 保留和分配静态外部 IP 地址
  • 将临时外部 IP 地址升级为静态外部 IP 地址

在 Compute Engine 中,每个虚拟机实例都可以有多个网络接口。每个接口可以同时拥有内部和外部 IP 地址。转发规则可以将外部 IP 地址用于外部负载平衡,或将内部地址用于内部负载平衡。如需了解 IP 地址,请参阅 IP 地址文档。

本文档未介绍如何保留和管理内部 IP 地址。要保留静态内部 IP 地址,请参阅保留静态内部地址

准备工作

保留新的静态外部 IP 地址

静态外部 IP 地址是为项目保留的外部 IP 地址(直到您决定将其释放)。如果您拥有一个您的客户或用户用于访问您的服务的 IP 地址,您可以保留该 IP 地址,以使该 IP 地址只用于您的项目。此外,还可以将临时外部 IP 地址升级为静态外部 IP 地址。

您可以保留两种类型的外部 IP 地址:

可借助 gcloud 命令行工具或者通过 API 保留静态外部 IP 地址。保留该地址后,请在创建实例的过程中将其分配给实例,或者将其分配给现有实例

限制

  • 一个静态外部 IP 地址一次只能供一个资源使用。

  • 一个 IP 地址分配给一个资源后,除非将该 IP 地址与为该项目保留的静态外部 IP 地址列表进行比较,否则无法分辨该 IP 地址是静态地址还是临时地址。可使用 addresses list 子命令查看该项目可用的静态外部 IP 地址列表。

  • 每个虚拟机实例都可以有多个网络接口,但每个接口只能有一个外部 IP 地址(临时或静态)。

注意:网络接口可以接收来自多个转发规则的流量,这些转发规则可以用于其他外部 IP 地址。任意数量的外部 IP 地址都可以通过这些转发规则来引用某个网络接口,但每个网络接口只能拥有一个可将数据包转换成该接口的内部 IP 地址的外部 IP 地址。

如需详细了解负载平衡和转发规则,请参阅负载平衡文档。

Console

  1. 转到 GCP Console 中的“保留静态地址”页面。

    转到“保留静态地址”页面

  2. 为新地址选择一个名称。
  3. 指定该地址为 IPv4 地址还是 IPv6 地址。IPv6 地址只能是全局地址,并且只能与全局 HTTP(S)、SSL 代理和 TCP 代理负载平衡器一起使用。
  4. 选择此 IP 地址是区域地址还是全局地址。如果您要为实例或网络负载平衡器保留静态 IP 地址,请选择区域。如果您要为 HTTP(S)、SSL 代理或 TCP 代理负载平衡器保留静态 IP 地址,请选择全局
  5. 如果该地址为区域 IP 地址,请选择要在其中创建地址的区域。
  6. [可选] 选择一个资源来附加该 IP。
  7. 点击保留以保留该 IP。

gcloud

要借助 gcloud compute 保留一个新的静态外部 IP 地址,请使用 addresses create 子命令并指定要保留全局 IP 地址还是区域 IP 地址:

gcloud compute addresses create [ADDRESS_NAME] \
    [--region [REGION] | --global ] \
    [--ip-version [IPV4 | IPV6]]

其中:

  • [ADDRESS_NAME] 是您为此地址指定的名称。
  • 如果您正在指定一个区域 IP 地址,请为该请求提供期望的 [REGION]。该区域应与您要将该 IP 地址附加到的资源相同。
  • 如果该地址为全局 IP 地址,请指定 --global 标志。如果您需要一个 IPv6 地址,请指定 --global--ip-version IPV6 标志。 IPv6 地址只能是全局地址,并且只能与全局 HTTP(S)、SSL 代理和 TCP 代理负载平衡器一起使用。

API

要直接向 API 发出请求以获取区域 IPv4 地址,请向以下 URI 发出 POST 请求:

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/addresses

请求正文应包含以下内容:

{
  name: "[ADDRESS_NAME]"
}

其中:

  • [ADDRESS_NAME] 是您为此地址指定的名称。
  • [REGION] 是此请求对应的区域名称。
  • [PROJECT_ID] 是此请求的项目 ID。

对于全局静态 IPv4 地址,请向以下 URI 发出请求:

    https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses

请求正文应包含以下内容:

{
  name: "[ADDRESS_NAME]"
}

对于全局静态 IPv6 地址,请向以下 URI 发出请求:

    https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses

请求正文应包含以下内容:

{
  "name": "[ADDRESS_NAME]",
  "ipVersion": "IPV6"
}

为新的虚拟机实例分配静态外部 IP 地址

您在创建虚拟机实例时,系统会自动为其分配一个临时外部 IP 地址。如果您不想使用临时外部 IP 地址,可以明确地为该实例分配一个静态外部 IP 地址。

Console

  1. In the GCP Console, go to the VM Instances page.

    Go to the VM Instances page

  2. Click Create instance.
  3. On the Create a new instance page, fill in the desired properties for your instance.
  4. 展开管理、磁盘、网络和 SSH 密钥部分。
  5. 点击网络
  6. 外部 IP 下方,选择一个静态外部 IP 地址。
  7. Click Create to create the instance.

gcloud

要分配一个静态外部 IP 地址,请在创建实例的过程中使用 --address 标志并提供该静态外部 IP 地址:

gcloud compute instances create [INSTANCE_NAME] --address [IP_ADDRESS]

其中:

  • [INSTANCE_NAME] 是实例的名称。
  • [IP_ADDRESS] 是分配给该实例的 IP 地址。请使用 IP 地址,而非地址名称。

API

在您用于创建新实例的请求中,请明确提供您要使用的 networkInterfaces[].accessConfigs[].natIP 属性和外部 IP。例如:

{
  "name": "[INSTANCE_NAME]",
  "machineType": "zones/[ZONE]/machineTypes/[MACHINE_TYPE]"
  "networkInterfaces": [{
    "accessConfigs": [{
      "type": "ONE_TO_ONE_NAT",
      "name": "External NAT",
      "natIP": "[IP_ADDRESS]"
     }],
    "network": "global/networks/default"
  }],
  "disks": [{
     "autoDelete": "true",
     "boot": "true",
     "type": "PERSISTENT",
     "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/v20150818"
     }
   }]
 }

为现有实例更改或分配外部 IP 地址

您可以通过修改现有实例的访问配置,来为该实例更改或分配外部 IP 地址(临时或静态)。

一个实例只能有一个外部 IP 地址。如果实例已有一个外部 IP 地址,您必须先移除该地址,只需删除旧的访问配置即可。然后,您就可以添加使用新外部 IP 地址的新访问配置了。

Console

  1. 转到 GCP Console 中的“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击要为其分配外部 IP 地址的实例的名称。
  3. 点击页面顶部的修改按钮。
  4. 外部 IP 下方,选择要为该实例分配的临时或静态外部 IP 地址。
  5. 点击保存按钮,以保存您的更改。

gcloud

  1. [可选] 保留静态外部 IP 地址。

    如果要分配一个静态外部 IP 地址,必须保留一个地址并确保该地址当前未被其他资源使用。如有必要,请按照说明进行操作,以保留新的静态外部 IP 地址取消分配静态外部 IP 地址

    如果打算使用临时外部 IP 地址,可以跳过此步骤,Compute Engine 会随机分配一个临时外部 IP 地址。

  2. 删除现有的访问配置。

    一个实例只能有一个访问配置。在尝试为实例分配新的访问配置之前,请通过发出 gcloud compute instances describe 请求来检查您的实例是否具有访问配置:

    gcloud compute instances describe [INSTANCE_NAME]
    

    如果存在现有的访问配置,则访问配置将以如下格式显示:

    networkInterfaces:
    - accessConfigs:
      - kind: compute#accessConfig
        name: external-nat
        natIP: 130.211.181.55
        type: ONE_TO_ONE_NAT

    在添加新的访问配置之前,必须使用 instances delete-access-config 子命令删除现有访问配置:

    gcloud compute instances delete-access-config [INSTANCE_NAME] \
        --access-config-name "[ACCESS_CONFIG_NAME]"
    

    其中:

    • [INSTANCE_NAME] 是实例的名称。
    • [ACCESS_CONFIG_NAME] 是要删除的访问配置。请确保将全名包含在引号之间。
  3. 添加新的外部 IP 地址。

    使用 instances add-access-config 子命令添加新的外部 IP 地址:

    注意:请勿将 [IP_ADDRESS] 替换为静态 IP 的名称。您必须使用实际 IP 地址。

    gcloud compute instances add-access-config [INSTANCE_NAME] \
        --access-config-name "[ACCESS_CONFIG_NAME]" --address [IP_ADDRESS]
    

    其中:

    • [INSTANCE_NAME] 是实例的名称。
    • [ACCESS_CONFIG_NAME] 是此访问配置的名称。请确保将全名包含在引号之间。
    • [IP_ADDRESS] 是要添加的 IP 地址。

    如果您希望 Compute Engine 分配临时外部 IP 地址,而非使用静态外部 IP 地址,请忽略 --address [IP_ADDRESS] 属性:

    gcloud compute instances add-access-config [INSTANCE_NAME] \
        --access-config-name "[ACCESS_CONFIG_NAME]"
    

升级临时外部 IP 地址

如果您的实例具有临时外部 IP 地址,并且您想将该 IP 永久分配给您的项目,请将该临时外部 IP 地址升级为静态外部 IP 地址。

Console

  1. 转到 GCP Console 中的“外部 IP 地址”页面。

    转到“外部 IP 地址”页面

  2. 类型列中,将要升级的 IP 地址的地址类型更改为静态
  3. 为新的静态 IP 地址提供一个名称,然后点击保留

gcloud

要将临时外部 IP 地址升级为静态外部 IP 地址,请在创建新地址时使用 --addresses 标志提供临时外部 IP 地址:

gcloud compute addresses create [ADDRESS_NAME] \
    --addresses [IP_ADDRESS] --region [REGION]

其中:

  • [ADDRESS_NAME] 是您为此地址指定的名称。
  • [IP_ADDRESS] 是您要升级的 IP 地址。
  • [REGION] 是 IP 地址所属的区域。

API

要直接向 API 发出请求,请向以下 URI 发出 PUT 请求:

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/addresses

请求正文应包含以下内容:

{
  name: "[ADDRESS_NAME]",
  address: "[IP_ADDRESS]"
}

其中:

  • [ADDRESS_NAME] 是您为此地址指定的名称。
  • [IP_ADDRESS] 是您要升级的 IP 地址。
  • [REGION] 是 IP 地址所属的区域。
  • [PROJECT_ID] 是此请求对应的项目 ID。

在外部 IP 地址升级为静态外部 IP 地址后,该地址仍然会附加到该实例。如果您需要将这个新升级的静态外部 IP 地址分配给另一个资源,请取消分配给现有实例的静态外部 IP 地址

列出静态外部 IP 地址

要列出您为项目保留的静态外部 IP 地址,请运行 addresses list 或向 API 发出 GET 请求。

Console

转到 GCP Console 中的“外部 IP 地址”页面,查看项目的 IP 地址列表。

转到“外部 IP 地址”页面

gcloud

使用 gcloud 命令行工具:

gcloud compute addresses list

API

要直接向 API 发出请求,请向以下 URI 发出 GET 请求(其中请求正文为空):

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/addresses

其中:

  • [REGION] 是此请求对应的区域名称。
  • [PROJECT_ID] 是此请求对应的项目 ID。

要列出所有区域中的所有地址,请向以下 URI 发出请求:

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/aggregated/addresses

描述静态外部 IP 地址

要获取静态外部 IP 地址的信息,请使用 gcloud compute addresses describe 命令并提供地址名称,或者向 API 发出 GET 请求。

Console

  1. 转到 GCP Console 中的“外部 IP 地址”页面。

    转到“外部 IP 地址”页面

  2. 点击要详细了解的 IP 地址。

gcloud

使用 gcloud compute addresses describe

gcloud compute addresses describe [ADDRESS_NAME]

其中,[ADDRESS_NAME] 是您要描述的外部 IP 地址的名称。

API

要直接向 API 发出请求,请向以下 URI 发出 GET 请求(其中请求正文为空):

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/addresses/[ADDRESS_NAME]

其中:

  • [ADDRESS_NAME] 是 IP 地址的名称。
  • [REGION] 是此请求对应的区域名称。
  • [PROJECT_ID] 是此请求对应的项目 ID。

取消分配静态外部 IP 地址

您可以取消分配静态外部 IP 地址,只需删除实例,或者删除附加到使用该地址的实例的访问配置即可。通过取消分配静态外部 IP 地址,您可以将静态外部 IP 地址重新分配给另一个资源。

取消分配某个 IP 地址后,系统会将其从资源中移除,但会保留为您的项目保留的 IP 地址。您可以通过执行 gcloud compute addresses list 请求来判断静态 IP 地址是否正被使用:

gcloud compute addresses list
NAME                 REGION      ADDRESS            STATUS
example-address      [REGION]    130.211.160.207    RESERVED
example-address-new  [REGION]    130.211.114.137    IN_USE

在此示例中,example-address-new 目前正被使用。

要删除实例的访问配置并取消分配静态外部 IP 地址,请按照以下步骤进行操作:

  1. 获取要删除的访问配置的名称。

    要获取名称,请执行 gcloud compute instances describe 请求:

    gcloud compute instances describe [INSTANCE_NAME]
    

    其中 [INSTANCE_NAME] 是实例的名称。

    访问配置将以如下格式显示:

    networkInterfaces:
    - accessConfigs:
      - kind: compute#accessConfig
        name: external-nat
        natIP: 130.211.181.55
        type: ONE_TO_ONE_NAT

    注意:您的访问配置的name可能与 external-nat 不同;请务必检查您自己的访问配置名称。在某些情况下,系统可能会使用旧版的访问配置名称 External NAT

  2. 删除访问配置。

    使用 instances delete-access-config 子命令:

    gcloud compute instances delete-access-config [INSTANCE_NAME] \
        --access-config-name "[ACCESS_CONFIG_NAME]"
    

    其中:

    • [INSTANCE_NAME] 是实例的名称。
    • [ACCESS_CONFIG_NAME] 是要删除的访问配置的名称。请确保将全名包含在引号之间。
  3. 检查静态外部 IP 地址目前是否可以使用,以及是否标志为“RESERVED”而非“IN_USE”。

    gcloud compute addresses list
    

    NAME                 REGION      ADDRESS            STATUS
    example-address      [REGION]    130.211.160.207    RESERVED
    example-address-new  [REGION]    130.211.114.137    RESERVED

既然您的静态外部 IP 地址可以使用,那么您可以选择将其分配给另一个实例

释放静态外部 IP 地址

如果您不再需要某个静态外部 IP 地址,可以释放该地址,以便将其返回常规 IP 池中,供其他 Compute Engine 用户使用。

Console

  1. 转到 GCP Console 中的“外部 IP 地址”页面。

    转到“外部 IP 地址”页面

  2. 选中要释放的 IP 地址旁边的复选框。
  3. 点击释放 IP 地址

gcloud

使用 gcloud 命令行工具:

gcloud compute addresses delete [ADDRESS_NAME]

其中,[ADDRESS_NAME] 是 IP 地址的名称。

API

要直接向 API 发出请求,请向以下 URI 发出 DELETE 请求(其中请求正文为空):

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/addresses/[ADDRESS_NAME]

其中:

  • [ADDRESS_NAME] 是 IP 地址的名称。
  • [REGION] 是此请求对应的区域名称。
  • [PROJECT_ID] 是此请求对应的项目 ID。

在创建实例时选择内部 IP 地址

您可以在创建实例时,选择一个特定内部 IP 地址来分配给实例。IP 地址必须是实例子网的一个有效 IP 地址,并且不得被其他资源使用。在您删除实例以将 IP 地址释放回池中之前,此 IP 地址仍然会附加到该实例。如果您停止并重新启动实例,实例会保留相同的内部 IP 地址。

如果您没有指定 IP 地址,Compute Engine 会自动从子网或网络分配一个 IP 地址。您可以使用 gcloud 命令行工具或 API 指定内部 IP 地址。

gcloud

gcloud compute instances create [INSTANCE_NAME]
     --private-network-ip [IP_ADDRESS]

其中:

  • [INSTANCE_NAME] 是要创建的实例的名称。
  • [IP_ADDRESS] 是要分配的 IP 地址。

如果您正在使用自定义子网模式网络,还必须使用 --subnet [SUBNET] 参数指定子网。

API

要创建具有静态内部 IP 地址的实例,请使用 Compute Engine API。您可以像往常一样发出请求以创建新实例,但明确提供包含您要使用的内部 IP 的 networkInterfaces[].networkIP 属性。例如:

{
  "name": "[INSTANCE_NAME]",
  "machineType": "zones/us-central1-f/machineTypes/f1-micro"
  "networkInterfaces": [{
    "accessConfigs": [{
      "type": "ONE_TO_ONE_NAT",
      "name": "External NAT",
     }],
    "network": "global/networks/default",
    "networkIP": [IP_ADDRESS]
  }],
  "disks": [{
     "autoDelete": "true",
     "boot": "true",
     "type": "PERSISTENT",
     "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/v20150818"
     }
   }]
 }

其中:

  • [INSTANCE_NAME] 是实例的名称。
  • [IP_ADDRESS] 是分配给实例的 IP 地址。

如果您删除了具有指定 IP 地址的实例,该地址会被返回未分配的地址池中。如果您需要在实例生命周期结束后保留内部 IP 地址,可以保留静态内部 IP 地址

停用虚拟机实例对外部 IP 的使用权限

对于某些工作负载,您可能有安全和网络限制等方面的基本要求。例如,您可能想要限制虚拟机实例对外部 IP 地址的使用权限,以防止数据泄露或保持网络隔离,所有这些对许多客户来说都是常见且必要的限制。通过组织政策,您可以使用一个政策限制条件立即停用外部 IP 使用权限,该政策限制条件可让您简单方便地控制组织或项目内的虚拟机实例对外部 IP 地址的使用权限。

用于控制虚拟机实例的外部 IP 地址的限制条件为:

constraints/compute.vmExternalIpAccess

要使用限制条件,请指定一个包含 allowedList 列表的政策,该列表中列出了可以具有外部 IP 地址的虚拟机实例。如果未指定政策,所有虚拟机实例都可以使用所有外部 IP 地址。政策实施后,只有 allowedValues 列表中列出的虚拟机实例才能获得外部 IP 地址(临时或静态),组织或项目中其他未在政策中明确定义的 Compute Engine 虚拟机实例禁止使用外部 IP 地址。

在允许和拒绝列表中,通过实例的网址标识虚拟机:

projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]

规范

  • 您只能将此列表限制条件应用于虚拟机实例。
  • 您不能追溯应用限制条件。政策启用前,具有外部 IP 地址的所有虚拟机实例都将保留其外部 IP 地址。
  • 此限制条件接受 allowedListdeniedList,但不能在同一个政策中同时接受这两者。
  • 您或拥有适当权限的管理员有义务管理和维护实例生命周期和完整性。限制条件仅用于验证实例的网址,而不会阻止系统更改、删除或重新创建已列入白名单的虚拟机。

权限

要设置项目或组织层级的限制条件,您必须获得组织中的 orgpolicy.policyAdmin 角色。

设置组织层级的政策限制条件

要为外部 IP 访问设置限制条件,您首先需要查找组织 ID。

查找您的组织 ID

Console

您也可以在 Google Cloud Platform Console 上查找 ID:

  1. 登录 Google Cloud Platform Console
  2. 点击项目选择器。

    组织和项目选择器的屏幕截图

  3. 选择组织,然后查找组织 ID。

    组织 ID 的屏幕截图

gcloud

您可以查找数字 n,只需运行以下 gcloud 命令并查找 ID 即可:

gcloud organizations list

DISPLAY_NAME           ID
example-organization   29252605212

设置您的政策限制条件

Console

  1. 转到“组织政策”页面。

    转到“组织政策”页面

  2. 如有必要,请从项目下拉菜单中选择所需的组织。
  3. 点击虚拟机实例的外部 IP
  4. 点击修改以修改外部 IP 政策。
  5. 选择自定义,为特定的虚拟机实例设置具体的组织政策。

    自定义组织政策操作时的屏幕截图

  6. 选择所需的政策执行政策类型

  7. 政策值下方,选择自定义
  8. 输入虚拟机实例的一部分网址,然后按 Enter 键。根据需要继续输入虚拟机实例。

    将虚拟机实例添加到组织政策时的屏幕截图

  9. 点击保存以保存更改。

gcloud

使用 gcloud resource-manager org-policies set-policy 命令设置政策。您将需要以 JSON 文件的形式提供政策。创建一个与以下内容类似的 JSON 文件:

{
"constraint": "constraints/compute.vmExternalIpAccess",
"listPolicy": {
  "allowedValues": [
     "projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]",
     "projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]",
     "projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]"
  ]
 }
}

其中:

  • [PROJECT_ID] 是此请求对应的项目 ID,如 example-project。请注意,设置项目 ID 与设置组织政策不同,设置组织政策时需要使用组织数字 ID。
  • [ZONE] 是实例所在的地区。
  • [INSTANCE_NAME] 是实例名称。

或者,您可以指定 deniedValues 列表来指示您希望明确禁止其拥有外部 IP 地址的虚拟机实例。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定 allowedValuesdeniedValues,但不能同时指定这两者。

然后,使用 gcloud 请求传入文件:

gcloud beta resource-manager org-policies set-policy my-policy.json --organization [ORGANIZATION_ID]

其中 [ORGANIZATION_ID] 是组织的数字 ID。

如果您不希望任何实例具有外部 IP 访问权限,可以设置一个政策,并将 allValues 值为 DENY

{
"constraint": "constraints/compute.vmExternalIpAccess",
"listPolicy": {
  "allValues": "DENY"
 }
}

API

使用 setOrgPolicy() API 定义您的限制条件。您指定的 allowedValue 列表中的虚拟机将获准拥有外部 IP 地址。或者,您可以指定 deniedValues 列表来指示您想明确禁止其拥有外部 IP 地址的虚拟机实例。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定 allowedValuesdeniedValues,但不能同时指定这两者。

例如,以下是一个用于针对组织设置 compute.vmExternalIpAccess 限制条件的请求,设置该限制条件后,组织内某些项目中的虚拟机实例可以拥有外部 IP 地址:

POST https://cloudresourcemanager.googleapis.com/v1/organizations/[ORGANIZATION_ID]:setOrgPolicy

其中 [ORGANIZATION_ID] 是组织的数字 ID。

现在,在请求正文中,为此限制条件提供所需的政策:

{
  "policy": {
    "constraint": "constraints/compute.vmExternalIpAccess",
    "listPolicy": {
      "allowedValues": [
        "projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]",
        "projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]",
        "projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]"
        ]
      }
    }
 }

如果您不希望任何实例具有外部 IP 访问权限,可以设置一个政策,并将 allValues 值为 DENY

{
  "policy": {
    "constraint": "constraints/compute.vmExternalIpAccess",
    "listPolicy": {
      "allValues": DENY
      }
    }
 }

设置项目层级的政策

如果设置项目层级的政策,则该政策会替换组织层级的政策。例如,如果设置组织层级的政策时,在 allowedValues 列表中列出了 example-vm-1,但在设置项目层级的政策时,在 deniedValues 列表中列出了同一虚拟机,则该虚拟机实例不能拥有外部 IP 地址。

Console

按照设置组织层级的政策限制条件下记录的相同流程进行操作,但要从项目(而非组织)选择器中选择您所需的项目。

项目选择器的屏幕截图

gcloud

使用 gcloud beta resource-manager org-policies set-policy 命令设置政策。您将需要以 JSON 文件的形式提供政策。创建一个与以下内容类似的 JSON 文件:

{
 "constraint": "constraints/compute.vmExternalIpAccess",
 "listPolicy": {
  "allowedValues": [
   "projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]"
  ]
 }
}

其中:

  • [PROJECT_ID] 是此请求对应的项目 ID,如 example-project。请注意,设置项目 ID 与设置组织政策不同,设置组织政策时需要使用组织数字 ID。
  • [ZONE] 是实例所在的地区。
  • [INSTANCE_NAME] 是实例名称。

或者,您可以指定 deniedValues 列表,其中列出了您希望明确禁止其拥有外部 IP 地址的虚拟机实例。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定 allowedValuesdeniedValues,但不能同时指定这两者。

然后,使用 gcloud 请求传入文件:

gcloud beta resource-manager org-policies set-policy my-policy.json --project example-project

API

使用 setOrgPolicy() API 定义您的限制条件。您指定的 allowedValue 列表中的虚拟机将获准拥有外部 IP 地址。或者,您可以指定 deniedValues 列表来指示您希望明确禁止其拥有外部 IP 地址的虚拟机实例。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定 allowedValuesdeniedValues,但不能同时指定这两者。

例如,以下是一个用于针对项目设置 compute.vmExternalIpAccess 限制条件的请求,可允许特定虚拟机实例拥有外部 IP 地址:

POST https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:setOrgPolicy

其中,[PROJECT_ID] 是此请求对应的项目 ID。

请求正文包含此限制条件的所需政策:

{
 "policy": {
  "constraint": "constraints/compute.vmExternalIpAccess",
  "listPolicy": {
   "allowedValues": [
    "projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]"
   ]
  }
 }
}

最佳做法

  • Google 建议您不要将 deniedValues 列表与此限制条件一起使用。如果您在 deniedValues 列表中定义了值,这意味着只有 deniedValues 列表中列出的虚拟机实例才会因受到限制而无法使用外部 IP 地址。如果您想准确控制可以拥有外部 IP 地址的实例,那么这可能会产生安全问题。如果您要从 allowedValues 列表中移除某些实例,请更新现有政策以从 allowedList 中移除实例,而不是将实例放到较低层次结构的 deniedValues 列表中。

  • 如果您希望针对大部分资源层次结构设置政策,但要排除某些项目,则应使用 setOrgPolicy 方法恢复默认政策,只需指定 restoreDefault 对象以允许项目中的所有虚拟机与外部 IP 地址关联即可。目前已用于项目的政策不会受此默认设置的影响。

  • 将此组织政策与 IAM 角色一起使用可以更好地控制您的环境。此政策仅适用于虚拟机实例,但如果您想更好地控制和限制网络设备的外部 IP 地址,可以将 compute.networkAdmin 角色授予有关方。

  • 如果启用了政策的组织或项目中有任何服务和产品正在 Compute Engine 上运行,则这些服务和产品可能会受此组织政策的影响。具体来说,Kubernetes Engine、Dataflow、Data Proc 和 Cloud SQL 等服务将受此政策的影响。如果这是一个问题,我们建议在未应用组织政策的其他项目中设置其他服务和产品,并根据需要使用跨项目网络

后续步骤

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

发送以下问题的反馈:

此网页
Compute Engine 文档