Private Service Connect 接口

1. 简介

Private Service Connect 接口是一项资源,可供提供方虚拟私有云 (VPC) 网络发起与使用方 VPC 网络中各个目标的连接。提供方网络与使用方网络可以位于不同的项目和组织中。

如果某个网络连接接受来自 Private Service Connect 接口的连接,则 Google Cloud 会从该网络连接指定的使用方子网中为该接口分配一个 IP 地址。使用方和提供方网络已连接,可以使用内部 IP 地址进行通信。

网络连接与 Private Service Connect 接口之间的连接类似于 Private Service Connect 端点与服务连接之间的连接,但有以下两个关键区别:

  • 通过网络连接,提供方网络可启动与使用方网络的连接(托管式服务出站流量),而端点可让使用方网络启动与提供方网络的连接(托管式服务入站流量)。
  • Private Service Connect 接口连接具有传递性。这意味着生产者网络可以与连接到使用者网络的其他网络进行通信。

构建内容

在本教程中,您将构建一个综合性 Private Service Connect (PSC) 接口架构,该架构利用云防火墙规则来允许和拒绝从提供方到使用方计算的连接,如图 1 所示。

图 1

d39bf35e55bdf9e6.png

您将在使用方 VPC 中创建单个 psc-network-attachment,产生以下用例:

  1. 创建 Cloud 防火墙规则以允许从熊到狮子进行访问
  2. 创建一条拒绝从熊到老虎的 Cloud 防火墙规则
  3. 创建 Cloud 防火墙规则以允许从 cosmo 访问

学习内容

  • 如何创建网络连接
  • 生产者如何使用网络连接来创建 PSC 接口
  • 如何在提供方与使用方之间建立通信
  • 如何允许从生产者虚拟机 (bear) 访问使用方虚拟机 (lion)
  • 如何阻止从生产者虚拟机 (bear) 到使用方虚拟机 (tiger) 的访问
  • 如何允许从使用方虚拟机 (cosmo) 访问提供方虚拟机 (bear)

所需条件

2. 准备工作

更新项目以支持本教程

本教程利用 $variables 辅助在 Cloud Shell 中实现 gcloud 配置。

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

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

3. 消费者设置

创建使用方 VPC

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

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

创建使用方子网

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

gcloud compute networks subnets create lion-subnet-1 --project=$projectid --range=192.168.20.0/28 --network=consumer-vpc --region=us-central1

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

gcloud compute networks subnets create tiger-subnet-1 --project=$projectid --range=192.168.30.0/28 --network=consumer-vpc --region=us-central1

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

gcloud compute networks subnets create cosmo-subnet-1 --project=$projectid --range=192.168.40.0/28 --network=consumer-vpc --region=us-central1

创建 Private Service Connect 网络连接子网

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

gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1

Cloud Router 和 NAT 配置

本教程使用 Cloud NAT 安装软件包,因为虚拟机实例没有公共 IP 地址。Cloud NAT 使具有专用 IP 地址的虚拟机能够访问互联网。

在 Cloud Shell 中,创建 Cloud Router 路由器。

gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1

在 Cloud Shell 中,创建 NAT 网关。

gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1

4. 启用 IAP

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

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

在 Cloud Shell 中,创建 IAP 防火墙规则。

gcloud compute firewall-rules create ssh-iap-consumer \
    --network consumer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

5. 创建使用方虚拟机实例

在 Cloud Shell 中,创建使用方虚拟机实例 lion。

gcloud compute instances create lion \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=lion-subnet-1 \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the lion app server !!' | tee /var/www/html/index.html
      EOF"

在 Cloud Shell 中,创建使用方虚拟机实例 tiger。

gcloud compute instances create tiger \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=tiger-subnet-1 \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the tiger app server !!' | tee /var/www/html/index.html
      EOF"

在 Cloud Shell 中,创建使用方虚拟机实例 cosmo。

gcloud compute instances create cosmo \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=cosmo-subnet-1 \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the cosmo app server !!' | tee /var/www/html/index.html
      EOF"

获取并存储实例的 IP 地址:

在 Cloud Shell 中,对 lion 和 tiger 虚拟机实例执行描述。

gcloud compute instances describe lion --zone=us-central1-a | grep  networkIP:

gcloud compute instances describe tiger --zone=us-central1-a | grep  networkIP:

gcloud compute instances describe cosmo --zone=us-central1-a | grep  networkIP:

6. Private Service Connect 网络连接

网络连接是代表 Private Service Connect 接口的使用方端的区域级资源。您可以将单个子网与网络连接相关联,然后提供方会从该子网将 IP 分配给 Private Service Connect 接口。子网必须与网络连接位于同一区域。网络连接必须与提供方服务位于同一区域。

创建网络连接

在 Cloud Shell 中,创建网络连接。

gcloud compute network-attachments create psc-network-attachment \
    --region=us-central1 \
    --connection-preference=ACCEPT_MANUAL \
    --producer-accept-list=$projectid \
    --subnets=intf-subnet

列出网络连接

在 Cloud Shell 中,列出网络连接。

gcloud compute network-attachments list

描述网络连接

在 Cloud Shell 中,描述网络连接。

gcloud compute network-attachments describe psc-network-attachment --region=us-central1

记下创建 Private Service Connect 接口时生产者将使用的 psc-network-attachment URI。示例如下:

user@cloudshell$ gcloud compute network-attachments describe psc-network-attachment --region=us-central1 
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2023-06-06T20:57:12.623-07:00'
fingerprint: 4Yq6xAfaRO0=
id: '3235195049527328503'
kind: compute#networkAttachment
name: psc-network-attachment
network: https://www.googleapis.com/compute/v1/projects/$projectid/global/networks/consumer-vpc
producerAcceptLists:
- $projectid
region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1/networkAttachments/psc-network-attachment
subnetworks:
- https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1/subnetworks/intf-subnet

7. Producer 设置

创建提供方 VPC 网络

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

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

创建提供方子网

在 Cloud Shell 中,创建用于 psc 接口的 vNIC0 的子网。

gcloud compute networks subnets create prod-subnet --project=$projectid --range=10.20.1.0/28 --network=producer-vpc --region=us-central1

8. 启用 IAP

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

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

在 Cloud Shell 中,创建 IAP 防火墙规则。

gcloud compute firewall-rules create ssh-iap-producer \
    --network producer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

9. 创建 Private Service Connect 接口

Private Service Connect 接口是一项资源,可供提供方虚拟私有云 (VPC) 网络发起与使用方 VPC 网络中各个目标的连接。提供方网络与使用方网络可以位于不同的项目和组织中。

如果某个网络连接接受来自 Private Service Connect 接口的连接,则 Google Cloud 会从该网络连接指定的使用方子网中为该接口分配一个 IP 地址。使用方和提供方网络已连接,可以使用内部 IP 地址进行通信。

在 Cloud Shell 中,创建 Private Service Connect 接口 (bear),并插入之前从网络连接描述输出中标识的 psc-network-attachment URI

gcloud compute instances create bear --zone us-central1-a --machine-type=f1-micro --can-ip-forward --network-interface subnet=prod-subnet,network=producer-vpc,no-address --network-interface network-attachment=https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1/networkAttachments/psc-network-attachment

多 NIC 验证

验证 PSC 接口配置了正确的 IP 地址。vNIC0 将使用提供方 prod-subnet (10.20.1.0/28),vNIC1 将使用使用方 intf-subnet (192.168.10.0/28)。

gcloud compute instances describe bear --zone=us-central1-a | grep networkIP:

示例:

user$ gcloud compute instances describe bear --zone=us-central1-a | grep networkIP:
  networkIP: 10.20.1.2
  networkIP: 192.168.10.2

10. 更新使用方防火墙规则

创建 Cloud 防火墙规则以允许从熊到狮子进行访问

在 Cloud Shell 中,创建一条优先级更高的规则,以允许从连接子网 (intf-subnet) 的 IP 地址范围 (intf-subnet) 到 lion-subnet-1 地址范围内的目的地的出站流量。

gcloud compute firewall-rules create allow-limited-egress-to-lion \
    --network=consumer-vpc \
    --action=ALLOW \
    --rules=ALL \
    --direction=EGRESS \
    --priority=1000 \
    --source-ranges="192.168.10.0/28" \
    --destination-ranges="192.168.20.0/28" \
    --enable-logging

在 Cloud Shell 中,创建一条入站允许规则,覆盖来自 psc-network-attachment 子网的流量的隐式拒绝入站规则。

gcloud compute firewall-rules create allow-ingress \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="192.168.10.0/28" \
--enable-logging

创建一条 Cloud 防火墙规则,拒绝来自熊到所有范围(包括老虎)的访问

在 Cloud Shell 中,创建一条低优先级规则,以拒绝来自网络连接的子网 intf-subnet 的 IP 地址范围的所有出站流量。

gcloud compute firewall-rules create deny-all-egress \
    --network=consumer-vpc \
    --action=DENY \
    --rules=ALL \
    --direction=EGRESS \
    --priority=65534 \
    --source-ranges="192.168.10.0/28" \
    --destination-ranges="0.0.0.0/0" \
    --enable-logging

创建 Cloud 防火墙规则以允许从 cosmo 访问

在 Cloud Shell 中,创建一条入站允许规则,覆盖来自 psc-network-attachment 子网的流量的隐式拒绝入站规则。

gcloud compute firewall-rules create vm-subnet-allow-ingress \
    --network=consumer-vpc \
    --action=ALLOW \
    --rules=ALL \
    --direction=INGRESS \
    --priority=1000 \
    --source-ranges="192.168.40.0/28" \
    --destination-ranges="192.168.10.0/28" \
    --enable-logging

11. 为 PSC 接口创建 Linux 路由

在 PSC 接口实例中,配置 Linux 路由以允许提供方与使用方子网通信。

查找 Private Service Connect 接口的访客操作系统名称

如需配置路由,您需要知道 Private Service Connect 接口的客机操作系统名称,该名称与 Google Cloud 中接口的名称不同。

在 Cloud Shell 中,打开一个新标签页并执行以下操作:

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

在 Cloud Shell 中使用 IAP 登录 psc-interface 虚拟机 bear。

gcloud compute ssh bear --project=$projectid --zone=us-central1-a --tunnel-through-iap

在 Cloud Shell 中,获取 psc-interface 实例的 IP 地址

ip a

示例:

user@bear:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 42:01:0a:14:01:02 brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    inet 10.20.1.2/32 brd 10.20.1.2 scope global dynamic ens4
       valid_lft 85991sec preferred_lft 85991sec
    inet6 fe80::4001:aff:fe14:102/64 scope link 
       valid_lft forever preferred_lft forever
3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 42:01:c0:a8:0a:02 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    inet 192.168.10.2/32 brd 192.168.10.2 scope global dynamic ens5
       valid_lft 85991sec preferred_lft 85991sec
    inet6 fe80::4001:c0ff:fea8:a02/64 scope link 
       valid_lft forever preferred_lft forever

查找 PSC 接口的网关 IP

在网络接口列表中,查找并存储与 Private Service Connect 接口的 IP 地址关联的接口名称,例如 ens5 (vNIC1)

如需配置路由,您需要知道 Private Service Connect 接口的默认网关的 IP 地址

在 Cloud Shell 中,我们将使用 1,因为 PSC 接口与 vNIC1 相关联。

curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/1/gateway -H "Metadata-Flavor: Google" && echo

示例生成默认 gw 192.168.10.1

user@bear:~$ curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/1/gateway -H "Metadata-Flavor: Google" && echo
192.168.10.1

为使用方子网添加路由

您必须为连接到您的 Private Service Connect 接口的每个使用方子网添加指向 Private Service Connect 接口默认网关的路由。这可确保从 Private Service Connect 接口发送到使用方网络出站流量的流量。

在熊实例中,添加通向使用方子网的路由。

sudo ip route add 192.168.20.0/28 via 192.168.10.1 dev ens5
sudo ip route add 192.168.30.0/28 via 192.168.10.1 dev ens5
sudo ip route add 192.168.40.0/28 via 192.168.10.1 dev ens5

验证路由表

在 Cloud Shell 中,验证新添加的路由。

ip route show

Example.

user@bear:~$ ip route show
default via 10.20.1.1 dev ens4 
10.20.1.0/28 via 10.20.1.1 dev ens4 
10.20.1.1 dev ens4 scope link 
192.168.10.0/28 via 192.168.10.1 dev ens5 
192.168.10.1 dev ens5 scope link 
192.168.20.0/28 via 192.168.10.1 dev ens5 
192.168.30.0/28 via 192.168.10.1 dev ens5 
192.168.40.0/28 via 192.168.10.1 dev ens5 

12. 验证熊和狮子之间的连接是否成功

我们通过执行 curl 命令来确认生产者虚拟机实例 bear 可以与使用方实例 lion 通信。

通过 bear 实例,对本教程前面通过 bear 实例确定的 lion 的 IP 地址执行 curl。

curl -v <lions IP Address>

示例:

user@bear:~$ curl -v 192.168.20.2
*   Trying 192.168.20.2:80...
* Connected to 192.168.20.2 (192.168.20.2) port 80 (#0)
> GET / HTTP/1.1
> Host: 192.168.20.2
> User-Agent: curl/7.74.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Tue, 06 Jun 2023 03:53:08 GMT
< Server: Apache/2.4.56 (Debian)
< Last-Modified: Mon, 05 Jun 2023 19:41:26 GMT
< ETag: "1e-5fd6716a1e11b"
< Accept-Ranges: bytes
< Content-Length: 30
< Content-Type: text/html
< 
Welcome to lion app server !!
* Connection #0 to host 192.168.20.2 left intact

13. 验证熊到老虎的连接是否被阻止

我们来看一下防火墙日志,确认出站流量防火墙规则阻止了熊到虎的访问。

从新的 Cloud 控制台会话导航到 Logging → 日志浏览器 → 选择“显示查询”

2ae597e6d970cddf.png

将下面的查询字符串粘贴到搜索字段中,然后选择直播

jsonPayload.rule_details.reference=&quot;network:consumer-vpc/firewall:deny-all-egress&quot;

30d7bfae315f2ee3

通过 bear 实例,对本教程前面通过 bear 实例确定的老虎 IP 地址执行 curl。curl 最终会超时。

curl -v <tiger's IP Address>

示例:

user@bear:~$ curl -v 192.168.30.2 
*   Trying 192.168.30.2:80...
* connect to 192.168.30.2 port 80 failed: Connection timed out
* Failed to connect to 192.168.30.2 port 80: Connection timed out
* Closing connection 0
curl: (28) Failed to connect to 192.168.30.2 port 80: Connection timed out

验证日志浏览器已捕获拒绝的防火墙日志。选择一个日志条目并展开嵌套字段以查看元数据。

5c42a6587300be55

14. 验证宇宙到熊的连接成功

打开新的 Cloud Shell 标签页并更新您的项目设置。

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

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

在 Cloud Shell 中使用 IAP 登录 Cosmo 实例。

gcloud compute ssh cosmo --project=$projectid --zone=us-central1-a --tunnel-through-iap

在 Cloud Shell 中,对本教程前面部分识别的熊的 IP vNIV1 IP 地址执行 ping 操作

ping <bears vNIC1 IP Address>

示例:

user@cosmo:~$ ping 192.168.10.2 -c 5
PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=0.277 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=0.288 ms
64 bytes from 192.168.10.2: icmp_seq=3 ttl=64 time=0.265 ms
64 bytes from 192.168.10.2: icmp_seq=4 ttl=64 time=0.264 ms
64 bytes from 192.168.10.2: icmp_seq=5 ttl=64 time=0.366 ms

15. 清理

从 Cloud Shell 中删除教程组件。

gcloud compute instances delete bear --zone=us-central1-a --quiet

gcloud compute instances delete lion --zone=us-central1-a --quiet

gcloud compute instances delete tiger --zone=us-central1-a --quiet

gcloud compute instances delete cosmo --zone=us-central1-a --quiet

gcloud compute network-attachments delete psc-network-attachment --region=us-central1 --quiet

gcloud compute firewall-rules delete allow-ingress allow-limited-egress-to-lion deny-all-egress ssh-iap-consumer ssh-iap-producer vm-subnet-allow-ingress --quiet

gcloud compute networks subnets delete cosmo-subnet-1 intf-subnet lion-subnet-1 prod-subnet tiger-subnet-1 --region=us-central1 --quiet

gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet 

gcloud compute networks delete consumer-vpc --quiet

gcloud compute networks delete producer-vpc --quiet

16. 恭喜

恭喜,您已成功通过实施防火墙规则配置并验证了 Private Service Connect 接口以及使用方和提供方连接。

您创建了使用方基础架构,并添加了一个网络连接,以允许提供方创建多 NIC 虚拟机来连接使用方和提供方的通信。您学习了如何在使用方 VPC 网络中创建防火墙规则,以允许连接到使用方和提供方 VPC 中的实例。

Cosmopup 认为教程很棒!!

e6d3675ca7c6911f.jpeg

后续操作

请查看下面的一些教程...

补充阅读材料和视频

参考文档