使用 Private Service Connect 發布及使用服務

1. 簡介

服務供應商可透過 Private Service Connect,以不公開的方式向服務使用者提供服務。Private Service Connect 具備下列優點:

  • 服務供應商虛擬私有雲網路可以支援多個服務用戶。
  • 每個用戶端都會連線至他們定義的內部 IP 位址。Private Service Connect 會執行網路位址轉譯 (NAT),以便將要求轉送至服務供應商。

45b90d50690dd111.png

圖 2. Private Service Connect 會使用端點和服務連結,讓服務用戶將流量從消費者的虛擬私有雲網路,傳送到服務供應商的虛擬私有雲網路中的服務 (按一下可放大)。

課程內容

  • Private Service Connect 的優點
  • 給服務消費者的重要概念
  • 服務供應商的重要概念
  • 建立生產端環境
  • 透過服務連結公開服務 (生產端環境)
  • 建立消費者環境
  • 在消費者網路中建立轉送規則
  • 驗證 TCP 消費者存取權
  • 啟用 &驗證 Proxy 通訊協定
  • 啟用政策存取權控管

軟硬體需求

  • 內部負載平衡器相關知識
  • 能夠在兩個專案中建立虛擬私有雲

2. Private Service Connect 的優點

相較於使用虛擬私有雲對等互連,PSC 具備以下優點:

更妥善地控管私人 IP 空間

  • 身為服務用戶,您可以控管用於連線至您要存取的代管服務的私人 IP 位址。
  • 身為服務用戶,您無須擔心為虛擬私有雲中所用的後端服務保留私人 IP 位址範圍。您只需要從自有子網路選擇 IP 位址,即可連線至供應商服務。
  • 身為服務供應商,您可以選擇部署多用戶群模型,您的虛擬私有雲含有為多個消費者虛擬私有雲提供服務的服務。子網路範圍重疊的取用者不會再造成問題。
  • 身為服務供應商,您可根據需求將服務擴充至所需的 VM 執行個體數量,無須向消費者提供更多 IP 位址。

提升安全性和隔離效能

  • 身為服務用戶,只有您可以與服務供應商進行通訊。這種單向連線可大幅簡化防火牆設定,同時降低來自服務供應商流量的惡意流量風險。
  • 身為服務供應商,您不需要根據消費者虛擬私有雲中的子網路範圍來變更防火牆規則。您只需針對服務設定的 NAT IP 位址範圍,建立防火牆規則即可。

提升擴充性

  • PSC 支援數千個消費者,實現擴充性高的設計,同時可讓服務生產端提供高擴充性的多用戶群或單一用戶群服務。
  • 如果您是使用私人服務連線的服務用戶,您可以視需要在虛擬私有雲中建立資源。規模不會受到在生產端虛擬私有雲中建立的這類資源數量影響。

3. 給服務消費者的重要概念

您可以透過 Private Service Connect 端點使用虛擬私有雲網路以外的服務。服務用戶建立會連線至目標服務的 Private Service Connect 端點。

端點

您會使用 Private Service Connect 端點連線至目標服務。端點在您的虛擬私有雲網路中具有內部 IP 位址,並以轉送規則資源為基礎。

您將流量傳送至端點,該端點會將流量轉送至虛擬私有雲網路以外的目標。

目標

Private Service Connect 端點有目標,也就是您要連結的服務:

  • API 套件
  • 所有 API:大多數 Google API
  • VPC-SC:VPC Service Controls 支援的 API
  • 其他虛擬私有雲網路中的已發布服務。這項服務可由您的機構或第三方管理。

已發布的服務

如要將端點連線至服務供應商的服務,您需要該服務的服務連結。服務連結 URI 的格式如下:projects/SERVICE_PROJECT/regions/REGION/serviceAttachments/SERVICE_NAME

4. 服務供應商的重要概念

如要向用戶提供服務,您可以建立一或多個專用子網路,用於轉譯用戶 IP 位址的網路位址轉譯 (NAT)。然後建立參照這些子網路的服務連結

Private Service Connect 子網路

如要公開服務,服務供應商會先使用用途的 Private Service Connect 建立一或多個子網路

從消費者虛擬私有雲網路發出要求時,系統會使用來源 NAT (SNAT) 將用戶端的來源 IP 位址轉譯為從其中一個 Private Service Connect 子網路選取的 IP 位址。

如要保留用戶連線 IP 位址資訊,請參閱查看用戶連線資訊

這些子網路無法用於 VM 執行個體或轉送規則等資源。子網路只會用於為傳入的消費者連線提供 IP 位址,以供 SNAT 使用。

Private Service Connect 子網路每 63 個消費者 VM 都必須包含至少一個 IP 位址,以便讓每個消費者 VM 分配 1,024 個用於網路位址轉譯的來源元組。

Private Service Connect 子網路的大小下限為 /24。

服務連結

服務供應商透過服務連結公開服務。

  • 如要公開服務,服務供應商會建立參照服務的負載平衡器轉送規則的服務連結。
  • 為了存取服務,服務用戶會建立參照服務連結的端點。

連線偏好設定

建立服務時,您必須選擇服務的提供方式。系統提供以下兩個選項:

  • 自動接受所有專案的連線,所有服務用戶都可以設定端點並自動連線至服務。
  • 接受所選專案的連線:服務用戶設定用來連線至服務的端點,而服務供應商則會接受或拒絕連線要求。

5. 測試環境

消費者網路包含用來向服務供應商發出要求的 TCP 靜態 IP 位址,以及對應至生產端服務連結 (已發布的服務) 的 target-service-attachment。

接著來看看生產端網路。請注意,生產者網路無法對應消費者網路,而是由供應商網路包含取用端服務使用的服務連結 (已發布的服務)。在本研究室中,生產端的服務連結是對應至支援 TCP 應用程式的後端服務的第 4 層內部負載平衡器 (生產端轉發-規則)。

NAT 子網路和相關防火牆規則允許與生產端應用程式進行通訊。

28b09284a99eb60b.png

自修環境設定

  1. 登入 Cloud 控制台建立新專案,或是重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

提醒您,專案 ID 是所有 Google Cloud 專案的專屬名稱 (已經有人使用上述名稱,很抱歉對您不符!)。稍後在本程式碼研究室中會稱為 PROJECT_ID

  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Google Cloud 資源。

執行這個程式碼研究室並不會產生任何費用,如果有的話。請務必依照「清除所用資源」一節指示本節將說明如何關閉資源,這樣您就不會產生本教學課程結束後產生的費用。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

在 GCP 控制台的右上方,按一下「Cloud Shell」圖示:

bce75f34b2c53987.png

佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:

f6ef2b5f13479f3a.png

這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。這個研究室中的所有工作都可以透過瀏覽器完成。

6. 事前準備

本程式碼研究室需要兩個專案,但 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. 建立生產端虛擬私有雲網路

注意:在下一節中,請在包含 Producer Service 的專案中執行設定更新。

虛擬私有雲網路

透過 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 連線至您的 VM 執行個體,請建立下列防火牆規則:

  • 適用於您要透過 IAP 存取的所有 VM 執行個體。
  • 允許來自 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. 建立用戶虛擬私有雲網路

注意:在下一節中,請在包含用戶端服務的專案中執行設定更新作業

在下一節中,消費者虛擬私有雲是在不同的專案中設定。用戶端與生產端網路間的通訊是透過消費者網路中定義的服務連結來完成。

虛擬私人雲端網路

本程式碼研究室需要兩個專案,但 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 連線至您的 VM 執行個體,請建立下列防火牆規則:

  • 適用於您要透過 IAP 存取的所有 VM 執行個體。
  • 允許來自 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. 建立測試執行個體 VM

透過 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. 驗證

我們將使用 CURL、TCPDUMP 和防火牆記錄檔,以驗證用戶和生產端的通訊。

在 Consumer 專案中,靜態 IP 位址是用來向生產者發出通訊。以下語法驗證將靜態 IP 位址對應至消費者轉送規則。

注意:在下一節中,請在包含用戶端服務的專案中執行設定更新作業

透過消費者虛擬私有雲 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.png

來自「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

注意:在下一節中,請在包含用戶端服務的專案中執行設定更新作業

Consumer Project (消費者專案) 中,識別「test-instance-1」然後啟動兩個工作階段

來自「test-instance-1」工作階段 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」這兩個 CURL 順利完成,並得到 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」工作階段 1 TCPDUMP 識別 VM 執行個體 → 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」擷取 VM 執行個體與靜態 IP 之間的流程

  1. 在 Cloud 控制台中辨識作業記錄 → 記錄檔探索工具
  2. 在「Query」欄位中,將下列項目更新為您的 consumerproject,並選取 [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 IP 位址,「src_ip: 10.0.60.2」是 VM 執行個體 IP 位址

1b4f46b3e61f6f12.png

19. 觀察 - 生產端

從後端執行個體「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 NAT請執行下列步驟,瞭解 TCP ILB 流量:

  1. 在 Cloud 控制台中辨識作業記錄 → 記錄檔探索工具
  2. 在「Query」欄位中,使用 yourprodproject 更新下列項目,然後選取「Run Query」

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. 啟用 Proxy 通訊協定

根據預設,Private Service Connect 會將消費者的來源 IP 位址轉譯為服務供應商虛擬私有雲網路中其中一個 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

建立已啟用 Proxy 通訊協定的 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 驗證服務連結是在啟用 Proxy 通訊協定的情況下建立 (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

Proxy 通訊協定驗證

注意:在下一節中,請在包含 Producer Service 的專案中執行設定更新。

Producer Project 中,找出「www-01」&amp;「www-02」並為每個執行個體啟動一個工作階段

6d0bb8c5cb115876.png

來自「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

注意:在下一節中,請在包含用戶端服務的專案中執行設定更新作業

Consumer Project (消費者專案) 中,識別「test-instance-1」並啟動單一工作階段

來自「test-instance-1」工作階段會執行 curl

curl 10.0.60.100 

觀察 - 消費者

請注意,如果 PROXY Protocol v2 已啟用,但應用程式未設定支援這項功能,如下方範例所示,從用戶端連線時,系統會顯示錯誤訊息。必須進行 Apache 更新,才能配合額外的 Proxy v2 標頭和則在本程式碼研究室中未提及。

來自「test-instance-1」雖然後端查詢成功,但工作階段 CURL 會產生預期 400 次「錯誤」要求。

@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」系統會透過擷取中內嵌的 Proxy 通訊協定,觀察到 TCP NAT 子網路和 TCP ILB 之間的下列通訊。

在大部分的情況下,tcpdump 中的第 3 封包包含相關 Proxy 通訊協定資訊元素 (IE)。視需要識別含有 39 個位元組的封包,其中包含 Proxy 通訊協定 IE。

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 通訊協定簽章後,您就能將其細分並解碼欄位,如下所示:

PROXY 通訊協定簽名:0d0a0d0a000d0a515549540a

其他 Proxy 通訊協定欄位:21 11 00 17

IP 和通訊埠:0a003c02 0a003c64 8138 0050

TLV 類型:e0

TLV 長度:00 08

pscConnection ID:009b34d70a003c64

十六進位

小數 / IP

Proxy 通訊協定簽章

0d0a0d0a000d0a515549540a

版本、通訊協定、長度

21 11 0017

弧形 IP

0a003c02

10.0.60.2

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 → 已連結的專案」

e1d90d1563e10731.png

請注意,消費者專案已變更為「待處理」連結。

在 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 → 已連結的專案」

35cba9ac640594a2.png

注意,消費者專案已變更為「已接受」連結。

23. 清除步驟

生產端網路清除步驟

注意:在下一節中,請在包含 Producer Service 的專案中執行設定更新。

透過生產端專案終端機中的單一 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

注意:在下一節中,請在包含用戶端服務的專案中執行設定更新作業

清除消費者網路的步驟

透過生產端專案終端機中的單一 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. 恭喜!

恭喜您完成本程式碼研究室。

涵蓋內容

  • Private Service Connect 的優點
  • 給服務消費者的重要概念
  • 服務供應商的重要概念
  • 建立生產端環境
  • 透過服務連結公開服務 (生產端環境)
  • 建立消費者環境
  • 在消費者網路中建立轉送規則
  • 驗證 TCP 消費者存取權
  • 啟用 &驗證 Proxy 通訊協定
  • 啟用政策存取權控管