您可以为虚拟机 (VM) 和裸机实例分配静态外部 IP 地址。您还可以更改、列出和释放实例的静态 IP 地址。如需预留静态外部 IP 地址,请参阅预留静态外部 IP 地址。
外部 IP 地址可以是静态地址或临时地址。如果某实例需要固定不变的外部 IP 地址,请执行以下操作:
- 获取静态外部 IP 地址。您可以预留新的外部 IP 地址,也可以提升现有的临时外部 IP 地址。
- 将预留的 IP 地址分配给现有实例,或在创建新实例时进行分配。
如果您的内部 Compute Engine 网络中需要静态 IP 地址,请改为参阅预留静态内部 IP 地址。
如需了解如何预留静态外部 IP 地址或创建全球外部 IP 地址,请参阅预留静态外部 IP 地址。
准备工作
- 了解 IP 地址。
- 了解静态外部 IP 地址的配额和限制。
- 了解外部 IP 地址价格。
-
如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以选择以下任一选项向 Compute Engine 进行身份验证:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
-
如需创建和更新实例:Compute Instance Admin (v1) (
roles/compute.instanceAdmin.v1
) -
针对实例的
compute.instances.update
权限 -
针对实例的
compute.instances.updateNetworkInterface
权限 -
针对实例的
compute.instances.addAccessConfig
权限 -
针对实例的
compute.instances.deleteAccessConfig
权限 -
网络上的
compute.networks.list
-
针对子网的
compute.subnetworks.use
权限 -
针对子网的
compute.subnetworks.list
权限 -
如需创建实例,请执行以下操作:
- 针对项目的
compute.instances.create
权限 - 使用自定义映像创建虚拟机:针对映像的
compute.images.useReadOnly
权限 - 使用快照创建虚拟机:针对快照的
compute.snapshots.useReadOnly
权限 - 使用实例模板创建虚拟机:针对实例模板的
compute.instanceTemplates.useReadOnly
权限 - 为虚拟机分配旧版网络:针对项目的
compute.networks.use
权限 - 为虚拟机指定静态 IP 地址:针对项目的
compute.addresses.use
权限 - 使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的
compute.networks.useExternalIp
权限 - 为虚拟机指定子网:针对项目或所选子网的
compute.subnetworks.use
权限 - 在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的
compute.subnetworks.useExternalIp
权限 - 为虚拟机设置虚拟机实例元数据:针对项目的
compute.instances.setMetadata
权限 - 为虚拟机设置标记:针对虚拟机的
compute.instances.setTags
权限 - 为虚拟机设置标签:针对虚拟机的
compute.instances.setLabels
权限 - 为虚拟机设置要使用的服务账号:针对虚拟机的
compute.instances.setServiceAccount
权限 - 为虚拟机创建新磁盘:针对项目的
compute.disks.create
权限 - 以只读或读写模式挂接现有磁盘:针对磁盘的
compute.disks.use
权限 - 以只读模式挂接现有磁盘:针对磁盘的
compute.disks.useReadOnly
权限
- 针对项目的
一次只能有一个资源使用某个静态外部 IP 地址。
IP 地址分配给资源后,无法分辨该 IP 地址是静态地址还是临时地址。您可以将 IP 地址与为相关项目预留的静态外部 IP 地址列表进行比较。如需查看项目可用的静态外部 IP 地址列表,请使用
gcloud compute addresses list
子命令。每个虚拟机都可以有多个网络接口,并且每个接口可以根据其栈类型分配有以下 IP 地址:
- 仅限 IPv4 的接口:
- 内部 IPv4 地址(必需)
- 外部 IPv4 地址(可选)
- 双栈(IPv4 和 IPv6)接口:
- 内部 IPv4 地址(必需)
- 外部 IPv4 地址(可选)
/96
IPv6 地址范围,可以是内部或外部,但不能同时是两者(必需)
- 仅限 IPv6 的接口(预览版):
/96
IPv6 地址范围,可以是内部或外部,但不能同时是两者(必需)
- 仅限 IPv4 的接口:
您无法取消分配或更改使用仅 IPv6 网络接口的虚拟机的外部 IPv6 地址。但是,您可以将资源的临时外部 IP 地址升级为静态外部 IP 地址,这样即使删除资源后,该地址仍将保留。
您无法更改静态 IP 地址的名称。
在 Google Cloud 控制台中,前往 IP 地址页面。
点击外部 IP 地址。
如需列出所有 IP 地址,请使用以下命令:
gcloud compute addresses list
如需列出所有全球 IP 地址,请使用以下命令:
gcloud compute addresses list --global
如需列出给定区域中的所有区域级 IP 地址,请使用以下命令:
gcloud compute addresses list \ --regions=REGION
将
REGION
替换为要列出其地址的区域。您可以通过指定以英文逗号分隔的区域名称来列出多个区域的地址:gcloud compute addresses list \ --regions=REGION1,REGION2,..REGION_n_
如需列出区域级 IPv4 或 IPv6 地址,请调用
addresses.list
方法:GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses
替换以下内容:
PROJECT_ID
:此请求的项目 IDREGION
:此请求的地区名称
如需列出所有区域中的所有地址,请调用
addresses.aggregatedList
方法。GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/aggregated/addresses
如需列出全球 IPv4 或 IPv6 地址,请调用
globalAddresses.list
方法:GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses
请替换以下内容:
PROJECT_ID
:此请求的项目 ID在 Google Cloud 控制台中,前往创建实例页面。
指定实例详情。
展开高级选项部分。
展开网络部分。
在网络接口部分,展开网络接口以进行修改。
如需分配 IPv4 地址,请执行以下操作:
- 请选择一个网络。
- 从外部 IPv4 地址列表中选择 IP 地址。
如需分配 IPv6 地址,请执行以下操作:
- 选择包含具有外部 IPv6 地址范围的子网的网络。
- 从子网列表中选择子网。
- 对于 IP 栈类型,请选择 IPv4 和 IPv6(双栈)或 IPv6(单栈)。
- 从外部 IPv6 地址列表中选择新预留的外部 IPv6 地址。或者,选择预留静态外部 IPv6 地址并预留新的静态外部 IPv6 地址。
- 在网络服务层级部分,选择高级。
如需完成默认网络接口的修改,请点击完成。
继续进行实例创建过程。
如需分配静态外部 IPv4 地址,请执行以下操作:
gcloud compute instances create INSTANCE_NAME \ --zone=ZONE \ --address=IPV4_ADDRESS
如需分配静态外部 IPv6 地址,请执行以下操作:
gcloud compute instances create INSTANCE_NAME \ --zone=ZONE \ --subnet=SUBNET \ --stack-type=STACK_TYPE \ --external-ipv6-address=IPV6_ADDRESS \ --external-ipv6-prefix-length=96 \ --ipv6-network-tier=PREMIUM
替换以下内容:
INSTANCE_NAME
:计算实例的名称。ZONE
:要在其中创建实例的可用区IPV4_ADDRESS
:要分配给实例的 IPv4 地址。使用预留的静态外部 IP 地址,而不是地址名称。SUBNET
:包含外部 IPv6 地址的子网STACK_TYPE
:实例的栈类型,可以是IPV4_IPV6
(双栈)或IPV6_ONLY
IPV6_ADDRESS
:要分配给实例的 IPv6 地址。使用预留的静态外部 IP 地址,而不是地址名称。
如需为新的计算实例分配静态外部 IPv4 地址,请执行以下操作:
在您创建新实例的请求中,明确提供
networkInterfaces[].accessConfigs[].natIP
属性和您要使用的外部 IPv4 地址,例如:{ "name": "INSTANCE_NAME", "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE", "networkInterfaces": [{ "accessConfigs": [{ "type": "ONE_TO_ONE_NAT", "name": "External NAT", "natIP": "IPV4_ADDRESS" }], "network": "global/networks/default" }], "disks": [{ "autoDelete": "true", "boot": "true", "type": "PERSISTENT", "initializeParams": { "sourceImage": "SOURCE_IMAGE" } }] }
替换以下内容:
INSTANCE_NAME
:计算实例的名称ZONE
:要在其中创建实例的可用区MACHINE_TYPE
(可选):创建实例时要使用的机器类型资源的完整网址或部分网址,格式为:zones/ZONE/machineTypes/MACHINE_TYPE
IPV4_ADDRESS
:要分配给实例的 IPv4 地址。使用预留的静态外部 IP 地址,而不是地址名称。SOURCE_IMAGE
:公共映像的特定版本,例如projects/debian-cloud/global/images/debian-10-buster-v20200309
,或映像系列,例如projects/debian-cloud/global/images/family/debian-10
如需为新实例分配静态外部 IPv6 地址,请执行以下操作:
在您创建新实例的请求中,明确提供
networkInterfaces[].ipv6AccessConfigs[].externalIpv6
属性和您要使用的外部 IPv6 地址,例如:{ "name": "INSTANCE_NAME", "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE", "networkInterfaces": [{ "ipv6AccessConfigs": [{ "externalIpv6": "IPV6_ADDRESS", "externalIpv6PrefixLength": 96, "name": "external-ipv6-access-config", "networkTier": "PREMIUM", "type": "DIRECT_IPV6" }], "stackType": "STACK_TYPE", "subnetwork":"SUBNETWORK" }], "disks": [{ "autoDelete": "true", "boot": "true", "mode": "READ_WRITE", "type": "PERSISTENT", "initializeParams": { "sourceImage": "SOURCE_IMAGE" }, }], }
替换以下内容:
INSTANCE_NAME
:计算实例的名称ZONE
:要在其中创建实例的可用区MACHINE_TYPE
(可选):创建实例时要使用的机器类型资源的完整网址或部分网址,格式为:zones/ZONE/machineTypes/MACHINE_TYPE
IPV6_ADDRESS
:要分配给实例的 IPv6 地址。使用预留的静态外部 IP 地址,而不是地址名称。STACK_TYPE
:实例的栈类型,为IPV4_IPV6
(双栈)或IPV6_ONLY
SUBNET
:包含外部 IPv6 地址的子网SOURCE_IMAGE
:公共映像的特定版本,例如"projects/debian-cloud/global/images/debian-10-buster-v20200309"
,或映像系列,例如"projects/debian-cloud/global/images/family/debian-10"
在 Google Cloud 控制台中,前往虚拟机实例页面。
点击要为其分配外部 IP 地址的实例的名称。此时将显示实例详细信息页面。
在实例详细信息页面中,完成以下步骤:
- 点击修改。
- 展开网络接口。
- 选择要为实例分配的所需外部 IP 地址。
如果实例是仅 IPv4 实例,并且您想分配 IPv6 地址,则必须先将栈类型更改为双栈。
- 对于外部 IPv4 地址,选择临时或静态外部 IPv4 地址。
- 对于外部 IPv6 地址,选择临时或静态外部 IPv6 地址。
- 点击完成。
点击保存。
可选:预留静态外部 IP 地址。
如果您要分配静态外部 IP 地址,则必须预留一个地址并确保该地址当前未被其他资源使用。视需要按照说明操作,选择预留新的静态外部 IP 地址或取消分配静态外部 IP 地址。
如果打算使用临时外部 IP 地址,可以跳过此步骤,Compute Engine 会随机分配一个临时外部 IP 地址。
移除所有现有的 IP 地址分配,如取消分配静态外部 IP 地址中所述。
分配新的外部 IP 地址。
如需分配 IPv4 地址,请使用
instances add-access-config
子命令:注意:请勿将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"
如需将实例更改为双栈并为其分配 IPv6 地址,请使用
instance network-interfaces update
子命令:gcloud compute instances network-interfaces update INSTANCE_NAME \ --network-interface=NIC \ --ipv6-network-tier=PREMIUM \ --stack-type=STACK_TYPE \ --external-ipv6-address=IPV6_ADDRESS \ --external-ipv6-prefix-length=96 \ --zone=ZONE
替换以下内容:
INSTANCE_NAME
:实例的名称。NIC
:网络接口的名称。STACK_TYPE
:实例的堆栈类型,必须为IPV4_IPV6
。您无法将栈类型更改为 IPV6_ONLY。IPV6_ADDRESS
:要分配给实例的 IPv6 地址。指定/96
范围内的第一个 IPv6 地址。ZONE
:实例的可用区。
移除所有现有的 IP 地址分配,如取消分配静态外部 IP 地址中所述。
向
instances.deleteAccessConfig
方法发出POST
请求,删除现有的访问配置。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/deleteAccessConfig
向
instances.addAccessConfig
方法发出POST
请求,以向实例的网络接口添加新的访问配置。对于 IPv4 地址,请发出以下请求:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/addAccessConfig { "natIP": "IPV4_ADDRESS", "name": "ACCESS_CONFIG_NAME" }
对于 IPv6 地址,请将网络接口的
stackType
更新为IPV4_IPV6
,并更新networkInterfaces[].ipv6AccessConfigs[].externalIpv6
属性和您要使用的外部 IPv6 地址。如需了解详情,请参阅为新实例分配静态外部 IP 地址。
- 您只能将此列表限制条件应用于实例。
- 您不能追溯应用限制。政策启用前,所有具有外部 IP 地址的实例都将保留其外部 IP 地址。
- 此限制在同一个政策中只接受
allowedList
或deniedList
其中之一,不能同时接受。 - 由您或拥有所需权限的管理员负责管理和维护实例生命周期和完整性。此限制仅用于验证实例的 URI,而不会阻止系统更改、删除或重新创建许可名单中的实例。
PROJECT_ID
:此请求的项目 ID,例如example-project
。 请注意,设置项目 ID 与设置组织政策不同,设置组织政策时需要使用组织的数字 ID。ZONE
:实例的可用区INSTANCE_NAME
:实例的名称PROJECT_ID
:此请求的项目 ID,例如example-project
。 请注意,设置项目 ID 与设置组织政策不同,设置组织政策时需要使用组织的数字 ID。ZONE
:实例的可用区。INSTANCE_NAME
:实例的名称。请避免将
deniedValues
列表与此限制一起使用。如果您在deniedValues
列表中定义了值,这意味着只有deniedValues
列表中的实例被禁止使用外部 IP 地址。如果您想准确控制可以拥有外部 IP 地址的实例,那么这可能会产生安全问题。如果您要从allowedValues
列表中移除某些实例,请更新现有政策以从allowedList
中移除实例,而不是将实例放到较低层次结构的deniedValues
列表中。如果您希望针对大部分资源层次结构设置政策,但要排除某些项目,请使用
setOrgPolicy
方法恢复默认政策,只需指定restoreDefault
对象以允许项目中的所有实例与外部 IP 地址关联即可。项目的当前政策不会受默认设置的影响。将组织政策与 IAM 角色一起使用可以更好地控制您的环境。此政策仅适用于实例,但如果您想更好地控制和限制网络设备的外部 IP 地址,可以将
compute.networkAdmin
角色授予有关方。如果启用了政策的组织或项目中有任何服务和产品正在 Compute Engine 上运行,则这些服务和产品受此组织政策的约束。具体而言,Google Kubernetes Engine、Dataflow、Dataproc 和 Cloud SQL 等服务受此政策的影响。如果因此导致问题,Google 建议在未应用组织政策的其他项目中设置其他服务和产品,并根据需要使用共享 VPC。
在 Google Cloud 控制台中,前往 IP 地址页面。
在列表中找到地址,并查看类型列以获取 IP 地址类型。
在 Google Cloud 控制台中,前往 IP 地址页面。
点击外部 IP 地址。
选择您要取消分配的静态 IP 地址。
点击
查看操作,然后选择重新分配给其他资源选项。从关联到下拉列表中,选择无。
点击确定。
使用
gcloud compute addresses list
命令检查某个静态 IP 地址是否已被使用:gcloud compute addresses list
输出类似于以下内容:
NAME REGION ADDRESS STATUS example-address-ipv4 REGION 198.51.100.1 RESERVED example-address-new-ipv4 REGION 203.0.113.1 IN_USE example-address-ipv6 REGION 2001:db8:1:1:1:1:1:1 RESERVED example-address-new-ipv6 REGION 2001:db8:4:4:4:4:4:4 IN_USE
- 如果该 IP 地址未被使用,则状态为
RESERVED
。 - 如果该 IP 地址已被使用,则状态为
IN_USE
。
- 如果该 IP 地址未被使用,则状态为
检索使用该 IP 地址的实例的名称:
gcloud compute addresses describe ADDRESS_NAME \ --region=REGION
替换以下内容:
ADDRESS_NAME
:IPv6 地址资源的名称REGION
:IPv6 地址资源所在的区域
输出类似于以下内容:
address: IP_ADDRESS addressType: EXTERNAL ... region: https://www.googleapis.com/compute/v1/projects/PROJECT/regions/REGION selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT/regions/REGION/addresses/ADDRESS_NAME status: IN_USE subnetwork: https://www.googleapis.com/compute/v1/projects/PROJECT/regions/REGION/subnetworks/SUBNET users: - https://www.googleapis.com/compute/v1/projects/PROJECT/zones/ZONE/instances/INSTANCE_NAME
users
字段会显示使用该 IP 地址的实例的名称。从实例取消分配 IP 地址。
如需取消分配 IPv4 地址,请删除实例的访问配置文件:
获取要删除的访问配置的名称。如需获取名称,请使用
gcloud compute instances describe
命令。 将INSTANCE_NAME
替换为实例的名称。gcloud compute instances describe INSTANCE_NAME
访问配置将以如下格式显示:
networkInterfaces: - accessConfigs: - kind: compute#accessConfig name: external-nat natIP: 203.0.113.1 type: ONE_TO_ONE_NAT
使用
gcloud compute instances delete-access-config
命令删除访问配置:gcloud compute instances delete-access-config INSTANCE_NAME \ --access-config-name="ACCESS_CONFIG_NAME"
替换以下内容:
INSTANCE_NAME
:实例的名称。ACCESS_CONFIG_NAME
:要删除的访问配置的名称。请确保用引号括住全名。
如需取消分配 IPv6 地址范围,请使用
instance network-interfaces update
命令:gcloud compute instances network-interfaces update INSTANCE_NAME \ --network-interface=nic0 \ --stack-type=IPV4_ONLY \ --zone=ZONE
替换以下内容:
INSTANCE_NAME
:使用该 IP 地址的实例的名称。ZONE
:实例的可用区。
检查静态外部 IP 地址目前是否可以使用,以及是否标记为
RESERVED
而非IN_USE
。gcloud compute addresses list \ --filter="ADDRESS_NAME AND region=REGION"
替换以下内容:
ADDRESS_NAME
:IP 地址资源的名称。REGION
:IP 地址资源所在的区域。
对于 IPv4 地址,请删除附加到使用该地址的实例的访问配置。
如需查看实例的访问配置详细信息,请向
instances.get
方法发出GET
请求。GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME
向
instances.deleteAccessConfig
方法发出POST
请求,删除现有的访问配置。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/deleteAccessConfig
替换以下内容:
PROJECT_ID
:此请求的项目 ID。ZONE
:实例所在的可用区INSTANCE_NAME
:实例的名称
对于 IPv6 地址,请更新 IPv6 地址附加到的实例的网络接口的堆栈类型。
向
instances.updateNetworkInterface
方法发出PATCH
请求。在请求正文中,将
stackType
字段的值更新为IPV4_ONLY
。例如:
PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/updateNetworkInterface { "networkInterfaces": [{ ... "stackType" : "IPV4_ONLY" ... }] }
- 详细了解 IP 地址。
- 详细了解网络和防火墙。
- 了解如何使用内部 DNS 确定 Compute Engine 实例地址。
- 查看 VPC 价格。
Terraform
如需在本地开发环境中使用本页面上的 Terraform 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。
如需了解详情,请参阅 Set up authentication for a local development environment。
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
所需的角色
如需获得配置和管理静态 IP 地址所需的权限,请让管理员向您授予项目的以下 IAM 角色:
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色包含配置和管理静态 IP 地址所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
配置和管理静态 IP 地址需要以下权限:
限制
注意:网络接口可以接收来自多个转发规则的流量,这些转发规则可能适用于其他外部 IP 地址。任意数量的外部 IP 地址都可以通过这些转发规则来引用某个网络接口,但每个网络接口只能分配有一个外部 IPv4 地址范围和一个外部
/96
IPv6 地址范围。如需详细了解负载平衡和转发规则,请参阅负载平衡文档。
查看可用的静态外部 IP 地址
如需列出您为项目预留的静态外部 IP 地址,请按照以下步骤操作。
控制台
gcloud
使用
gcloud compute addresses list
命令:API
Go
Java
Python
配置静态外部 IP 地址
以下部分介绍了如何为实例配置静态外部 IP 地址。
创建使用静态外部 IP 地址的实例
预留静态外部 IP 地址后,您可以将其分配给实例。
控制台
gcloud
您可以创建实例并分配您已预留的静态区域级外部 IP 地址。
Terraform
您可以使用
google_compute_instance
资源分配外部 IP 地址。REST
Go
Java
Python
更改现有实例的外部 IP 地址或为其分配一个外部 IP 地址
您可以为现有的仅限 IPv4 实例或双栈实例更改或分配外部 IP 地址(临时或静态)。仅 IPv6 实例不支持此过程。
计算实例可以有多个接口。单栈接口可以有一个外部 IP 地址。双栈接口可以有一个外部 IPv4 地址和一个外部 IPv6 地址。如果该实例已有一个外部 IP 地址,您必须先移除该地址。然后,您可以为现有实例分配新的外部 IP 地址。
控制台
gcloud
REST
您可以通过为实例添加新的访问配置来更改该实例的外部 IPv4 或 IPv6 地址。
Go
Java
Python
将外部 IP 地址限制为仅用于特定实例
对于某些工作负载,您可能有安全和网络限制等方面的基本要求。例如,您可能希望限制外部 IP 地址的用途,以便只有特定的计算实例才能使用这些地址。此方式有助于防止数据渗漏或者有助于维持网络隔离状态。借助组织政策,您可以在某些限制条件下将外部 IP 地址仅用于特定的实例,以控制组织或项目中的实例对外部 IP 地址的使用。
用于控制实例的外部 IP 地址的限制如下:
constraints/compute.vmExternalIpAccess
如需使用该限制,请指定一个包含
allowedList
列表的政策,该列表中列出了可以具有外部 IP 地址的实例。如果未指定政策,则允许所有实例使用所有外部 IP 地址。政策实施后,只有allowedValues
列表中列出的实例才能获得外部 IP 地址(临时或静态),组织或项目中其他未在政策中明确定义的 Compute Engine 实例将被禁止使用外部 IP 地址。系统根据实例的 URI 在许可和拒绝名单中识别实例:
projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME
限制外部 IP 地址的规范
限制外部 IP 地址所需的权限
如需在项目级层或组织级层设置限制,您必须已被授予组织的
orgpolicy.policyAdmin
角色。在组织级层设置政策限制条件
控制台
gcloud
如需为外部 IP 访问权限设置限制,您首先需要查找组织 ID。您可以通过运行
organizations list
命令并在响应中查找数字 ID 来找到组织 ID:gcloud organizations list
gcloud CLI 会按以下格式返回组织列表:
DISPLAY_NAME ID example-organization1 29252605212 example-organization2 1234567890
使用
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" ] } }
替换以下内容:
或者,您可以指定
deniedValues
列表来指明您希望明确禁止其拥有外部 IP 地址的实例。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定allowedValues
或deniedValues
,但不能同时指定这两者。然后,使用请求传入该文件:
gcloud 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" } }
REST
使用
setOrgPolicy()
API 定义您的限制。您指定的allowedValue
列表中的实例可以具有外部 IP 地址。或者,您可以指定deniedValues
列表来指明您希望明确禁止其拥有外部 IP 地址的实例。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定allowedValues
或deniedValues
,但不能同时指定这两者。例如,以下请求针对组织应用了
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 地址。控制台
按照设置组织级层的政策限制下记录的相同流程进行操作,只是要从项目(而非组织)选择器中选择您所需的项目。
gcloud
使用
gcloud resource-manager org-policies set-policy
命令可以设置政策。您将需要以 JSON 文件的形式提供政策。按以下格式创建一个 JSON 文件:{ "constraint": "constraints/compute.vmExternalIpAccess", "listPolicy": { "allowedValues": [ "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME" ] } }
替换以下内容:
或者,您可以指定您希望明确禁止其拥有外部 IP 地址的实例的
deniedValues
列表。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定allowedValues
或deniedValues
,但不能同时指定这两者。然后,使用请求传入该文件:
gcloud resource-manager org-policies set-policy MY_POLICY.JSON --project=example-project
REST
使用
setOrgPolicy
API 定义您的限制。您指定的allowedValue
列表中的实例可以具有外部 IP 地址。或者,您可以指定deniedValues
列表来指明您希望明确禁止其拥有外部 IP 地址的实例。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定allowedValues
或deniedValues
,但不能同时指定这两者。例如,以下请求针对项目设置了
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" ] } } }
限制外部 IP 地址的最佳做法
管理静态外部 IP 地址
以下部分介绍了如何管理实例的静态外部 IP 地址。
确定内部 IP 地址是临时地址还是静态地址
静态和临时内部 IP 地址的行为在大多数情况下看起来都相同。但是,对于静态内部 IP 地址,即使您删除并重新创建资源,也可以对同一资源使用相同的 IP 地址。通常,如果您停止或删除资源,临时 IP 地址会被释放。
如需确定地址是静态地址还是临时地址,请执行以下操作:
取消分配静态外部 IP 地址
取消分配某个 IP 地址后,系统会将其从资源中移除,但会预留该 IP 地址。取消分配该 IP 地址后,您可以将其重新分配给其他资源。双栈实例支持此过程,但仅 IPv6 实例不支持。
您还可以通过删除实例来取消分配 IPv4 或 IPv6 地址。
控制台
gcloud
在您的静态外部 IP 地址可以使用后,您可以选择将其分配给另一个实例。
REST
如需取消分配静态外部 IPv4 或 IPv6 地址,请执行以下步骤:
Java
Python
释放静态外部 IP 地址
如果您不再需要某个静态外部 IPv4 或 IPv6 地址,可以通过删除 IP 地址资源来释放该 IP 地址。 删除实例的操作不会自动释放静态外部 IP 地址。如果您不再需要某些静态外部 IP 地址,必须手动释放这些地址。
如需释放静态外部 IP 地址,请参阅 VPC 文档中的释放静态外部 IP 地址。
后续步骤
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-01-07。
-