使用静态外部 IP 访问专用网络中的外部资源

本页面介绍了如何设置专用池,以便通过静态外部 IP 访问外部资源。


如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示

操作演示


准备工作

  • 启用 Cloud Build, Compute Engine, and Service Networking API。

    启用 API

  • 如需获取设置专用连接所需的权限,请让管理员向您授予 VPC 网络所在 Cloud 项目的 Compute Engine Network Admin (roles/compute.networkAdmin) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

  • 如需使用此页面上的 gcloud 命令,请安装 Google Cloud CLI

创建 VPC 网络

控制台

如需使用 Google Cloud 控制台创建 VPC 网络,请完成以下步骤:

  1. 在 Google Cloud 控制台中打开 VPC 网络页面。

    进入 VPC 网络页面

  2. 点击创建 VPC 网络以创建新网络。

    您将看到创建 VPC 网络页面。

  3. 输入网络的名称

  4. 子网创建模式下,选择自动

  5. 如果您想进一步自定义其他字段,请参阅创建和管理 VPC 网络。否则,请将所有字段保留原样。

  6. 点击创建以创建 VPC 网络。

    点击创建后,您将在 VPC 网络页面上看到新的 VPC 网络。

gcloud

如需使用 gcloud 命令行工具创建 VPC 网络,请在终端中输入以下命令,其中 NETWORK_NAME 是您的 VPC 网络的名称:

gcloud compute networks create NETWORK_NAME \
  --subnet-mode=auto

点击创建后,您将在 VPC 网络页面上看到新的 VPC 网络。

如需详细了解如何创建和管理 VPC 网络,请参阅创建和管理 VPC 网络

创建专用连接

控制台

如需在 VPC 网络与服务提供方网络之间创建专用连接,请完成以下步骤:

  1. 在 Google Cloud 控制台中打开 VPC 网络页面。

    进入 VPC 网络页面

  2. 点击您的网络名称。

    您将看到 VPC 网络详情页面。

  3. 点击 Private Service Connection 标签页。

    1. 选择为服务分配的 IP 范围标签页。

    2. 点击分配 IP 范围

      您会看到分配内部 IP 范围弹出框。

      1. 输入 IP 范围的名称

      2. IP 范围下,选择自动

      3. 前缀长度字段中,输入网络的前缀长度。

      4. 点击分配以分配 IP 范围。

    3. 选择到服务的专用连接标签页。

    4. 点击 Create Connection

      您会看到创建专用连接弹出式窗口。

      1. 指定的分配范围下,选择您的 IP 范围。

      2. 点击连接

      您现在将在 Private Connections to Services 标签页下的表格中看到您的连接。

      点击启用(导出自定义路由),以确保 VPC 的路由应用于运行专用池实例的网络。

现在,网络已配置完毕。

gcloud

如需在 VPC 网络与服务提供方网络之间创建专用连接,请完成以下步骤:

  1. 在终端中输入以下命令,为您的服务分配 IP 范围:

        gcloud compute addresses create RESERVED_RANGE_NAME \
          --global \
          --prefix-length=PREFIX_LENGTH \
          --network=VPC_NETWORK \
          --project=PROJECT_ID
    

    其中:

    • RESERVED_RANGE_NAME 是已分配范围的名称。例如 my-allocated-range
    • PREFIX_LENGTH 是您的网络的前缀长度。前缀长度不得超过 /24,例如 /22/21 等。
    • VPC_NETWORK 是您的 VPC 网络的名称,例如 my-vpc-network
    • PROJECT_ID 是包含您的 VPC 网络的项目的 ID。
  2. 在终端中输入以下命令以创建专用连接:

        gcloud services vpc-peerings connect \
          --service=servicenetworking.googleapis.com \
          --ranges=RESERVED_RANGE_NAME \
          --network=VPC_NETWORK \
          --project=PROJECT_ID
    

    其中:

    • RESERVED_RANGE_NAME 是您在上一步中创建的分配范围的名称。
    • VPC_NETWORK 是您的 VPC 网络的名称,例如 my-vpc-network
    • PROJECT_ID 是包含您的 VPC 网络的项目的 ID。
  3. 在终端中输入以下命令,以确保 VPC 的路由应用于运行专用池实例的网络:

        gcloud compute networks peerings update servicenetworking-googleapis-com \
          --export-custom-routes \
          --network=VPC_NETWORK \
          --project=PROJECT_ID
    

    其中:

    • VPC_NETWORK 是您的 VPC 网络的名称,例如 my-vpc-network
    • PROJECT_ID 是包含您的 VPC 网络的项目的 ID。

现在,网络已配置完毕。

如需详细了解如何配置网络,请参阅在 VPC 网络和服务提供方网络之间设置专用连接

创建专用池

控制台

如需使用 Google Cloud 控制台创建专用池,请完成以下步骤:

  1. 在 Google Cloud 控制台中打开工作器池页面:

    打开“Cloud Build 工作器池”页面

  2. 选择要在其中创建专用池的项目。

  3. 工作器池页面中,点击创建

    您将看到创建专用池面板。

  4. 创建专用池侧边栏中,输入以下信息:

    1. 输入专用池的名称

    2. 从下拉菜单中选择一个区域

    3. 网络下,输入以下信息:

    • Project:输入项目 ID 或编号。
    • 网络:输入您的 VPC 网络的名称。
    1. (可选)取消选中最受限的网络配置分配外部 IP 复选框。

您现在已创建专用池。

gcloud

如需使用 gcloud 命令行工具创建专用池,请在终端中输入以下命令:

      gcloud builds worker-pools create PRIVATEPOOL_ID \
        --project=PRIVATEPOOL_PROJECT_ID \
        --region=REGION \
        --peered-network=PEERED_NETWORK \
        --no-public-egress

其中:

  • PRIVATEPOOL_ID 是您的专用池的唯一标识符。
  • PRIVATEPOOL_PROJECT_ID 是您要创建专用池的 Google Cloud 项目的 ID。
  • REGION支持的区域之一。
  • PEERED_NETWORK 是网络资源网址
  • --no-public-egress:如果设置了此标志,则会创建没有外部 IP 地址的专用池。

您现在已创建专用池。

如需详细了解如何创建和管理专用池,请参阅创建和管理专用池

访问专用网络中的外部资源

默认情况下,与 Cloud Build 专用池关联的外部 IP 地址不是静态或可配置的地址。它们由 Google Cloud 分配。如果您想要将专用池设置为使用静态外部 IP 从专用网络访问外部资源,则必须在项目中设置虚拟机 (VM),以充当自行管理的 NAT 网关,将请求代理到公共互联网。之后,您必须设置自定义路由将这些请求转发到您的虚拟机,以确保路由与服务网络项目进行交换。

本部分概述了如何通过完成以下步骤来设置专用池,以通过静态外部 IP 访问外部资源:

  1. 创建启动脚本,将虚拟机配置为代理路由到该虚拟机的所有流量,并将该流量伪装成源自其 IP 地址:

    #! /bin/bash
    set -e
    
    sysctl -w net.ipv4.ip_forward=1
    IFACE=$(ip -brief link | tail -1 | awk  {'print $1'})
    iptables -t nat -A POSTROUTING -o "$IFACE" -j MASQUERADE
    
  2. 在专用池所在的 VPC 中设置虚拟机,并设置允许通过 VPC 代理请求的规则:

    gcloud compute instances create VM_NAME \
      --image-project=ubuntu-os-cloud --image-family=ubuntu-2204-lts \
      --network=NETWORK_NAME \
      --private-network-ip=INTERNAL_IP --can-ip-forward \
      --zone=ZONE \
      --subnet=SUBNETWORK \
      --tags=NAT_TAG  \
      --metadata-from-file=startup-script=STARTUP_SCRIPT
    

    其中:

    • VM_NAME 是您要为虚拟机提供的名称。
    • NETWORK_NAME 是您在上一部分中创建的网络的名称。
    • INTERNAL_IP 是虚拟机区域子网范围内的任何有效内部 IP 地址。例如 10.128.0.2
    • ZONE 是与您的网络关联的可用区,例如 us-central1-a
    • (可选)SUBNETWORK 是子网的名称。您可以在子网的等效 REST 中找到子网的名称,格式如下:projects/project-id/regions/region/subnetworks/subnetwork-name。如果您在创建 VPC 网络时在子网连接模式下选择了自动,则无需指定此字段。
    • NAT_TAG 是 NAT 网关标记的名称,可让您根据请求是否具有来自此虚拟机的标记有条件地路由请求。您可以为代码指定任何名称。
    • STARTUP_SCRIPT 是您在上一步中创建的启动脚本的名称。例如 startup-script-example.sh。在此示例中,--metadata-from-file 标志用于将您指定的启动脚本的内容传递给名为 startup-script 的键。

    运行此命令后,您会看到包含外部 IP 值的输出。记下外部 IP 值。从专用池到外部资源的所有流量都通过此地址传输。您可以选择使用该地址进一步配置,例如配置外部网络中的防火墙规则。

  3. 设置路由以将指向外部资源的所有请求定向到上一步中创建的实例,从而允许将您的请求转发到专用池实例:

    gcloud compute routes create PRIVATE_POOL_ROUTE_NAME \
      --destination-range=DESTINATION_RANGE \
      --next-hop-address=INTERNAL_IP \
      --network=NETWORK_NAME \
      --priority=POOL_ROUTE_PRIORITY
    

    其中:

    • PRIVATE_POOL_ROUTE_NAME 是您要为路线指定的名称。
    • DESTINATION_RANGE 是包含您要路由到的目的地的有效 CIDR 地址范围。例如,GitHub Enterprise Edition 实例。例如 8.8.8.0/24
    • INTERNAL_IP 是从上一步中获取的内部 IP 值。例如 10.128.0.2
    • NETWORK_NAME 是您在上一部分中创建的网络的名称。
    • POOL_ROUTE_PRIORITY 是您要为路由指定的优先级编号。

    此命令可确保将来自专用池实例中构建的任何流量路由到您创建的代理虚拟机,而不是直接路由到公共互联网。

  4. 设置路由,以将来自代理的请求从已标记实例转发到外部目标 IP 范围。以下命令会创建一个路由,以将请求转发到与您的专用池实例关联的公共互联网。

    gcloud compute routes create NAT_EGRESS_ROUTE_NAME \
      --destination-range=DESTINATION_RANGE \
      --next-hop-gateway=default-internet-gateway \
      --network=NETWORK_NAME \
      --priority=NAT_ROUTE_PRIORITY \
      --tags=NAT_TAG
    

    其中:

    • NAT_EGRESS_ROUTE_NAME 是您要为 NAT 网关路由指定的名称。
    • DESTINATION_RANGE 是您要路由到的目标的地址。例如,GitHub Enterprise Edition 实例。例如 8.8.8.0/24
    • NETWORK_NAME 是您在上一部分中创建的网络的名称。
    • NAT_TAG 是 NAT 网关标记的名称,可让您根据请求是否具有来自此虚拟机的标记有条件地路由请求。您可以为代码指定任何名称。
    • NAT_ROUTE_PRIORITY 是您要为路由指定的优先级编号,

    此命令可确保来自代理虚拟机的所有流量都可以定向到公共互联网。

  5. 添加防火墙规则以允许流量从专用池传入 NAT 网关虚拟机:

    gcloud compute firewall-rules create RULE_NAME \
      --direction=INGRESS --priority=FIREWALL_PRIORITY --action=ALLOW --rules=all \
      --network=NETWORK_NAME \
      --source-ranges=RESERVED_RANGE \
      --target-tags=NAT_TAG
    

    其中:

    • RULE_NAME 是您要为防火墙规则指定的名称。
    • FIREWALL_PRIORITY 是您要为防火墙规则指定的优先级编号。
    • NETWORK_NAME 是您在上一部分中创建的网络的名称。
    • RESERVED_RANGE 是您在配置 VPC 网络时分配的 CIDR 范围。
    • NAT_TAG 是 NAT 网关标记的名称,可让您根据请求是否具有来自此虚拟机的标记有条件地路由请求。您可以为代码指定任何名称。

您现在可以从 VPC 中自行管理的 NAT 网关的静态 IP 地址访问外部资源。

后续步骤