使用 Private Service Connect 发布和使用服务

1. 简介

借助 Private Service Connect,服务提供方能以私密方式向服务使用方提供服务。Private Service Connect 具有以下优势:

  • 服务提供方 VPC 网络可以支持多个服务使用方。
  • 每个使用方会连接到其定义的内部 IP 地址。Private Service Connect 会执行网络地址转换 (NAT),以将请求路由到服务提供方。

45b90d50690dd111

图 2. Private Service Connect 使用端点和服务连接,使服务使用方能够将流量从使用方的 VPC 网络发送到服务提供方 VPC 网络中的服务(点击可放大)。

学习内容

  • Private Service Connect 的优势
  • 服务使用方的关键概念
  • 服务提供方的主要概念
  • 创建提供方环境
  • 通过服务连接公开服务(提供方环境)
  • 创建使用方环境
  • 在使用方网络中创建转发规则
  • 验证 TCP 使用方访问权限
  • 启用 &验证代理协议
  • 启用政策访问权限控制

所需条件

  • 了解内部负载平衡器
  • 能够在两个项目中创建 VPC

2. Private Service Connect 的优势

与使用 VPC 对等互连相比,使用 PSC 有以下几项优势:

更好地控制专用 IP 空间

  • 作为服务使用方,您可以控制用于连接到要访问的托管式服务的专用 IP 地址。
  • 作为服务使用方,您无需担心为 VPC 中使用的后端服务预留专用 IP 地址范围。您只需从自己的子网中选择一个 IP 地址即可连接到提供方服务。
  • 作为服务提供方,您可以选择部署多租户模型,其中 VPC 包含为多个使用方 VPC 提供服务的服务。子网范围重叠的使用方不会再造成问题。
  • 作为服务提供商,您可以将服务扩展到所需数量的虚拟机实例,而无需联系使用方获取更多 IP 地址。

提高安全性和隔离性

  • 作为服务使用方,只有您可以发起与服务提供方的通信。这种单向连接大大简化了防火墙配置,但是还可以降低来自服务提供方的恶意流量风险。
  • 作为服务提供方,您无需根据使用方 VPC 中的子网范围更改防火墙规则。您只需为为服务配置的 NAT IP 地址范围创建防火墙规则即可。

可伸缩性更高

  • PSC 支持数千个使用方,可实现高度可伸缩的设计,同时可让服务提供方提供扩缩能力极强的多租户或单租户服务。
  • 作为使用 Private Service Connect 的服务使用方,您可以根据需要在 VPC 中创建资源。其规模不受提供方 VPC 中创建的此类资源数量的影响。

3. 服务使用方的主要概念

您可以通过 Private Service Connect 端点来使用 VPC 网络之外的服务。服务使用方创建连接到目标服务的 Private Service Connect 端点。

Endpoints

您可以使用 Private Service Connect 端点连接到目标服务。端点在您的 VPC 网络中具有内部 IP 地址,并且基于转发规则资源。

您向端点发送流量,端点将其转发到 VPC 网络之外的目标。

目标

Private Service Connect 端点具有一个目标,即您要连接的服务:

  • 一个 API 软件包
  • 所有 API:大多数 Google API
  • VPC-SC:VPC Service Controls 支持的 API
  • 其他 VPC 网络中的已发布服务。此服务可以由您自己的组织或第三方管理。

已发布的服务

要将端点连接到服务提供方的服务,您需要使用该服务的服务连接。服务连接 URI 采用以下格式:projects/SERVICE_PROJECT/regions/REGION/serviceAttachments/SERVICE_NAME

4. 面向服务提供方的主要概念

如需向使用方提供某项服务,您可以创建一个或多个专用子网,用于使用方 IP 地址的网络地址转换 (NAT)。然后创建引用这些子网的服务连接

Private Service Connect 子网

为了公开服务,服务提供方首先创建一个或多个子网具有专用 Private Service Connect。

从使用方 VPC 网络发送请求时,系统会使用来源 NAT (SNAT) 将使用方的来源 IP 地址转换为从某个 Private Service Connect 子网中选择的 IP 地址。

如要保留使用方连接 IP 地址信息,请参阅查看使用方连接信息

这些子网不能用于虚拟机实例或转发规则等资源。子网仅用于为传入使用方连接的 SNAT 提供 IP 地址。

对于每 63 个使用方虚拟机,Private Service Connect 子网必须包含至少一个 IP 地址,以便为每个使用方虚拟机分配 1024 个源元组以进行网络地址转换。

Private Service Connect 子网的最小大小为 /24。

服务连接

服务提供方通过服务连接公开其服务。

  • 为了公开服务,服务提供方会创建一个服务连接来引用服务的负载平衡器转发规则。
  • 为了访问服务,服务使用方会创建一个指向该服务连接的端点。

连接偏好设置

创建服务时,您可以选择提供该服务的方式。共有两种选择:

  • 自动接受所有项目的连接 - 任何服务使用方都可以配置端点并自动连接到服务。
  • 接受所选项目的连接 - 服务使用方配置端点以连接到服务,服务提供方会接受或拒绝连接请求。

5. 测试环境

使用方网络包含一个 TCP 静态 IP 地址(用于向服务提供方发起请求),以及映射到提供方的服务连接(已发布的服务)的目标服务连接。

现在,我们来了解一下生产者网络。请注意,生产者网络没有到使用者网络的映射,相反,生产者网络包含使用者用于服务的服务连接(发布的服务)。在我们的实验中,提供方的服务连接是映射到支持 TCP 应用的后端服务的第 4 层内部负载平衡器(提供方-转发规则)。

NAT 子网和关联的防火墙规则允许与生产者应用通信。

28b09284a99eb60b

自定进度的环境设置

  1. 登录 Cloud 控制台,然后创建一个新项目或重复使用现有项目。 如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

96a9c957bc475304

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

请记住项目 ID,它在所有 Google Cloud 项目中都是唯一的名称(上述名称已被占用,您无法使用,抱歉!)。它稍后将在此 Codelab 中被称为 PROJECT_ID

  1. 接下来,您需要在 Cloud 控制台中启用结算功能,才能使用 Google Cloud 资源。

运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。请务必按照“清理”部分部分,其中会指导您如何关停资源,以免产生超出本教程范围的结算费用。Google Cloud 的新用户符合参与 300 美元的免费试用计划的条件。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

bce75f34b2c53987.png

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

f6ef2b5f13479f3a.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。只需一个浏览器,即可完成本实验中的所有工作。

6. 准备工作

Codelab 需要两个项目,但对 PSC 而言并不是必需的。请记下这些参考来支持单个或多个项目。

单个项目 - 更新项目以支持提供方和使用方网络

在 Cloud Shell 中,确保已设置项目 ID

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
consumerproject=YOUR-PROJECT-NAME
echo $prodproject
echo $consumerproject

多个项目 - 更新项目以支持提供方网络

在 Cloud Shell 中,确保已设置项目 ID

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

7. 创建提供方 VPC 网络

注意:在下一部分,请在包含您的 Producer Service 的项目中执行配置更新

VPC 网络

通过 Cloud Shell

gcloud compute networks create vpc-demo-producer --project=$prodproject --subnet-mode=custom

创建子网

通过 Cloud Shell

gcloud compute networks subnets create vpc-demo-us-west2 --project=$prodproject --range=10.0.2.0/24 --network=vpc-demo-producer --region=us-west2

创建 Cloud NAT 实例

Cloud NAT 与用于 PSC 的 NAT 不同。Cloud NAT 专门用于访问互联网以下载应用软件包。

创建 Cloud Router

通过 Cloud Shell

gcloud compute routers create crnatprod --network vpc-demo-producer --region us-west2

创建 Cloud NAT

通过 Cloud Shell

gcloud compute routers nats create cloudnatprod --router=crnatprod --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --enable-logging --region us-west2

8. 创建计算实例

通过 Cloud Shell 创建实例 www-01

gcloud compute instances create www-01 \
    --zone=us-west2-a \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --subnet=vpc-demo-us-west2 --no-address \
    --metadata=startup-script='#! /bin/bash
apt-get update
apt-get install tcpdump -y
apt-get install apache2 -y
a2ensite default-ssl
apt-get install iperf3 -y
a2enmod ssl
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
filter="{print \$NF}"
vm_zone="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/zone \
| awk -F/ "${filter}")"
echo "Page on $vm_hostname in $vm_zone" | \
tee /var/www/html/index.html
systemctl restart apache2
iperf3 -s -p 5050'

通过 Cloud Shell 创建实例 www-02

gcloud compute instances create www-02 \
    --zone=us-west2-a \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --subnet=vpc-demo-us-west2 --no-address \
    --metadata=startup-script='#! /bin/bash
apt-get update
apt-get install tcpdump -y
apt-get install apache2 -y
a2ensite default-ssl
apt-get install iperf3 -y
a2enmod ssl
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
filter="{print \$NF}"
vm_zone="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/zone \
| awk -F/ "${filter}")"
echo "Page on $vm_hostname in $vm_zone" | \
tee /var/www/html/index.html
systemctl restart apache2
iperf3 -s -p 5050'

9. 创建非托管式实例组

创建由 www-01 和www-02

通过 Cloud Shell

gcloud compute instance-groups unmanaged create vpc-demo-ig-www --zone=us-west2-a

gcloud compute instance-groups unmanaged add-instances vpc-demo-ig-www --zone=us-west2-a --instances=www-01,www-02

gcloud compute health-checks create http hc-http-80 --port=80

10. 创建 TCP 后端服务、转发规则和防火墙

通过 Cloud Shell 创建后端服务

gcloud compute backend-services create vpc-demo-www-be-tcp --load-balancing-scheme=internal --protocol=tcp --region=us-west2 --health-checks=hc-http-80

gcloud compute backend-services add-backend vpc-demo-www-be-tcp --region=us-west2 --instance-group=vpc-demo-ig-www --instance-group-zone=us-west2-a

在 Cloud Shell 中,创建转发规则

gcloud compute forwarding-rules create vpc-demo-www-ilb-tcp --region=us-west2 --load-balancing-scheme=internal --network=vpc-demo-producer --subnet=vpc-demo-us-west2 --address=10.0.2.10 --ip-protocol=TCP --ports=all --backend-service=vpc-demo-www-be-tcp --backend-service-region=us-west2

在 Cloud Shell 中,创建防火墙规则以启用后端健康检查

gcloud compute firewall-rules create vpc-demo-health-checks --allow tcp:80,tcp:443 --network vpc-demo-producer --source-ranges 130.211.0.0/22,35.191.0.0/16 --enable-logging

要允许 IAP 连接到您的虚拟机实例,请创建以下防火墙规则:

  • 适用于您希望可以使用 IAP 访问的所有虚拟机实例。
  • 允许来自 IP 范围 35.235.240.0/20 的入站流量。此范围包含 IAP 用于 TCP 转发的所有 IP 地址。

通过 Cloud Shell

gcloud compute firewall-rules create psclab-iap-prod --network vpc-demo-producer --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

11. 创建 TCP NAT 子网

通过 Cloud Shell

gcloud compute networks subnets create vpc-demo-us-west2-psc-tcp --network=vpc-demo-producer --region=us-west2 --range=192.168.0.0/24 --purpose=private-service-connect

12. 创建 TCP 服务连接和防火墙规则

通过 Cloud Shell 创建 TCP 服务连接

gcloud compute service-attachments create vpc-demo-psc-west2-tcp --region=us-west2 --producer-forwarding-rule=vpc-demo-www-ilb-tcp --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=vpc-demo-us-west2-psc-tcp

验证 TCP 服务连接

gcloud compute service-attachments describe vpc-demo-psc-west2-tcp --region us-west2

在 Cloud Shell 中,创建允许 TCP NAT 子网访问 ILB 后端的防火墙规则

gcloud compute --project=$prodproject firewall-rules create vpc-demo-allowpsc-tcp --direction=INGRESS --priority=1000 --network=vpc-demo-producer --action=ALLOW --rules=all --source-ranges=192.168.0.0/24 --enable-logging

13. 创建使用方 VPC 网络

注意:在下一部分,请在包含您的使用方服务的项目中执行配置更新

在下面的部分中,使用方 VPC 在单独的项目中配置。使用方与提供方网络之间的通信通过使用方网络中定义的服务连接完成。

VPC 网络

Codelab 需要两个项目,但对 PSC 而言并不是必需的。请记下这些参考来支持单个或多个项目。

单个项目 - 更新项目以支持提供方和使用方网络

在 Cloud Shell 中,确保已设置项目 ID

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
consumerproject=YOUR-PROJECT-NAME
prodproject=YOUR-PROJECT-NAME
echo $prodproject
echo $consumerproject

多个项目 - 更新项目以支持使用者网络

在 Cloud Shell 中,确保已设置项目 ID

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
consumerproject=YOUR-PROJECT-NAME
echo $consumerproject

通过 Cloud Shell

gcloud compute networks create vpc-demo-consumer --project=$consumerproject --subnet-mode=custom

为 PSC 创建子网

通过 Cloud Shell

gcloud compute networks subnets create consumer-subnet --project=$consumerproject  --range=10.0.60.0/24 --network=vpc-demo-consumer --region=us-west2

为 TCP 应用创建静态 IP 地址

通过 Cloud Shell

gcloud compute addresses create vpc-consumer-psc-tcp --region=us-west2 --subnet=consumer-subnet --addresses 10.0.60.100

创建防火墙规则

要允许 IAP 连接到您的虚拟机实例,请创建以下防火墙规则:

  • 适用于您希望可以使用 IAP 访问的所有虚拟机实例。
  • 允许来自 IP 范围 35.235.240.0/20 的入站流量。此范围包含 IAP 用于 TCP 转发的所有 IP 地址。

通过 Cloud Shell

gcloud compute firewall-rules create psclab-iap-consumer --network vpc-demo-consumer --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

虽然对于 PSC 而言没有这一要求,但创建出站防火墙规则来监控流向提供方服务连接的使用方 PSC 流量

gcloud compute --project=$consumerproject firewall-rules create vpc-consumer-psc --direction=EGRESS --priority=1000 --network=vpc-demo-consumer --action=ALLOW --rules=all --destination-ranges=10.0.60.0/24 --enable-logging

创建 Cloud NAT 实例

Cloud NAT 与用于 PSC 的 NAT 不同。Cloud NAT 明确用于访问互联网以下载应用软件包

创建 Cloud Router

通过 Cloud Shell

gcloud compute routers create crnatconsumer --network vpc-demo-consumer --region us-west2

创建 Cloud NAT

通过 Cloud Shell

gcloud compute routers nats create cloudnatconsumer --router=crnatconsumer --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --enable-logging --region us-west2

14. 创建测试实例虚拟机

通过 Cloud Shell

gcloud compute instances create test-instance-1 \
    --zone=us-west2-a \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --subnet=consumer-subnet --no-address \
    --metadata=startup-script='#! /bin/bash
apt-get update
apt-get install iperf3 -y
apt-get install tcpdump -y'

15. 创建 TCP 服务连接

通过 Cloud Shell

gcloud compute forwarding-rules create vpc-consumer-psc-fr-tcp --region=us-west2 --network=vpc-demo-consumer --address=vpc-consumer-psc-tcp --target-service-attachment=projects/$prodproject/regions/us-west2/serviceAttachments/vpc-demo-psc-west2-tcp

16. 验证

我们将使用 C网址、TCPDUMP 和防火墙日志以验证使用方与提供方通信。

在使用方的项目中,静态 IP 地址用于发起与提供方的通信。系统会通过执行以下语法验证静态 IP 地址到使用方转发规则的这种映射。

注意:在下一部分,请在包含您的使用方服务的项目中执行配置更新

在使用方 VPC Cloud Shell 中,识别 TCP 转发规则和静态 IP

gcloud compute forwarding-rules describe vpc-consumer-psc-fr-tcp --region us-west2

输出:

IPAddress: 10.0.60.100
IPProtocol: TCP
creationTimestamp: '2021-07-14T13:34:23.359-07:00'
id: '2768158450402915488'
kind: compute#forwardingRule
labelFingerprint: 42WmSpB8rSM=
name: vpc-consumer-psc-fr-tcp
<snip>

17. TCP 验证

注意:在下一部分,请在包含您的 Producer Service 的项目中执行配置更新

Producer Project 中,找到“www-01”&amp;“www-02”并为每个实例启动一个 SSH 会话。

6d0bb8c5cb115876

从“www-01”执行 TCPDUMP 来监控 NAT

sudo tcpdump -i any net 192.168.0.0/16 -n

从“www-02”执行 TCPDUMP 来监控 NAT

sudo tcpdump -i any net 192.168.0.0/16 -n

注意:在下一部分,请在包含您的使用方服务的项目中执行配置更新

使用方项目中,找到“test-instance-1”并启动两个会话

从“test-instance-1”会话一执行 TCPDUMP 以监控使用方

sudo tcpdump -i any host 10.0.60.100 -n

从“test-instance-1”会话二执行 TCP 验证

curl -v 10.0.60.100 

18. 观察结果 - 消费者

从“test-instance-1”会话二的 C网址 成功运行,并生成 200 OK。

@test-instance-1:~$ curl -v 10.0.60.100 
* Rebuilt URL to: 10.0.60.100/
*   Trying 10.0.60.100...
* TCP_NODELAY set
* Connected to 10.0.60.100 (10.0.60.100) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.0.60.100
> User-Agent: curl/7.52.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Wed, 14 Jul 2021 21:20:22 GMT
< Server: Apache/2.4.25 (Debian)
< Last-Modified: Wed, 14 Jul 2021 20:09:09 GMT
< ETag: "1d-5c71aed5edabd"
< Accept-Ranges: bytes
< Content-Length: 29
< Content-Type: text/html
< 
Page on www-01 in us-west2-a
* Curl_http_done: called premature == 0
* Connection #0 to host 10.0.60.100 left intact

从“test-instance-1”会话一 TCPDUMP 标识虚拟机实例 → TCP 静态 IP 通信和响应

21:20:22.572052 IP 10.0.60.2.59432 > 10.0.60.100.80: Flags [P.], seq 1:76, ack 1, win 222, options [nop,nop,TS val 634554 ecr 998739], length 75: HTTP: GET / HTTP/1.1

21:20:22.572688 IP 10.0.60.100.80 > 10.0.60.2.59432: Flags [P.], seq 1:257, ack 76, win 220, options [nop,nop,TS val 998739 ecr 634554], length 256: HTTP: HTTP/1.1 200 OK

防火墙日志记录

使用日志浏览器验证防火墙规则“vpc-consumner-psc”正在捕获虚拟机实例与静态 IP 之间的流

  1. 在 Cloud 控制台中,确定 Operations Logging → 日志浏览器
  2. 在“Query”(查询)字段中,使用 yourconsumerproject 更新以下条目,然后选择“Run Query”(运行查询)

logName:(projects/yourconsumerproject/logs/compute.googleapis.com%2Ffirewall) AND jsonPayload.rule_details.reference:("network:vpc-demo-consumer/firewall:vpc-consumer-psc")

  1. 查询结果按所提供的屏幕截图提供以下内容

b573c878a8d6d01f.png

  1. 展开日志并确定下方提供的输出。记下 dest_ip:10.0.60.100 是 STATIC TCP IP,src_ip: 10.0.60.2 是虚拟机实例 IP 地址

1b4f46b3e61f6f12

19. 观察结果 - Producer

从后端实例“www-01”或“www-02”观察到 TCP NAT 子网和 TCP ILB 之间的以下通信。

21:20:22.572186 IP 192.168.0.2.1024 > 10.0.2.10.80: Flags [P.], seq 1:76, ack 1, win 222, options [nop,nop,TS val 634554 ecr 998739], length 75: HTTP: GET / HTTP/1.1

21:20:22.572679 IP 10.0.2.10.80 > 192.168.0.2.1024: Flags [P.], seq 1:257, ack 76, win 220, options [nop,nop,TS val 998739 ecr 634554], length 256: HTTP: HTTP/1.1 200 OK

20. 防火墙日志记录

使用日志浏览器验证防火墙规则“vpc-demo-allowpsc-tcp”正在捕获 TCP NATTCP ILB 流:

  1. 在 Cloud 控制台中,确定 Operations Logging → 日志浏览器
  2. 在“查询”字段中,使用 yourprodproject 更新以下条目,然后选择“运行查询”

logName:(projects/yourprodproject/logs/compute.googleapis.com%2Ffirewall) AND jsonPayload.rule_details.reference:("network:vpc-demo-producer/firewall:vpc-demo-allowpsc-tcp")

  1. 查询结果按所提供的屏幕截图提供以下内容

8ce6b0d17d76ad6d.png

  1. 展开日志并确定下方提供的输出。记下 TCP ILB dest_ip: 10.0.2.10 和 NAT TCP source_range (192.168.0.0/24) 和相应的 src_ip: 192.168.0.2。

e157a7af8cb667e.png

21. 启用代理协议

默认情况下,Private Service Connect 会将使用方的来源 IP 地址转换为服务提供方 VPC 网络中某个 Private Service Connect 子网中的地址。如果您想查看使用方的原始来源 IP 地址,可以启用 PROXY 协议。如果启用了 PROXY 协议,您可以从 PROXY 协议标头获取使用方的来源 IP 地址和 PSC 连接 ID。

e9d1c49971b10ed0.png

文档参考文档

删除提供方发布的服务

注意:在下一部分,请在包含您的 Producer Service 的项目中执行配置更新

从 Cloud Shell 删除 TCP 服务连接

gcloud compute service-attachments delete vpc-demo-psc-west2-tcp --region=us-west2 --quiet

从 Cloud Shell 验证服务连接是否已删除(列出了 0 项)

gcloud compute service-attachments list

创建 TCP 服务连接并启用代理协议

gcloud compute service-attachments create vpc-demo-psc-west2-tcp --region=us-west2 \
--producer-forwarding-rule=vpc-demo-www-ilb-tcp \
--connection-preference=ACCEPT_AUTOMATIC \
--nat-subnets=vpc-demo-us-west2-psc-tcp \
--enable-proxy-protocol

通过 Cloud Shell 验证在启用代理协议的情况下创建服务连接 (true)

gcloud compute service-attachments describe vpc-demo-psc-west2-tcp --region=us-west2 | grep -i enableProxyProtocol:

注意:在下一部分,请在包含您的使用方服务的项目中执行配置更新

从 Cloud Shell 删除 TCP 转发规则

gcloud compute forwarding-rules delete vpc-consumer-psc-fr-tcp --region=us-west2 --quiet

重新创建 TCP 转发规则以与先前创建的(提供方)服务连接相关联

通过 Cloud Shell 创建 TCP 转发规则

gcloud compute forwarding-rules create vpc-consumer-psc-fr-tcp \
--region=us-west2 --network=vpc-demo-consumer \
--address=vpc-consumer-psc-tcp \
--target-service-attachment=projects/$prodproject/regions/us-west2/serviceAttachments/vpc-demo-psc-west2-tcp

代理协议验证

注意:在下一部分,请在包含您的 Producer Service 的项目中执行配置更新

Producer Project 中,找到“www-01”&amp;“www-02”并为每个实例启动一个会话

6d0bb8c5cb115876

从“www-01”执行 TCPDUMP 来监控 NAT

sudo tcpdump -nnvvXSs 1514 net 192.168.0.0/16

从“www-02”执行 TCPDUMP 来监控 NAT

sudo tcpdump -nnvvXSs 1514 net 192.168.0.0/16

注意:在下一部分,请在包含您的使用方服务的项目中执行配置更新

使用方项目中,找到“test-instance-1”并启动单个会话

从“test-instance-1”会话,执行 curl

curl 10.0.60.100 

观察结果 - 消费者

请注意,如果启用了 PROXY Protocol v2 但应用程序未配置为支持它,则按照以下示例从客户端连接时,系统会显示一条错误消息。需要 Apache 更新,以适应额外的代理 v2 标头和其他类型。

从“test-instance-1”尽管后端查询成功,会话 C网址 仍会产生预期的 400 Bad 请求。

@test-instance-1:~$ curl 10.0.60.100 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.4.25 (Debian) Server at www-02.c.deepakmichaelprod.internal Port 80</address>

观察结果 - 消费者

从后端实例“www-01”或“www-02”使用捕获中嵌入的代理协议观察 TCP NAT 子网和 TCP ILB 之间的以下通信。

在大多数情况下,tcpdump 中的第 3 个数据包包含相关代理协议信息元素 (IE)。(可选)标识包含代理协议 IE 的 39 字节数据包。

192.168.0.3.1025 > 10.0.2.10.80: Flags [P.], cksum 0xb617 (correct), seq 2729454396:2729454435, ack 1311105819, win 28160, length 39: HTTP
        0x0000:  4500 004f 0000 4000 4006 6df4 c0a8 0003  E..O..@.@.m.....
        0x0010:  0a00 020a 0401 0050 a2b0 2b3c 4e25 e31b  .......P..+<N%..
        0x0020:  5018 6e00 b617 0000 0d0a 0d0a 000d 0a51  P.n............Q
        0x0030:  5549 540a 2111 0017 0a00 3c02 0a00 3c64  UIT.!.....<...<d
        0x0040:  8138 0050 e000 0800 9b34 d70a 003c 64    .8.P.....4...<d

在数据包捕获中找出 PROXY 协议签名:0d0a0d0a000d0a515549540a

通过标识代理协议签名,可以将其分解并解码,如下所示:

PROXY 协议签名:0d0a0d0a000d0a515549540a

其他代理协议字段:21 11 00 17

IP 和端口:0a003c02 0a003c64 8138 0050

TLV 类型:e0

TLV 长度:00 08

pscConnection ID:009b34d70a003c64

十六进制颜色值

小数 / IP

PROXY 协议签名

0d0a0d0a000d0a515549540a

版本、协议、长度

21 11 0017

SRC IP

0a003c02

10.0.60.2

Dst IP

0a003c64

10.0.60.100

Src 端口

8138

33080

Dst 端口

0050

80

TLV 类型 (PP2_TYPE_GCP)

e0

TLV 长度

0008

pscConnectionId

00004dde290a003c64

43686719580552292

您也可以通过如下所述描述使用方转发规则并确保其匹配来验证 pscConnectionId:

注意:在下一部分,请在包含您的使用方服务的项目中执行配置更新

通过 Cloud Shell 描述 TCP 转发规则

gcloud compute forwarding-rules describe vpc-consumer-psc-fr-tcp --region=us-west2

描述 pscConnectionID 的输出

$ gcloud compute forwarding-rules describe vpc-consumer-psc-fr-tcp --region=us-west2
IPAddress: 10.0.60.100
IPProtocol: TCP
creationTimestamp: '2021-07-14T16:50:31.766-07:00'
id: '4443494505307621032'
kind: compute#forwardingRule
labelFingerprint: 42WmSpB8rSM=
name: vpc-consumer-psc-fr-tcp
network: https://www.googleapis.com/compute/v1/projects/deepakmichaeldev/global/networks/vpc-demo-consumer
networkTier: PREMIUM
pscConnectionId: '43686719580552292'
pscConnectionStatus: ACCEPTED

22. 连接政策

对于已发布的服务,您可以在自动接受和明确接受项目之间切换。

从自动接受更改为明确接受不会影响在此项更改之前已连接到服务的使用方端点。现有使用方端点可以连接到已发布的服务,直到服务连接被删除为止。必须先接受新的使用方端点,然后才能连接到服务。如需了解详情,请参阅管理对已发布服务的访问权限请求

在本实验的这一部分中,您将修改提供方的连接政策,以明确批准使用方的服务连接。

注意:在下一部分,请在包含您的 Producer Service 的项目中执行配置更新

在生产者服务 Cloud Shell 中,将连接偏好设置政策从“自动接受”更新为“手动接受”

gcloud compute service-attachments update vpc-demo-psc-west2-tcp --region=us-west2 --connection-preference ACCEPT_MANUAL

确定端点状态,方法是依次转到“网络服务”→“Private Service Connect”→“已发布的服务”→“vpc-demo-psc-west2-tcp”vpc-demo-psc-west2-tcp→“已连接的项目”

e1d90d1563e10731.png

请注意,使用方项目已更改为“Pending”状态。

在 Cloud Shell 中执行以下命令,以接受使用方项目,确保使用适当的项目名称进行更新

gcloud compute service-attachments update vpc-demo-psc-west2-tcp --region=us-west2 --consumer-accept-list $consumerproject=20

确定端点状态,方法是依次转到“网络服务”→“Private Service Connect”→“已发布的服务”→“vpc-demo-psc-west2-tcp”vpc-demo-psc-west2-tcp→“已连接的项目”

35cba9ac640594a2

请注意,使用方项目已更改为“Accepted”(已接受)状态。

23. 清理步骤

提供方网络清理步骤

注意:在下一部分,请在包含您的 Producer Service 的项目中执行配置更新

通过 Producer 项目终端中的单个 Cloud Shell 删除实验组件

gcloud compute routers nats delete cloudnatprod --router=crnatprod --region=us-west2 --quiet

gcloud compute routers delete crnatprod --region=us-west2 --quiet

gcloud compute instances delete www-01 --zone=us-west2-a --quiet

gcloud compute instances delete www-02 --zone=us-west2-a --quiet

gcloud compute service-attachments delete vpc-demo-psc-west2-tcp --region=us-west2 --quiet

gcloud compute forwarding-rules delete vpc-demo-www-ilb-tcp --region=us-west2 --quiet

gcloud compute backend-services delete vpc-demo-www-be-tcp --region=us-west2 --quiet

gcloud compute instance-groups unmanaged delete vpc-demo-ig-www --zone=us-west2-a --quiet

gcloud compute health-checks delete hc-http-80 --quiet

gcloud compute firewall-rules delete vpc-demo-allowpsc-tcp --quiet

gcloud compute firewall-rules delete vpc-demo-health-checks --quiet

gcloud compute firewall-rules delete psclab-iap-prod --quiet

gcloud compute networks subnets delete vpc-demo-us-west2 --region=us-west2 --quiet

gcloud compute networks subnets delete vpc-demo-us-west2-psc-tcp --region=us-west2 --quiet

gcloud compute networks delete vpc-demo-producer --quiet

注意:在下一部分,请在包含您的使用方服务的项目中执行配置更新

使用方网络清理步骤

通过 Producer 项目终端中的单个 Cloud Shell 删除实验组件

gcloud compute routers nats delete cloudnatconsumer --router=crnatconsumer --region=us-west2 --quiet

gcloud compute routers delete crnatconsumer --region=us-west2 --quiet

gcloud compute instances delete test-instance-1 --zone=us-west2-a --quiet

gcloud compute forwarding-rules delete vpc-consumer-psc-fr-tcp --region=us-west2 --quiet

gcloud compute addresses delete vpc-consumer-psc-tcp --region=us-west2 --quiet

gcloud compute firewall-rules delete psclab-iap-consumer --quiet

gcloud compute networks subnets delete consumer-subnet --region=us-west2 --quiet

gcloud compute firewall-rules delete vpc-consumer-psc --quiet

gcloud compute networks delete vpc-demo-consumer --quiet

24. 恭喜!

恭喜您完成此 Codelab。

所学内容

  • Private Service Connect 的优势
  • 服务使用方的关键概念
  • 服务提供方的主要概念
  • 创建提供方环境
  • 通过服务连接公开服务(提供方环境)
  • 创建使用方环境
  • 在使用方网络中创建转发规则
  • 验证 TCP 使用方访问权限
  • 启用 &验证代理协议
  • 启用政策访问权限控制