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

本页面介绍如何设置从 VPC 网络或本地网络中的宿主机到 VPC Service Controls 支持的 Google API 和服务的专用连接。如需了解专用 Google 访问通道概念和示例拓扑图,请参阅使用 VPC Service Controls 的专用 Google 访问通道

如需限制只有 VPC Service Controls 支持的 Google API 和服务才能访问服务边界内的专用 Google 访问通道,主机必须将其请求发送至 restricted.googleapis.com 域名而不是 *.googleapis.comrestricted.googleapis.com 域名解析为 VIP 地址(虚拟 IP 地址)范围 199.36.153.4/30。此 IP 地址范围无法通过互联网访问。

准备工作

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

过程概览

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

  • 为目标 199.36.153.4/30 配置路由。如需了解详情,请参阅配置路由
  • 配置防火墙规则,以允许相应流量传输到受限的 Google API IP 地址范围。如需了解详情,请参阅配置防火墙规则
  • 配置 DNS,以使 Google API 的流量解析至受限 Google API IP 地址范围。如需了解详情,请参阅配置 DNS

配置到 restricted.googleapis.com 的路由

使用 restricted.googleapis.com (199.36.153.4/30) 提供对支持 VPC Service Controls 的 Cloud API 和 Developer API 的访问权限。对于专用 Google 访问通道和适用于本地宿主机的专用 Google 访问通道,您的 VPC 网络必须包含一个目标为 199.36.153.4/30 且下一个跃点是默认互联网网关的路由。即使下一个跃点是默认互联网网关,发送到 199.36.153.4/30 的流量仍在 Google 的网络中。

如果您的 VPC 网络没有下一个跃点是默认互联网网关的默认路由,您可以创建目标为 199.36.153.4/30 且下一个跃点是默认互联网网关的自定义静态路由。

除了自定义静态路由之外,适用于本地主机的专用 Google 访问通道还需要自定义路由通告,以便本地网络中的主机可以获知受限 VIP。您可以使用 Cloud Router 路由器创建自定义动态路由来公布受限 VIP。

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

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

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

  • 添加只允许访问受 VPC Service Controls 保护的 Google 管理服务的自定义路由。

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

    请替换以下内容:

    • ROUTE_NAME:自定义路由的名称。
    • NETWORK_NAME:您的 VPC 网络的名称。

向本地网络中的主机公布受限路由

如果您使用适用于本地主机的专用 Google 访问通道,请配置路由,以便通过 Cloud VPN 或 Cloud Interconnect 连接转发 Google API 流量。如需向您的本地网络公布受限 VIP (199.36.153.4/30),请使用 Cloud Router 路由器自定义路由通告。此 IP 地址范围只能供通过专用 IP 地址访问您的 VPC 网络的本地主机访问。

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

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

Console


  1. 转到 Google Cloud Console 中的“Cloud Router 路由器”页面。
    Cloud Router 路由器列表
  2. 选择要更新的 Cloud Router 路由器。
  3. 在 Cloud Router 路由器的详情页面中,选择修改
  4. 展开通告的路由部分。
  5. 对于路由,选择创建自定义路由
  6. 要继续通告 Cloud Router 路由器可用的子网,请选择通告向 Cloud Router 路由器公开的所有子网。启用此选项可模拟 Cloud Router 路由器的默认行为。
  7. 如需添加通告的路由,请选择添加自定义路由
  8. 配置路由通告。
    • 来源 - 选择自定义 IP 地址范围
    • IP 地址范围 - 指定 199.36.153.4/30
    • 说明 - 添加对 Restricted Google APIs IPs 的说明。
  9. 添加路由后,选择保存

gcloud


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

  • 如需设置自定义 IP 范围,请使用 --set-advertisement-ranges 标志。所有现有的自定义通告都会被替换。以下示例更新了 my-router Cloud Router 路由器,以通告所有子网和受限的 Google API IP 范围 199.36.153.4/30

    gcloud compute routers update my-router \
        --advertisement-mode CUSTOM \
        --set-advertisement-groups ALL_SUBNETS \
        --set-advertisement-ranges 199.36.153.4/30
    
  • 如需将自定义 IP 范围关联到现有通告,请使用 --add-advertisement-ranges 标志。请注意,您必须将 Cloud Router 路由器的通告模式设置为 custom 才能使用此标志。以下示例展示了如何将 Restricted Google APIs IPs 自定义 IP 添加到 Cloud Router 路由器的通告中:

    gcloud compute routers update my-router \
        --add-advertisement-ranges 199.36.153.4/30
    

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

Console


  1. 转到 Google Cloud Console 中的“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 地址范围 - 指定 199.36.153.4/30
    • 说明 - 添加对 Restricted Google APIs IPs 的说明。
  9. 添加完路由后,选择保存

gcloud


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

  • 如需设置自定义 IP 范围,请使用 --set-advertisement-ranges 标志。所有现有的自定义通告都会被替换。以下示例更新了 my-router Cloud Router 路由器上的 my-bgp-session BGP 会话,以通告所有子网及自定义 IP 范围 199.36.153.4/30

    gcloud compute routers update-bgp-peer my-router \
        --peer-name my-bgp-session \
        --advertisement-mode CUSTOM \
        --set-advertisement-groups ALL_SUBNETS \
        --set-advertisement-ranges 199.36.153.4/30
    
  • 如需将自定义 IP 范围关联到现有通告,请使用 --add-advertisement-ranges 标志。请注意,您必须将 Cloud Router 路由器的通告模式设置为 custom 才能使用此标志。以下示例将受限 Google API IP 199.36.153.4/30 添加到了 Cloud Router 路由器的通告中:

    gcloud compute routers update-bgp-peer my-router \
        --peer-name my-bgp-session \
        --add-advertisement-ranges 199.36.153.4/30
    

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

配置防火墙规则

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

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

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

配置本地防火墙规则,以允许来自本地宿主机的流量到达 199.36.153.4/30

配置 DNS

对于 VPC Service Controls 的一般使用情况,我们建议您使用 Cloud DNS 响应政策为 VPC 网络配置 DNS。使用 Cloud DNS 时,您无需创建代管式专用可用区来配置 DNS。响应政策使用 passthru 行为来允许名称(例如 www.googleapis.com)绕过示例 *.googleapis.com 中的通配符名称。如需了解详情,请参阅管理响应政策和规则

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

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

使用 Cloud DNS 配置 DNS

使用 Cloud DNS 为您 VPC 网络中的虚拟机实例和/或本地网络中的主机启用 DNS 解析。如果您使用共享 VPC,请参阅 Cloud DNS 文档中的专用区域和共享 VPC。此外,如果您使用共享 VPC,请确保共享 VPC 网络宿主项目与连接到该网络的项目包含在同一服务边界内。

您可以使用响应政策或专用区域通过 Cloud DNS 配置 DNS。

使用响应政策配置 Cloud DNS

将特定名称定向到受限 VIP 地址

您可以配置包含每个区域的本地 CNAME 数据的响应政策,以将 Google API 请求转换为受限 Google API。未指定的名称将继续使用常规 DNS 进行解析。

例如,您可以为 pubsub.googleapis.com 创建响应政策,其中包含某个区域的本地 CNAME 数据,以将 Google API 请求转换为 restricted.googleapis.com。与此同时,未指定的 www.googleapis.com 将继续使用常规 DNS 来解析。

在以下示例配置中,您将创建一项政策并将其应用于特定 VPC 网络。

gcloud

  1. 如需创建响应政策,请运行 gcloud beta dns response-policies create 命令:

    gcloud beta dns response-policies create RESPONSE_POLICY_NAME \
        --networks=NETWORK \
        --description=DESCRIPTION
    

    请替换以下内容:

    • RESPONSE_POLICY_NAME:您要创建的响应政策的名称或 ID,例如 myresponsepolicy
    • NETWORK:要与响应政策关联的网络名称列表(以英文逗号分隔),例如 network1,network2
    • DESCRIPTION:响应政策的说明,例如 My new response policy
  2. 如需向政策添加规则,请运行 gcloud beta dns response-policies rules create 命令:

    gcloud beta dns response-policies rules create RESPONSE_POLICY_RULE_NAME \
        --response-policy=RESPONSE_POLICY_NAME \
        --dns-name=pubsub.googleapis.com. \
        --local-data=name="pubsub.googleapis.com.",type="A",ttl=300,rrdatas="199.36.153.4|199.36.153.5|199.36.153.6|199.36.153.7"
    

    请替换以下内容:

    • RESPONSE_POLICY_RULE_NAME:您要创建的响应政策规则的名称,例如 myresponsepolicyrule
    • RESPONSE_POLICY_NAME:响应政策的名称,例如 myresponsepolicy

API

  1. 通过网址创建响应政策:

    {
      kind: "dns#responsePolicy",
      response_policy_name: RESPONSE_POLICY_NAME,
      description: RESPONSE_POLICY_DESCRIPTION,
      networks: [
        {
          network_url: URL_TO_NETWORK;
        }
      ]
    }
    

    请替换以下内容:

    • RESPONSE_POLICY_NAME:响应政策的名称
    • RESPONSE_POLICY_DESCRIPTION:响应政策的说明
    • URL_TO_NETWORK:要为其创建响应政策的网址

  2. 向政策添加规则:

    {
      kind: "dns#responsePolicyRules",
      rule_name: RULE_NAME,
      dns_name: DNS_NAME,
      local_data: [
        {
          name: "pubsub.googleapis.com.",
          type: "A",
          ttl: 300,
          rrdata: ["199.36.153.4", "199.36.153.5", "199.36.153.6", "199.36.153.7"]
        }
      ]
    }
    

    请替换以下内容:

    • RULE_NAME:要创建的规则的名称,例如 pubsub
    • DNS_NAME:要为其创建规则的 DNS 名称,例如 pubsub.googleapis.com.;注意结尾的点

将除部分名称以外的所有名称定向至受限 VIP 地址

您可以设置规则,以从覆盖整个网域或大型 IP 地址块的政策规则中豁免某些 DNS 响应。此概念称为“passthru 行为”。通过使用 passthru 行为,您可以允许不支持 Service Control 的名称绕过通配符名称。

例如,您可以允许 www.googleapis.com 绕过示例 *.googleapis.com 中的通配符名称。www 的完全匹配优先于通配符 *

在以下示例配置中,您将创建具有指定名称的政策,并将其应用于特定 VPC 网络。该规则允许 www.googleapis.com 绕过通配符 *.googleapis.com

gcloud

  1. 如需创建响应政策,请运行 gcloud beta dns response-policies create 命令:

    gcloud beta dns response-policies create RESPONSE_POLICY_NAME \
        --networks=NETWORK \
        --description=DESCRIPTION
    

    请替换以下内容:

    • RESPONSE_POLICY_NAME:您要创建的响应政策的名称或 ID,例如 myresponsepolicy
    • NETWORK:要与响应政策关联的网络名称列表(以英文逗号分隔),例如 network1,network2
    • DESCRIPTION:响应政策的说明,例如 My new response policy
  2. 如需向政策添加绕过规则,请运行 gcloud beta dns response-policies rules create 命令,并将 --behavior 标志设置为 bypassResponsePolicy

    gcloud beta dns response-policies rules create RESPONSE_POLICY_RULE_NAME \
        --response-policy=RESPONSE_POLICY_NAME \
        --dns-name=DNS_NAME \
        --behavior=bypassResponsePolicy
    

    请替换以下内容:

    • RESPONSE_POLICY_RULE_NAME:您要创建的响应政策规则的名称,例如 myresponsepolicyrule
    • RESPONSE_POLICY_NAME:响应政策的名称,例如 myresponsepolicy
    • DNS_NAME:DNS 或域名,例如 www.googleapis.com

API

  1. 创建响应政策:

    {
      kind: "dns#responsePolicy",
      response_policy_name: RESPONSE_POLICY_NAME,
      description: RESPONSE_POLICY_DESCRIPTION,
      networks: [
        {
          network_url: URL_TO_NETWORK;
        }
      ]
    }
    

    请替换以下内容:

    • RESPONSE_POLICY_NAME:响应政策的名称,例如 my-response-policy
    • RESPONSE_POLICY_DESCRIPTION:响应政策的说明,例如 my response policy
    • URL_TO_NETWORK:要为其创建响应政策的网址
  2. 向政策添加规则:

    {
      kind: "dns#responsePolicyRules",
      rule_name: RULE_NAME,
      dns_name: DNS_NAME,
      local_data: [
        {
          name: "*.googleapis.com.",
          type: "A",
          ttl: 300,
          rrdata: ["restricted.googleapis.com."]
        }
      ]
    }
    {
      kind: "dns#responsePolicyRules",
      rule_name: "www-passthru",
      dns_name: "www.googleapis.com.",
      behavior: BYPASS_RESPONSE_POLICY
    }
    

    请替换以下内容:

    • RULE_NAME:要创建的规则的名称,例如 googleapis
    • DNS_NAME:要为其创建规则的通配符 DNS 名称,例如 *.googleapis.com.;注意结尾的点

使用专用区域配置 Cloud DNS

如果无法使用响应政策,请使用专用区域配置 Cloud DNS。

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

    gcloud beta 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 替换为您在第一步中创建的区域的名称。

  4. 执行事务。

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

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

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

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

      gcloud beta 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