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

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


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

操作演示


准备工作

  • Enable the Cloud Build, Compute Engine, and Service Networking APIs.

    Enable the APIs

  • 如需获得设置专用连接所需的权限,请让您的管理员为您授予 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 网络页面。

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. 点击专用服务连接标签页。

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

    2. 点击分配 IP 范围

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

      1. 输入 IP 范围的名称

      2. IP 范围下,选择自动

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

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

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

    4. 点击 Create Connection

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

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

      2. 点击连接

      现在,您会在连到服务的专用连接标签页下的表格中看到您的连接。

      点击启用(导出自定义路由),确保 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 是您为其分配的范围的名称 创建 Deployment 清单
    • 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. Network 下,输入以下信息:

    • 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 地址不是静态地址,也无法进行配置。这些 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 是您要为路由指定的优先级编号。

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

  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 地址访问外部资源。

后续步骤