设置通往 Google API 和服务的专用连接

本文档介绍如何设置从 VPC 网络或本地网络中的主机到 VPC Service Controls 支持的 Google API 和服务的专用连接。

在阅读本文档之前,我们建议您先熟悉专用 Google 访问通道概念、规范和网络配置。请查看关于将专用 Google 访问通道与 VPC Service Controls 配合使用的示例拓扑图。

准备工作

  • 通过 Google Cloud 控制台中的“API 和服务”页面启用要访问的 API
  • 确保您具有创建或更新子网所需的角色。拥有 Network Admin 角色的项目 Owner、Editor 和 IAM 主账号可以创建或更新子网并分配 IP 地址。 如需详细了解角色,请参阅 IAM 角色文档。
  • 验证是否已为专用 Google 访问通道和适用于本地宿主机的专用 Google 访问通道设置 VPC 网络。自动模式和自定义模式 VPC 网络均受支持。传统网络不受支持。
  • 确保 VPC 网络中的虚拟机实例具有专用 IP 地址(没有公共 IP 地址),且位于启用了专用 Google 访问通道的子网中。
  • 对于本地主机,请确保已与 VPC 网络建立 Cloud VPN 隧道或 Cloud Interconnect 连接。如需支持具有 IPv6 地址的本地主机,请参阅 IPv6 支持

过程概览

如需设置专用连接,请完成以下任务:

  • 配置 restricted.googleapis.com IP 地址范围的路由。如需了解详情,请参阅配置路由
  • 配置防火墙规则,以允许相应流量到达 restricted.googleapis.com IP 地址范围。如需了解详情,请参阅配置防火墙规则
  • 配置 DNS,以使到 Google API 的流量解析至 restricted.googleapis.com IP 地址范围。如需了解详情,请参阅配置 DNS

restricted.googleapis.com 的 IPv6 支持

您可以使用 restricted.googleapis.com 网域的 IPv6 地址范围访问 Google API:2600:2d00:0002:1000::/64

如果您要使用 restricted.googleapis.com 网域,并且具有使用 IPv6 地址的客户端,请考虑配置 IPv6 地址。同时配置了 IPv4 地址的 IPv6 客户端可以使用 IPv4 地址访问 Google API 和服务。并非所有服务都接受来自 IPv6 客户端的流量。

如需允许本地环境中的 IPv6 客户端使用 restricted.googleapis.com 访问 Google API,您必须配置与 VPC 网络的连接以支持 IPv6。如需了解详情,请参阅以下页面:

本地客户端可以从任何 IPv6 GUA 或 ULA 地址发送请求,但 ULA 范围 fda3:e722:ac3:cc00::/64 除外,该范围预留供内部使用。

如需详细了解 restricted.googleapis.com VIP,请参阅配置专用 Google 访问通道

与 API 和服务的直接连接

某些 Google API 和服务会提供来自 Compute Engine 虚拟机实例的直接连接,绕过 Google Front End (GFE)。如需允许此流量,您必须确保路由和防火墙规则允许出站流量到达 34.126.0.0/182001:4860:8040::/42。您无需为这些地址创建 DNS 记录。多项 Google Cloud 服务支持直接连接,可为 Google gRPC API 提供更出色的性能。如需启用这种增强型性能,您必须提供对指定 IP 地址范围的访问权限。

仅支持通过 Google Cloud 资源进行直接连接。您无法从本地主机使用直接连接。

提供直接连接的服务支持 VPC Service Controls。

配置通向 restricted.googleapis.com 的路由

虽然 VPC Service Controls 是针对兼容和已配置的服务强制执行的,但无论您使用哪个网域,restricted.googleapis.com 都会针对数据渗漏提供额外的风险缓解措施。restricted.googleapis.com 会拒绝对 VPC Service Controls 不支持的 Google API 和服务的访问权限。

对于专用 Google 访问通道和适用于本地主机的专用 Google 访问通道,您的 VPC 网络必须包含目标为 restricted.googleapis.com IP 地址范围且下一个跃点是默认互联网网关的路由。即使下一个跃点是默认互联网网关,发送到 restricted.googleapis.com 的流量仍在 Google 的网络中。

如果您的 VPC 网络没有下一个跃点是默认互联网网关的默认路由,您可以创建目标为 restricted.googleapis.com IP 地址范围且下一个跃点是默认互联网网关的自定义静态路由。如需阻止访问互联网,您必须移除下一个跃点是默认互联网网关的其他路由。

如需详细了解如何使用 VPC 路由,请参阅 VPC 文档中的使用路由

在 VPC 网络中配置自定义静态路由

添加自定义静态路由以允许访问 VPC Service Controls 所支持的 Google 管理的服务。

gcloud compute routes create ROUTE_NAME \
  --network=NETWORK_NAME \
  --destination-range=DESTINATION_RANGE \
  --next-hop-gateway=default-internet-gateway

替换以下内容:

  • ROUTE_NAME:自定义路由的名称
  • NETWORK_NAME:您的 VPC 网络的名称
  • DESTINATION_RANGE:路由的目标范围
    • 如需将流量路由到 restricted.googleapis.com VIP,请使用以下范围:
      • 对于 IPv4 流量:199.36.153.4/30
      • 对于 IPv6 流量:2600:2d00:0002:1000::/64
    • 如需将流量路由到允许直接连接的 API,请使用以下范围:
      • 对于 IPv4 流量:34.126.0.0/18
      • 对于 IPv6 流量:2001:4860:8040::/42

向本地网络中的主机通告受限路由

如果您使用适用于本地主机的专用 Google 访问通道,请配置路由,以便通过 Cloud VPN 或 Cloud Interconnect 连接转发 Google API 流量。如需向您的本地网络通告受限 VIP 地址范围,请使用 Cloud Router 自定义通告模式。只有可通过专用 IP 地址访问您的 VPC 网络的本地主机才能访问受限 VIP 地址范围。

您可以将此自定义通告路由添加到 Cloud Router 路由器(对于路由器上的所有 BGP 会话)或选择 BGP 会话(对于单个 Cloud VPN 隧道或 VLAN 连接)。

IPv6 路由仅在启用了 IPv6 的 BGP 会话中通告。

如需为现有 Cloud Router 路由器上所有 BGP 会话的受限范围创建自定义通告路由,请按以下步骤操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Router 路由器页面。

    前往“Cloud Router 路由器”

  2. 选择要更新的 Cloud Router 路由器。

  3. 在 Cloud Router 路由器的详情页面中,选择修改

  4. 展开通告的路由部分。

  5. 对于路由,选择创建自定义路由

  6. 如需继续通告 Cloud Router 路由器可用的子网,请选择通告向 Cloud Router 公开的所有子网。启用此选项可模拟 Cloud Router 路由器的默认行为。

  7. 如需添加通告的路由,请选择添加自定义路由

  8. 配置路由通告。

    • 来源:选择自定义 IP 范围
    • IP 地址范围
      • 对于 IPv4 连接:199.36.153.4/30
      • 对于 IPv6 连接:2600:2d00:0002:1000::/64
    • 说明:添加对 Restricted Google APIs IPs 的说明。
  9. 添加路由后,选择保存

gcloud

运行 update 命令,并使用 --set-advertisement-ranges--add-advertisement-ranges 标志指定自定义 IP 范围:

  • 如需设置自定义 IP 范围,请使用 --set-advertisement-ranges 标志。所有现有的自定义通告路由都会被替换。以下示例更新了 my-router Cloud Router 路由器,以通告所有子网和 restricted.googleapis.com IP 地址范围。

    gcloud compute routers update my-router \
        --advertisement-mode CUSTOM \
        --set-advertisement-groups ALL_SUBNETS \
        --set-advertisement-ranges RANGES
    

    RANGES 替换为您要使用的范围:

    • 对于 IPv4 连接:199.36.153.4/30
    • 对于 IPv6 连接:2600:2d00:0002:1000::/64
    • 对于 IPv4 和 IPv6 连接:199.36.153.4/30,2600:2d00:0002:1000::/64

  • 如需将自定义 IP 范围关联到现有通告,请使用 --add-advertisement-ranges 标志。请注意,您必须将 Cloud Router 路由器的通告模式设置为 custom 才能使用此标志。以下示例将 restricted.googleapis.com IP 地址范围添加到 Cloud Router 路由器的通告中:

    gcloud compute routers update my-router \
        --add-advertisement-ranges RANGES
    

    RANGES 替换为您要使用的范围:

    • 对于 IPv4 连接:199.36.153.4/30
    • 对于 IPv6 连接:2600:2d00:0002:1000::/64
    • 对于 IPv4 和 IPv6 连接:199.36.153.4/30,2600:2d00:0002:1000::/64

如需为现有 Cloud Router 路由器的特定 BGP 会话的受限范围创建自定义通告路由,请按以下步骤操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Router 路由器页面。

    前往“Cloud Router 路由器”

  2. 选择待更新 BGP 会话所属的 Cloud Router 路由器。

  3. 在 Cloud Router 路由器的详情页面中,选择要更新的 BGP 会话。

  4. BGP 会话详情页面中,选择修改

  5. 对于路由,选择创建自定义路由

  6. 选择通告向 Cloud Router 路由器公开的所有子网以继续通告 Cloud Router 路由器可用的子网。启用此选项可模拟 Cloud Router 路由器的默认行为。

  7. 选择添加自定义路由以添加通告的路由。

  8. 配置路由通告。

    • 来源:选择自定义 IP 地址范围以指定自定义 IP 地址范围。
    • IP 地址范围
      • 对于 IPv4 连接:199.36.153.4/30
      • 对于 IPv6 连接:2600:2d00:0002:1000::/64
    • 说明:添加对 Restricted Google APIs IPs 的说明。
  9. 添加完路由后,选择保存

gcloud

运行 update-bgp-peer 命令,并使用 --set-advertisement-ranges--add-advertisement-ranges 标志指定自定义 IP 范围。

  • 如需设置自定义 IP 范围,请使用 --set-advertisement-ranges 标志。所有现有的自定义通告路由都会被替换。

    如果您要添加 IPv6 自定义范围,并且为 BGP 会话停用了 IPv6 流量,则可以使用 --enable-ipv6 标志启用它。

    以下示例更新了 my-router Cloud Router 路由器上的 my-bgp-session BGP 会话,以通告所有子网及自定义 IP 范围:

    gcloud compute routers update-bgp-peer my-router \
        --peer-name my-bgp-session \
        --advertisement-mode CUSTOM \
        --set-advertisement-groups ALL_SUBNETS \
        --set-advertisement-ranges RANGES
    

    RANGES 替换为您要使用的范围:

    • 对于 IPv4 连接:199.36.153.4/30
    • 对于 IPv6 连接:2600:2d00:0002:1000::/64
    • 对于 IPv4 和 IPv6 连接:199.36.153.4/30,2600:2d00:0002:1000::/64

  • 如需将自定义 IP 范围关联到现有通告,请使用 --add-advertisement-ranges 标志。请注意,您必须将 Cloud Router 路由器的通告模式设置为 custom 才能使用此标志。

    如果您要添加 IPv6 自定义范围,并且为 BGP 会话停用了 IPv6 流量,则可以使用 --enable-ipv6 标志启用它。

    以下示例将受限 VIP 地址范围添加到 Cloud Router 路由器的通告中:

    gcloud compute routers update-bgp-peer my-router \
        --peer-name my-bgp-session \
        --add-advertisement-ranges RANGES
    

    RANGES 替换为您要使用的范围:

    • 对于 IPv4 连接:199.36.153.4/30
    • 对于 IPv6 连接:2600:2d00:0002:1000::/64
    • 对于 IPv4 和 IPv6 连接:199.36.153.4/30,2600:2d00:0002:1000::/64

    如需详细了解自定义通告模式,请参阅自定义通告路由

配置防火墙规则

对于专用 Google 访问通道,虚拟机实例使用内部 IP 地址,无需外部 IP 地址即可访问受保护的 Google API 资源。但是,虚拟机实例可能拥有外部 IP 地址,或以其他方式满足互联网访问的要求。除了自定义通告路由之外,您还可以创建防火墙规则以拒绝出站流量,从而限制来自 VPC 网络中虚拟机实例的出站流量。

默认情况下,如果存在适用路由,隐式允许出站防火墙规则允许虚拟机实例将流量发送到任意目标。您可以先创建出站流量拒绝规则,以阻止所有出站流量。然后,您可以创建优先级更高的出站流量规则,用于允许流量进入您的 VPC 网络中的选定目标和 restricted.googleapis.com IP 地址范围。与 restricted.googleapis.com 的所有通信都在 TCP 端口 443 上。

如需让来自 Google Cloud 的流量到达 restricted.googleapis.com VIP,请为以下目的地添加防火墙规则:

  • 对于 IPv4 流量:199.36.153.4/30
  • 对于 IPv6 流量:2600:2d00:0002:1000::/64

如需允许来自 Google Cloud 的流量到达允许直接连接的 API 和服务,请为以下目的地添加防火墙规则:

  • 对于 IPv4 流量:34.126.0.0/18
  • 对于 IPv6 流量:2001:4860:8040::/42

如需详细了解如何使用 VPC 防火墙规则,请参阅 Cloud 新一代防火墙文档中的使用 VPC 防火墙规则

配置本地防火墙规则,以允许来自本地主机的流量到达 restricted.googleapis.com IP 地址范围。

  • 对于 IPv4 流量:199.36.153.4/30
  • 对于 IPv6 流量:2600:2d00:0002:1000::/64

本地网络不支持与 Google API 和服务的直接连接

配置 DNS

您可以为 VPC 网络使用代管专用区域。借助 Cloud DNS 专用 DNS 区域,您可以托管可从授权 VPC 网络访问的 DNS 区域。如需配置来自某些本地域名服务器的转发,您可以使用 restricted.googleapis.com IP 地址范围。然后,您可以为 googleapis.com 创建一个专用区域,其中包含 DNS A 记录,该记录用于映射每个 *.googleapis.com 名称的 restricted.googleapis.com 和相应的 CNAME 记录。如需了解详情,请参阅管理区域

对于本地访问,您可以配置 Cloud DNS 入站转发政策以允许本地域名服务器查询 Cloud DNS 代管式专用可用区。您也可以配置本地域名服务器,例如使用 BIND 的域名服务器:

使用 Cloud DNS 配置 DNS

如需为 VPC 网络中的虚拟机实例和/或本地网络中的主机启用 DNS 解析,请使用 Cloud DNS。如果您使用共享 VPC,请参阅 Cloud DNS 文档中的专用区域和共享 VPC。此外,如果您使用共享 VPC,我们建议您将共享 VPC 网络宿主项目添加到与连接到该网络的项目位于同一服务边界内。

使用专用区域配置 Cloud DNS

您可以使用专用区域配置 Cloud DNS:

  1. 为您的 VPC 网络创建一个托管专用区域。

    gcloud dns managed-zones create ZONE_NAME \
     --visibility=private \
     --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME \
     --description=DESCRIPTION \
     --dns-name=googleapis.com

    请替换以下内容:

    • ZONE_NAME:要创建的区域的名称。例如 vpc。下列各个步骤中都将使用此名称。
    • PROJECT_ID:托管您的 VPC 网络的项目的 ID。
    • NETWORK_NAME:您的 VPC 网络的名称。
    • DESCRIPTION:(可选)代管区域的直观易懂的说明。
  2. 启动一项事务。

    gcloud dns record-sets transaction start --zone=ZONE_NAME

    ZONE_NAME 替换为您在第一步中创建的区域的名称。

  3. 添加 DNS 记录。

    gcloud dns record-sets transaction add --name=*.googleapis.com. \
        --type=CNAME restricted.googleapis.com. \
        --zone=ZONE_NAME \
        --ttl=300

    ZONE_NAME 替换为您在第一步中创建的区域的名称。

    gcloud dns record-sets transaction add --name=restricted.googleapis.com. \
        --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
        --zone=ZONE_NAME \
        --ttl=300

    ZONE_NAME 替换为您在第一步中创建的区域的名称。

    如果要为 restricted.googleapis.com 配置 IPv6 地址,还要创建以下记录集:

    gcloud dns record-sets transaction add --name=restricted.googleapis.com. \
        --type=AAAA 2600:2d00:0002:1000:: \
        --zone=ZONE_NAME \
        --ttl=300
  4. 执行事务。

    gcloud dns record-sets transaction execute --zone=ZONE_NAME

    ZONE_NAME 替换为您在第一步中创建的区域的名称。

  5. 可选。如需使本地主机能够访问受限 VIP,请完成以下步骤:

    1. 创建 DNS 政策并启用入站 DNS 转发,使 VPC 网络的名称解析服务可供本地网络中的系统外部使用。

      gcloud dns policies create POLICY_NAME \
       --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME \
       --enable-inbound-forwarding \
       --description=DESCRIPTION

      请替换以下内容:

      • POLICY_NAME:要创建的政策的名称。例如 apipolicy
      • PROJECT_ID:托管您的 VPC 网络的项目的 ID。
      • NETWORK_NAME:您的 VPC 网络的名称。
      • DESCRIPTION:(可选)代管区域的直观易懂的说明。
    2. 在本地部署网络中,将您的本地部署 DNS 指向 Cloud DNS 转发器 IP 地址。如需查找转发器 IP 地址,请使用 compute addresses list 命令:

      gcloud compute addresses list --filter='name ~ ^dns-forwarding.*' \
       --format='csv[no-heading](address, subnetwork)'

使用 BIND 配置 DNS

如果您使用 BIND 进行 DNS 解析,则可以对其进行配置,以将 Google API 请求解析至受限 Google API。使用以下示例 BIND 配置,该配置使用响应政策区域 (RPZ) 来实现此行为:

  1. 将以下行添加到 /etc/bind/named.conf

    include "/etc/bind/named.conf.options";
    include "/etc/bind/named.conf.local";
    
  2. 将以下行添加到 /etc/bind/named.conf.options

    options {
      directory "/var/cache/bind";
    
      dnssec-validation no;
    
      auth-nxdomain no;    # conform to RFC 1035
      listen-on-v6 { any; };
      listen-on { any; };
      response-policy { zone "googleapis.zone"; };
      allow-query { any;};
    };
    
  3. 将以下行添加到 /etc/bind/named.conf.local

    include "/etc/bind/named.conf.default-zones";

    zone "googleapis.zone" { type master; file "/etc/bind/db.googleapis.zone"; allow-query {none;}; };

  4. 将以下行添加到 /etc/bind/db.googleapis.zone

    $TTL 1H
    @                       SOA LOCALHOST. noreply.localhost(1 1h 15m 30d 2h)
                            NS  LOCALHOST.

    *.googleapis.com CNAME restricted.googleapis.com. restricted.googleapis.com CNAME rpz-passthru.

在特殊情况下配置 DNS

在特殊情况下配置 DNS 时,请注意以下几点:

  • 自定义 BIND 在使用 Dataflow 时不受支持。如需在将 Dataflow 与 VPC Service Controls 结合使用时自定义 DNS 解析,请使用 Cloud DNS 专用区域,而不是使用自定义 BIND 服务器。如需使用您自己的本地 DNS 解析,请考虑使用 Google Cloud DNS 转发方法
  • 例如,如果您使用 Google Kubernetes Engine (GKE),则可能还需要为 gcr.io 配置 DNS。如需了解详情,请参阅为 GKE 专用集群设置 Container Registry