基于 PSC 生产者端点的访问权限控制

1. 简介

Private Service Connect

Private Service Connect 是 Google Cloud 网络的一项功能,允许 使用方 从其 VPC 网络内部以私密方式访问 托管式服务 。同样,它允许托管式服务 提供方 在其各自的 VPC 网络中托管这些服务,并为其使用方提供专用连接。

50b907b09af4d8ac.png

Private Service Connect 提供方访问权限控制

提供方可以仅在服务连接的使用方接受列表中列出使用方时,接受来自该使用方的入站连接请求,而不是自动接受来自任何使用方的所有连接。您可以按项目、VPC 网络或单独的 PSC 端点指定使用方。您不能在同一使用方接受或拒绝列表中包含不同类型的使用方。

对于任一连接偏好设置,已被接受的连接都可能会被 组织政策 (compute.restrictPrivateServiceConnectConsumer) 覆盖并被拒绝,该政策会阻止传入连接。

请注意,组织政策 (compute.restrictPrivateServiceConnectConsumer) 适用于组织、文件夹或项目。如果您希望对 PSC 端点进行精细的访问权限控制,可以使用各个 PSC 端点的使用方接受列表。

基于端点的访问权限控制

PSC 基于端点的访问权限控制是指提供方能够通过服务连接政策中的各个 PSC 端点授权使用方。

此方法适用于 多租户服务,可提供最精细的连接管理控制。

此 Codelab 重点介绍如何配置此功能。

请注意,此方法不适用于 Private Service Connect 后端。

2. 您将学到的内容

  • 作为提供方,如何使用 PSC 发布服务。
  • 作为提供方,如何创建基于 PSC 端点的访问权限控制。
  • 作为使用方,如何访问 PSC 服务。

3. 实验整体架构

3d7cbafaffb50d2d.png

4. 准备步骤

完成实验所需的 IAM 角色

首先,您需要在项目级为 GCP 账号分配所需的 IAM 角色。

  • Compute Network Admin (roles/compute.networkAdmin) 此角色可让您完全控制 Compute Engine 网络资源。
  • Logging Admin (roles/logging.admin) 此角色可让您访问所有日志记录权限和依赖权限。
  • Service Usage Admin (roles/serviceusage.serviceUsageAdmin) 此角色可让您启用、停用和检查使用方项目的服务状态和操作,以及使用该项目的配额和结算服务。
  • Compute Instance Admin (roles/compute.instanceAdmin.v1) 此角色可让您完全控制 Compute Engine 实例、实例组、磁盘、快照和映像。拥有对所有 Compute Engine 网络资源的读取权限。
  • Compute Security Admin (roles/compute.securityAdmin) 此角色可让您创建、修改和删除防火墙规则和 SSL 证书,以及配置安全强化型虚拟机设置。

启用 API

在 Cloud Shell 中,确保您的项目配置正确并设置环境变量。

在 Cloud Shell 中,执行以下操作:

gcloud auth login
gcloud config set project <your project id>
export project_id=$(gcloud config get-value project)
export region=us-central1
export zone=$region-a
echo $project_id
echo $region
echo $zone

在项目中启用所有必需的 Google API。在 Cloud Shell 中,执行以下操作:

gcloud services enable \
  compute.googleapis.com 
  

创建提供方 VPC

在项目中,创建一个具有自定义子网模式的 VPC 网络。在 Cloud Shell 中执行以下操作:

gcloud compute networks create producer-net \
    --subnet-mode=custom

在提供方 VPC 中创建子网

您需要三个子网:用于服务的 producer-subnet;用于负载平衡器发布服务的 proxy-only-subnet;用于 PSC 发布服务的 psc-subnet。

在 Cloud Shell 中,执行以下操作以创建 IPV4 子网:

gcloud compute networks subnets create producer-subnet \
    --network=producer-net \
    --range=10.10.0.0/24 \
    --region=$region
gcloud compute networks subnets create proxy-only-subnet \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=$region \
    --network=producer-net \
    --range=10.30.0.0/24
gcloud compute networks subnets create psc-subnet \
    --network=producer-net \
    --region=$region \
    --range=192.168.0.0/16 \
    --purpose=PRIVATE_SERVICE_CONNECT

为提供方 VPC 创建 Cloud NAT 和 Cloud Router

Cloud NAT 用于允许虚拟机下载和安装应用。

gcloud compute routers create $region-cr \
   --network=producer-net \
   --region=$region
gcloud compute routers nats create $region-nat \
    --router=$region-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

创建使用方 VPC

在项目中,创建一个具有自定义子网模式的 VPC 网络。在 Cloud Shell 中执行以下操作:

gcloud compute networks create consumer-net \
    --subnet-mode=custom

在使用方 VPC 中创建子网

在 Cloud Shell 中,执行以下操作以创建 IPV4 子网:

gcloud compute networks subnets create consumer-subnet \
    --network=consumer-net \
    --range=10.20.0.0/24 \
    --region=$region

为提供方 VPC 和使用方 VPC 创建全局防火墙政策

您将创建一个全局网络防火墙政策,并将其与提供方 VPC 和使用方 VPC 相关联。

gcloud compute network-firewall-policies create global-fw-policy \
--global
gcloud compute network-firewall-policies associations create \
    --firewall-policy=global-fw-policy \
    --name=producer-fw-policy \
    --network=producer-net \
    --global-firewall-policy 
gcloud compute network-firewall-policies associations create \
    --firewall-policy=global-fw-policy \
    --name=consumer-fw-policy \
    --network=consumer-net \
    --global-firewall-policy 

允许 SSH

如需允许 Identity-Aware Proxy (IAP) 连接到您的虚拟机实例,请创建一个防火墙规则,该规则应:

  • 适用于您希望使用 IAP 可访问的所有虚拟机实例。
  • 允许 IP 范围 35.235.240.0/20 的入站流量。此范围包含 IAP 用于 TCP 转发的所有 IP 地址。
gcloud compute network-firewall-policies rules create 100 \
    --action=ALLOW \
    --firewall-policy=global-fw-policy \
    --description="producer-allow-iap" \
    --direction=INGRESS \
    --src-ip-ranges=35.235.240.0/20 \
    --layer4-configs=tcp:22  \
    --global-firewall-policy

向服务添加入站流量防火墙规则

您将使用区域级内部应用负载平衡器发布服务。入站流量防火墙规则 y 必须允许 proxy-only-subnet 访问服务。如需了解详情,请参阅此 文档

gcloud compute network-firewall-policies rules create 200 \
    --action=ALLOW \
    --firewall-policy=global-fw-policy \
    --description="producer-allow-access-service" \
    --direction=INGRESS \
    --src-ip-ranges=10.30.0.0/24 \
    --layer4-configs=tcp:80  \
    --global-firewall-policy

允许负载平衡器对服务执行健康检查

区域级内部应用负载平衡器健康检查探测使用 35.191.0.0/16 和 130.211.0.0/22 范围。您将创建一个入站流量防火墙规则,以允许探测执行健康检查。如需了解详情,请参阅此 文档

gcloud compute network-firewall-policies rules create 300 \
    --action=ALLOW \
    --firewall-policy=global-fw-policy \
    --description="producer-allow-health-check" \
    --direction=INGRESS \
    --src-ip-ranges=35.191.0.0/16,130.211.0.0/22\
    --layer4-configs=tcp:80  \
    --global-firewall-policy

在使用方 VPC 中创建虚拟机作为 HTTP 客户端

在 Cloud Shell 中,执行以下操作以创建虚拟机实例作为测试客户端:

gcloud compute instances create myclient \
    --zone=$zone \
    --subnet=consumer-subnet \
    --shielded-secure-boot \
    --no-address

在提供方 VPC 中创建虚拟机作为 HTTP 服务器

在 Cloud Shell 中,执行以下操作以创建虚拟机实例作为 HTTP 服务器:

gcloud compute instances create myserver \
    --subnet=producer-subnet \
    --zone=$zone \
    --no-address \
    --shielded-secure-boot \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "I am a Http Server." | \
    tee /var/www/html/index.html
    systemctl restart apache2'

5. 提供方发布 PSC 服务

创建区域级内部应用负载平衡器

您将创建一个区域级内部应用负载平衡器作为服务的前端,后端是端点为我们之前创建的 HTTP 服务器的非代管实例组。

预留负载平衡器的 IP 地址

gcloud compute addresses create l7-ilb-ip-address \
    --region=$region \
    --subnet=producer-subnet

创建实例组

您将创建一个非代管实例组,并将虚拟机实例 myserver 添加到该实例组中。

gcloud compute instance-groups unmanaged create my-service-ig \
    --zone=$zone
gcloud compute instance-groups unmanaged add-instances my-service-ig \
    --zone=$zone \
    --instances=myserver

创建 HTTP 健康检查

gcloud compute health-checks create http l7-ilb-basic-check \
     --region=$region \
     --use-serving-port

创建后端服务

gcloud compute backend-services create l7-ilb-backend-service \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --protocol=HTTP \
    --health-checks=l7-ilb-basic-check \
    --health-checks-region=$region \
    --region=$region

将后端添加到后端服务

gcloud compute backend-services add-backend l7-ilb-backend-service \
    --balancing-mode=UTILIZATION \
    --instance-group=my-service-ig \
    --instance-group-zone=$zone \
    --region=$region

创建网址映射

gcloud compute url-maps create l7-ilb-map \
    --default-service=l7-ilb-backend-service \
    --region=$region

创建目标代理

gcloud compute target-http-proxies create l7-ilb-proxy \
    --url-map=l7-ilb-map \
    --url-map-region=$region \
    --region=$region

创建转发规则

gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --network=producer-net \
    --subnet=producer-subnet \
    --address=l7-ilb-ip-address \
    --ports=80 \
    --region=$region \
    --target-http-proxy=l7-ilb-proxy \
    --target-http-proxy-region=$region

PSC 提供方发布服务

您将使用 PSC 发布服务,其中 connection-preference=ACCEPT_MANUAL 且使用方列表为空。

gcloud compute service-attachments create my-psc-service \
    --region=$region \
 --target-service=projects/$project_id/regions/$region/forwardingRules/l7-ilb-forwarding-rule \
    --connection-preference=ACCEPT_MANUAL \
    --nat-subnets=psc-subnet
export myserver_service_attachment=$(gcloud compute service-attachments describe my-psc-service --region=$region --format="value(selfLink.scope(v1))")

echo $myserver_service_attachment

6. 使用方创建 PSC 端点

为 PSC 端点预留 IP

gcloud compute addresses create myserver-psc-endpoint-ip \
    --region=$region \
    --subnet=consumer-subnet \
    --ip-version=IPV4

创建 PSC 端点

创建 PSC 端点,并在下一步中获取 PSC 端点的 IP 以进行测试。

gcloud compute forwarding-rules create myserver-psc-endpoint \
    --region=$region \
    --network=consumer-net \
    --address=myserver-psc-endpoint-ip \
    --target-service-attachment=$myserver_service_attachment
psc_endpoint_ip=$(gcloud compute forwarding-rules describe myserver-psc-endpoint \
    --region=$region --format="value(IPAddress)")

echo $psc_endpoint_ip

使用方检查 PSC 端点状态

在提供方将 PSC 端点添加到使用方列表之前,连接会显示在使用方端的“已连接的端点”中,状态为“待处理”。

gcloud compute forwarding-rules describe myserver-psc-endpoint \
    --region=$region

您会看到类似以下内容的结果。

IPAddress: 10.20.0.3
allowPscGlobalAccess: false
creationTimestamp: '2026-02-23T16:27:27.920-08:00'
fingerprint: yh_UiYqjHCc=
id: '934193159895862912'
kind: compute#forwardingRule
labelFingerprint: 42WmSpB8rSM=
name: myserver-psc-endpoint
network: https://www.googleapis.com/compute/v1/projects/<project_id>/global/networks/consumer-net
networkTier: PREMIUM
pscConnectionId: '160443618817212419'
pscConnectionStatus: PENDING
region: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint
selfLinkWithId: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/forwardingRules/934193159895862912
serviceDirectoryRegistrations:
- namespace: goog-psc-default
target: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/serviceAttachments/my-psc-service

7. 测试从使用方虚拟机到提供方虚拟机的访问权限

检查 PSC 端点 IP。

echo $psc_endpoint_ip

通过 SSH 连接到名为 myclient 的虚拟机,并测试它是否可以访问 http 80 端口上的 myserver

在 Cloud Shell 中,执行以下操作:

gcloud compute ssh \
    --zone=$zone "myclient" \
    --tunnel-through-iap 

使用 curl 访问您创建的 PSC 端点。

curl -m 10 <psc_endpoint_ip> 

您会看到 curl 命令超时。来自使用方 VPC 的测试客户端无法访问提供方 VPC 中的 HTTP 服务器。

curl: (28) Connection timed out after 10001 milliseconds

退出 SSH 会话,返回到 Cloud Shell。

exit

8. 提供方批准 PSC 端点

提供方检查 PSC 端点状态

在提供方将 PSC 端点添加到使用方列表之前,连接会显示在服务连接中,状态为“待处理”。

gcloud compute service-attachments describe my-psc-service --region=$region 

您会看到类似以下内容的结果。

connectedEndpoints:
- consumerNetwork: https://www.googleapis.com/compute/projects/<project_id>/global/networks/consumer-net
  endpoint: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint
  endpointWithId: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/934193159895862912
  pscConnectionId: '160443618817212419'
  status: PENDING
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2026-02-23T13:27:33.886-08:00'
description: ''
enableProxyProtocol: false
fingerprint: -9EI8FCALrA=
id: '2578692595155826858'
kind: compute#serviceAttachment
name: my-psc-service
natSubnets:
- https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/subnetworks/psc-subnet
pscServiceAttachmentId:
  high: '149466704441770984'
  low: '2578692595155826858'
reconcileConnections: false
region: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1
selfLink: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/serviceAttachments/my-psc-service
targetService: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/l7-ilb-forwarding-rule

获取 PSC 端点的基于 ID 的 URI

PSC 端点的基于 ID 的 URI 是使用方刚刚创建的转发规则的 ID。在上面的示例中,“endpointWithId”是使用方创建的 PSC 端点的 URI。您需要此 URI,以便提供方创建基于端点的访问权限控制。

(请注意,PSC 连接 ID 不是我们要查找的 ID。)

export psc_endpoint_uri=$(gcloud compute service-attachments describe my-psc-service --region=$region --format="value(connectedEndpoints.endpointWithId)")

echo $psc_endpoint_uri

在使用方接受列表中添加 PSC 端点的基于 ID 的 URI

gcloud compute service-attachments update my-psc-service \
    --region=$region \
    --consumer-accept-list=$psc_endpoint_uri

提供方检查 PSC 端点状态

gcloud compute service-attachments describe my-psc-service --region=$region --format="value(connectedEndpoints)"

您会看到类似以下内容的结果。状态已更改为“ACCEPTED”。

{'consumerNetwork': 'https://www.googleapis.com/compute/projects/<project_id>/global/networks/consumer-net', 'endpoint': 'https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint', 'endpointWithId': 'https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/47564871796017232', 'pscConnectionId': '54547416268144643', 'status': 'ACCEPTED'}

9. 测试从使用方虚拟机到提供方虚拟机的访问权限

检查 PSC 端点 IP。

echo $psc_endpoint_ip

通过 SSH 连接到名为 myclient 的虚拟机,并测试它是否可以访问 http 80 端口上的 myserver

在 Cloud Shell 中,执行以下操作:

gcloud compute ssh \
    --zone=$zone "myclient" \
    --tunnel-through-iap 

使用 curl 访问您创建的 PSC 端点。

curl <psc_endpoint_ip>

您会看到 curl 命令成功返回来自 myserver 的响应。来自使用方 VPC 的测试客户端已访问提供方 VPC 中的 HTTP 服务器。

I am a Http Server.

退出 SSH 会话,返回到 Cloud Shell。

exit

10. 清理

清理虚拟机

在 Cloud Shell 中,执行以下操作:

gcloud compute instances delete myserver --zone $zone --quiet
gcloud compute instances delete myclient --zone $zone --quiet

清理 PSC 使用方组件

gcloud compute forwarding-rules delete myserver-psc-endpoint \
    --region=$region --quiet
gcloud compute addresses delete myserver-psc-endpoint-ip \
    --region=$region --quiet

清理 PSC 提供方组件

gcloud compute service-attachments delete my-psc-service \
    --region=$region --quiet
gcloud compute forwarding-rules delete l7-ilb-forwarding-rule \
    --region=$region --quiet
gcloud compute target-http-proxies delete l7-ilb-proxy \
    --region=$region --quiet
gcloud compute url-maps delete l7-ilb-map \
    --region=$region --quiet
gcloud compute backend-services remove-backend l7-ilb-backend-service \
    --instance-group=my-service-ig \
    --instance-group-zone=$zone \
    --region=$region --quiet
gcloud compute backend-services delete l7-ilb-backend-service \
    --region=$region --quiet
gcloud compute health-checks delete l7-ilb-basic-check \
     --region=$region --quiet
gcloud compute instance-groups unmanaged delete my-service-ig \
    --zone=$zone --quiet
gcloud compute addresses delete l7-ilb-ip-address \
    --region=$region --quiet

清理防火墙、Cloud NAT、Cloud Router 和 VPC

gcloud compute network-firewall-policies rules delete 100 \
    --firewall-policy=global-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies rules delete 200 \
    --firewall-policy=global-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies rules delete 300 \
    --firewall-policy=global-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies associations delete \
    --firewall-policy=global-fw-policy \
    --name=producer-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies associations delete \
    --firewall-policy=global-fw-policy \
    --name=consumer-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies delete global-fw-policy \
    --global --quiet
gcloud compute routers nats delete $region-nat \
    --router=$region-cr \
    --region=$region --quiet
gcloud compute routers delete $region-cr \
    --region=$region --quiet
gcloud compute networks subnets delete producer-subnet \
    --region=$region --quiet
gcloud compute networks subnets delete proxy-only-subnet \
    --region=$region --quiet
gcloud compute networks subnets delete psc-subnet \
    --region=$region --quiet
gcloud compute networks delete producer-net --quiet
gcloud compute networks subnets delete consumer-subnet \
    --region=$region --quiet
gcloud compute networks delete consumer-net --quiet

11. 恭喜

您已成功测试 Private Service Connect 提供方基于端点的访问权限控制。