配置专用 Google 访问通道

默认情况下,当 Compute Engine 虚拟机缺少分配给其网络接口的外部 IP 地址时,它只能将数据包发送到其他内部 IP 地址目标。您只需在虚拟机网络接口使用的子网上启用专用 Google 访问通道,就可以允许这些虚拟机连接到 Google API 和服务使用的外部 IP 地址集。

专用 Google 访问通道还允许访问 App Engine 使用的外部 IP 地址,包括基于第三方 App Engine 的服务。

如需查看可与专用 Google 访问通道搭配使用且符合条件的 API 和服务,请参阅专用 Google 访问通道概览中支持的服务

如需了解关于专用 Google 访问通道和 Google Cloud 所提供其他专用连接选项的背景信息,请参阅服务的专用访问通道选项

规范

您可以在创建子网时,在子网层级启用专用 Google 访问通道,也可以在创建子网后修改子网。

为子网启用专用 Google 访问通道,并且满足 VPC 网络的 Google API 和服务的网络要求后,Google Cloud 允许其网络接口位于已启用子网中的虚拟机将来自以下来源的数据包发送到 Google API 和服务的外部 IP 地址:

  • 其网络接口位于已启用子网中的虚拟机的主要内部 IP 地址,但除非该接口已分配了外部地址

  • 其网络接口位于已启用子网中的虚拟机的别名 IP 范围的内部 IP 地址

为其网络接口分配了外部 IP 地址的虚拟机不需要专用 Google 访问通道即可连接到 Google API 和服务。它可以连接到 Google API 和服务,只要其具有关联的外部 IP 地址的网络接口位于符合网络要求的 VPC 网络中。

网络要求

专用 Google 访问通道具有以下要求:

  • 由于专用 Google 访问通道是按子网启用,因此您必须使用 VPC 网络旧版网络不受支持,因其不支持子网。

  • 专用 Google 访问通道不会自动启用任何 API。您必须通过 Google Cloud Console 中的“API 和服务”页面单独启用 Google API

  • 如果您使用 private.googleapis.comrestricted.googleapis.com 域名,则需要创建 DNS 记录以将流量定向到与这些网域关联的 IP 地址。如需获取指导,请参阅网络配置

  • 您的网络必须具有 Google API 和服务所用目标 IP 范围的适当路由。这些路由必须使用默认的互联网网关的下一个跃点。如果您使用 private.googleapis.comrestricted.googleapis.com 域名,则只需要一个路由(每个网域)。否则,您需要创建多个路由。如需了解详情,请参阅路由选项

  • 出站防火墙必须允许流量进入 Google API 和服务所用的 IP 地址范围。隐式允许出站防火墙规则满足此要求。如需了解满足防火墙要求的其他方式,请参阅防火墙配置

权限

拥有网络管理员角色的项目所有者、编辑者和 IAM 成员可以创建或更新子网并分配 IP 地址。

如需详细了解角色,请参阅 IAM 角色文档。

日志记录

Cloud Logging 会捕获子网中已启用专用 Google 访问通道的虚拟机实例发出的所有 API 请求。日志条目将 API 请求的来源标识为调用实例的内部 IP 地址。

您可以将每日使用情况报告和每月汇总报告配置为传送到 Cloud Storage 存储分区。如需了解详情,请参阅查看使用情况报告

网络配置

本部分介绍了 VPC 网络中的任何虚拟机(使用专用 Google 访问通道或借助外部 IP 地址)访问 Google API 和服务所需满足的基本网络要求。

您应先选择要访问 Google API 和服务的网域。

网域和 IP 地址范围 支持的服务 用法示例
默认域名

Google API 和服务的所有域名,private.googleapis.comrestricted.googleapis.com 除外。

各种 IP 地址范围,您可以通过引用默认网域的 IP 地址来确定一组默认 IP 地址使用的可能 IP 地址范围
启用对大多数 Google API 和服务的 API 访问权限,无论这些 Google API 和服务是否受 VPC Service Controls 支持。包括对 Google 地图、Google Ads、Google Cloud Platform 以及名称以 googleapis.com 结尾的大多数其他 Google API 的 API 访问权限。不支持 G Suite Web 应用。 如果您没有为 private.googleapis.comrestricted.googleapis.com 配置 DNS 记录,则系统会使用默认网域
private.googleapis.com

199.36.153.8/30
启用对大多数 Google API 和服务的 API 访问权限,无论这些 Google API 和服务是否受 VPC Service Controls 支持。包括对 Google 地图、Google Ads、Google Cloud Platform 以及大多数其他 Google API(包括以下列表)的 API 访问权限。不支持 G Suite Web 应用。

域名结尾为:
  • googleapis.com
  • googleadapis.com
  • ltsapis.goog
  • gcr.io
  • gstatic.com
  • appspot.com
  • cloudfunctions.net
  • pki.goog
  • cloudproxy.app
  • run.app
  • datafusion.googleusercontent.com
  • datafusion.cloud.google.com
主机名/域名匹配:
  • packages.cloud.google.com
  • gcr.io
  • appengine.google.com
  • pki.goog
使用 private.googleapis.com 通过一组仅可从 Google Cloud 路由的 IP 地址访问 Google API 和服务。在以下情况下选择 private.googleapis.com
  • 您没有使用 VPC Service Controls。
  • 您正在使用 VPC Service Controls,但还需要访问 VPC Service Controls 不支持的 Google API 和服务。
restricted.googleapis.com

199.36.153.4/30
启用对 VPC Service Controls 所支持的 Google API 和服务的 API 访问权限。

阻止对不支持 VPC Service Controls 的 Google API 和服务的访问权限。不支持 G Suite Web 应用或 G Suite API。
使用 restricted.googleapis.com 通过一组仅可从 Google Cloud 路由的 IP 地址访问 Google API 和服务。如果您需要访问 VPC Service Controls 支持的 Google API 和服务时,请选择 restricted.googleapis.com - restricted.googleapis.com 不允许访问不支持 VPC Service Controls 的 Google API 和服务。

DNS 配置

如果您选择 private.googleapis.comrestricted.googleapis.com,则需要配置 DNS,让 VPC 网络中的虚拟机对 *.googleapis.com 请求解析:

  1. googleapis.com 创建专用 DNS 区域。为此,请考虑创建 Cloud DNS 专用区域
  2. googleapis.com 区域中,根据所选网域创建以下 A 记录之一:

    • private.googleapis.comA 记录,指向以下 IP 地址:199.36.153.8199.36.153.9199.36.153.10199.36.153.11
    • restricted.googleapis.comA 记录,指向以下 IP 地址:199.36.153.4199.36.153.5199.36.153.6199.36.153.7

    如果您使用的是 Cloud DNS,请在 googleapis.com 专用区域中添加记录

  3. googleapis.com 区域中,为指向您在上一步中创建的任何 A 记录的 *.googleapis.com 创建 CNAME 记录。

某些 Google API 和服务是使用其他域名提供,其中包括 *.gcr.io*.gstatic.compki.goog。请参阅网络要求中的“网域和 IP 地址范围表”,以确定是否可以使用 private.googleapis.comrestricted.googleapis.com 访问其他网域的服务。接下来,对于每个其他网域,请执行以下操作:

  1. 为其他网域创建 DNS 区域(例如 gcr.io)。如果您使用的是 Cloud DNS,请确保此区域与您的 googleapis.com 专用区域位于同一项目中。
  2. 在此 DNS 区域中:
    • 为网域(区域)名称本身创建 A 记录;例如 gcr.io。将此 A 记录指向您选择的自定义域名(private.googleapis.comrestricted.googleapis.com)对应的四个 IP 地址。
    • 为其他网域的所有可能的主机名创建 CNAME 记录,格式为一个星号和一个点后跟网域(区域)名称,例如 *.gcr.io。将此 CNAME 记录指向同一区域中的 A 记录。例如,将 *.gcr.io 指向 gcr.io

路由选项

您的 VPC 网络必须具有适当的路由,其下一个跃点是默认互联网网关。Google Cloud 不支持通过其他虚拟机实例或自定义下一个跃点,将流量路由到 Google API 和服务。尽管称之为默认互联网网关,但从 VPC 网络中的虚拟机发送到 Google API 和服务的数据包仍保留在 Google 网络中。

  • 如果您选择默认网域,则您的虚拟机实例将使用 Google 外部 IP 地址的子集连接到 Google API 和服务。这些 IP 地址可公开路由,但从 VPC 网络中的虚拟机到这些地址的路径仍保留在 Google 网络中。

  • Google 不会在互联网上向 private.googleapis.comrestricted.googleapis.com 网域使用的任何 IP 地址发布路由。因此,这些网域只能通过 VPC 网络中的虚拟机或连接到 VPC 网络的本地系统访问。

如果您的 VPC 网络包含默认路由,其下一个跃点是默认互联网网关,您可以使用该路由访问任何网域中的 Google API 和服务,而无需创建自定义路由。如需了解详情,请参阅使用默认路由进行路由

如果您已将默认路由替换为目的地为 0.0.0.0/0 并且下一个跃点并非默认互联网网关的自定义静态路由,则您可以改为使用自定义路由来满足 Google API 和服务的路由要求。在以下情况下考虑使用自定义路由:

  • 您有一个自定义静态路由,其目标为 0.0.0.0/0、下一个跃点为 Cloud VPN 隧道,以及内部 TCP/UDP 负载平衡器或其他虚拟机实例。
  • 您使用 Cloud Router 路由器来接受目的地为 0.0.0.0/0 的自定义动态路由

使用默认路由进行路由

每个 VPC 网络在创建时都会包含默认路由。此路由的下一个跃点是默认互联网网关,它提供了指向默认网域 private.googleapis.comrestricted.googleapis.com 的路径。

如需检查给定网络中默认路由的配置,请按照以下说明操作。

控制台

  1. 转到 Google Cloud Console 中的“路由”页面。
    转到“路由”页面
  2. 过滤路由列表,以仅显示您需要检查的网络的路由。
  3. 查找目的地为 0.0.0.0/0 且下一个跃点为默认互联网网关的路由

gcloud

使用以下 gcloud 命令,并将 network-name 替换为要检查的网络名称:

gcloud compute routes list \
    --filter="default-internet-gateway network-name"

如果需要创建替换默认路由,请参阅添加静态路由

自定义路由

作为默认路由的替代方案,您可以使用自定义静态路由,每个路由都有更具体的目标,并且每个路由都使用默认互联网网关。您需要的路由数量及其目标 IP 地址取决于您选择的网域

如需检查给定网络中 Google API 和服务的自定义路由配置,请按照以下说明操作。

控制台

  1. 转到 Google Cloud Console 中的“路由”页面。
    转到“路由”页面
  2. 使用过滤表文本字段根据以下条件过滤路由列表,需将 network-name 替换为您的 VPC 网络名称。
    • 网络:network-name
    • 下一个跃点类型:default internet gateway
  3. 查看每个路由的“目标 IP 范围”列。如果您选择了默认网域,请检查多条自定义静态路由,分别针对默认网域使用的每个 IP 地址范围。如果您选择 private.googleapis.comrestricted.googleapis.com,请查找该网域的 IP 范围

gcloud

使用以下 gcloud 命令,并将 network-name 替换为要检查的网络名称:

gcloud compute routes list \
    --filter="default-internet-gateway network-name"

除非您使用 --format 标志自定义命令,否则路由以表格式列出。在 DEST_RANGE 列中查找每条路由的目的地。如果您选择了默认网域,请检查多条自定义静态路由,分别针对默认网域使用的每个 IP 地址范围。如果您选择 private.googleapis.comrestricted.googleapis.com,请查找该网域的 IP 范围

如果需要创建路由,请参阅添加静态路由

防火墙配置

您的 VPC 网络的防火墙配置必须允许通过虚拟机访问 Google API 和服务使用的 IP 地址。隐式 allow egress 规则满足此要求。

在某些防火墙配置中,您需要创建特定的出站允许规则。例如,假设您已创建了一条出站拒绝规则,以阻止所有目标的流量 (0.0.0.0)。在这种情况下,您必须为 Google API 和服务创建一个出站允许防火墙规则,其优先级高于所选网域使用的每个 IP 地址范围的出站拒绝规则。

如需创建防火墙规则,请参阅创建防火墙规则。在定义每个出站允许规则的目标时,您可以限制防火墙规则应用的虚拟机。

默认网域的 IP 地址

请按照以下步骤确定默认网域(例如 *.googleapis.com*.gcr.io)使用的 IP 地址范围。

  • Google 在 goog.json 中发布了其向互联网公布的完整 IP 范围列表。
  • Google 还会在 cloud.json 中发布 Google Cloud 客户可用的全球和地区外部 IP 地址范围列表。

Google API 和服务的默认网域使用的 IP 地址位于通过从 goog.json 的范围中删除 cloud.json 的所有范围之后计算得出的范围列表中。以下示例显示了如何使用 Python 获取此范围。

Python

您可以使用以下 Python 脚本创建 IP 地址范围列表,其中包含 Google API 和服务的默认网域使用的 IP 地址范围。

对于 macOS,此脚本需要配置如下的 Python 3 运行时:

  • 安装适用于 macOS 的当前版本 Python 3 运行时。
  • 从“应用程序”文件夹的 Python 文件夹中运行随附的 Install Certificates.command,以安装可供 Python 运行时使用的可信根证书列表 (cert.pem)。将 version 替换为您安装的 Python 版本(例如 3.8)。
    sudo "/Applications/Python version/Install Certificates.command"
  • 通过运行以下命令安装 netaddr 模块:
    sudo pip3 install netaddr
#!/usr/bin/env python3

import json
import netaddr
import urllib.request

goog_url="https://www.gstatic.com/ipranges/goog.json"
cloud_url="https://www.gstatic.com/ipranges/cloud.json"

def read_url(url):
   try:
      s = urllib.request.urlopen(url).read()
      return json.loads(s)
   except urllib.error.HTTPError:
      print("Invalid HTTP response from %s" % url)
      return {}
   except json.decoder.JSONDecodeError:
      print("Could not parse HTTP response from %s" % url)
      return {}

def main():
   goog_json=read_url(goog_url)
   cloud_json=read_url(cloud_url)

   if goog_json and cloud_json:
      print("{} published: {}".format(goog_url,goog_json.get('creationTime')))
      print("{} published: {}".format(cloud_url,cloud_json.get('creationTime')))
      goog_cidrs = netaddr.IPSet()
      for e in goog_json['prefixes']:
         if e.get('ipv4Prefix'):
            goog_cidrs.add(e.get('ipv4Prefix'))
      cloud_cidrs = netaddr.IPSet()
      for e in cloud_json['prefixes']:
         if e.get('ipv4Prefix'):
            cloud_cidrs.add(e.get('ipv4Prefix'))
      print("IP ranges for Google APIs and services default domains:")
      for i in goog_cidrs.difference(cloud_cidrs).iter_cidrs():
         print(i)

if __name__=='__main__':
   main()

专用 Google 访问通道配置

满足 VPC 网络中的网络要求后,您可以启用专用 Google 访问通道。

启用专用 Google 访问通道

请按照以下步骤启用专用 Google 访问通道:

控制台

  1. 转到 Google Cloud Console 中的 VPC 网络页面。
    转到“VPC 网络”页面
  2. 点击您需要为其启用专用 Google 访问通道的子网所属网络的名称。
  3. 对于现有子网:
    1. 点击子网的名称。系统会显示子网详情页面。
    2. 点击修改
    3. 专用 Google 访问通道部分,选择开启
    4. 点击保存
  4. 对于新子网:
    1. 点击添加子网
    2. 指定新子网的名称区域
    3. 指定子网的 IP 地址范围。此范围不能与当前 VPC 网络或者通过 VPC 网络对等互连或 VPN 连接的任何网络中的任何子网重叠。
    4. 对新子网进行其他选择以满足需求。例如,您可能需要创建次要子网 IP 范围或启用 VPC 流日志。
    5. 专用 Google 访问通道部分,选择开启
    6. 点击添加

gcloud

对于现有子网:

  1. 确定该子网的名称和地区。如需列出特定网络的子网,请使用以下命令:

    gcloud compute networks subnets list --filter=network-name
    
  2. 运行以下命令以启用专用 Google 访问通道:

    gcloud compute networks subnets update subnet-name \
    --region=region \
    --enable-private-ip-google-access
    
  3. 运行以下命令以验证专用 Google 访问通道是否已启用:

    gcloud compute networks subnets describe subnet-name \
    --region=region \
    --format="get(privateIpGoogleAccess)"
    

在以上所有命令中,将以下内容替换为有效值:

  • subnet-name:子网的名称
  • region:子网的地区
  • network-name:包含子网的 VPC 网络的名称

创建新子网时,请使用 --enable-private-ip-google-access 标志启用专用 Google 访问通道:

gcloud compute networks subnets create subnet-name \
    --region=region \
    --network=network-name \
    --range=primary-ip-range \
    --enable-private-ip-google-access

将以下内容替换为有效值:

  • subnet-name:子网的名称
  • region:子网的地区
  • network-name:包含子网的 VPC 网络的名称
  • primary-ip-range:子网的主要 IP 地址范围

停用专用 Google 访问通道

请按照以下步骤为现有子网停用专用 Google 访问通道:

控制台

  1. 转到 Google Cloud Console 中的 VPC 网络页面。
    转到“VPC 网络”页面
  2. 点击您需要为其停用专用 Google 访问通道的子网所属网络的名称。
  3. 点击现有子网的名称。系统会显示子网详情页面。
  4. 点击修改
  5. 专用 Google 访问通道部分,选择关闭
  6. 点击保存

gcloud

  1. 确定该子网的名称和地区。如需列出特定网络的子网,请使用以下命令:

    gcloud compute networks subnets list \
        --filter=network-name
    
  2. 运行以下命令以停用专用 Google 访问通道:

    gcloud compute networks subnets update subnet-name \
        --region=region \
        --no-enable-private-ip-google-access
    
  3. 运行以下命令以验证专用 Google 访问通道是否已停用:

    gcloud compute networks subnets describe subnet-name \
        --region=region \
        --format="get(privateIpGoogleAccess)"
    

在以上所有命令中,将以下内容替换为有效值:

  • subnet-name:子网的名称
  • region:子网的地区
  • network-name:包含子网的 VPC 网络的名称

后续步骤