適用於 Google API 的 Private Service Connect

1. 簡介

有了 Private Service Connect,您就能透過虛擬私有雲網路中的全域內部 IP 位址,建立私人端點以存取 Google API。您可以使用有意義的名稱來為這些內部 IP 位址指派 DNS 名稱,例如 storage-pscendpoint.p.googleapis.com 和 bigtable-adsteam.p.googleapis.com。您可以將要求傳送至 Private Service Connect 端點,這個端點是私人且內部於虛擬私有雲網路內部,而非 storage.googleapis.com 等公開服務端點傳送 API 要求。

這些名稱和 IP 位址屬於您的虛擬私有雲網路內部,以及透過 Cloud VPN 通道或 Cloud Interconnect 連結 (VLAN) 連線的任何地端部署網路。

您可以控管哪些流量要傳送至哪個端點,並能展示該流量可保留在 Google Cloud 中。

課程內容

  • Private Service Connect 用途
  • 網路需求
  • 支援的 API
  • 建立 Private Service Connect 端點
  • 建立 Cloud Storage 值區
  • 建立及更新 Cloud DNS 私人區域
  • 建立 NAT GW 來存取公開 googleapis
  • 建立及更新 BOTO 設定檔
  • 在已解析 PSC 服務端點的 VM1 上執行 gsutil 清單
  • 在針對 public googleapis.com 解析的 VM2 上執行 gsutil 清單
  • 透過 Tcpdump 驗證 DNS 解析

軟硬體需求

  • 瞭解 DNS、nano 或 vi 編輯器

2. Private Service Connect 用途

您可以在同一個虛擬私有雲網路中建立多個 Private Service Connect 端點。特定端點沒有頻寬限制。由於 Private Service Connect 端點使用全域內部 IP 位址,因此虛擬私有雲網路中的任何資源均可使用這些位址。

設定多個端點時,您可以使用 Cloud Router 和防火牆規則來指定不同的網路路徑。

  • 您可以建立防火牆規則,防止部分 VM 透過 Private Service Connect 端點存取 Google API,同時允許其他 VM 存取 Google API。
  • 您可以為 VM 執行個體設定防火牆規則,禁止所有流量傳送至網際網路。傳送至 Private Service Connect 端點的流量仍會傳送至 Google。
  • 如果您的地端部署主機使用 Cloud VPN 通道或 Cloud Interconnect 連結 (VLAN) 連線至虛擬私有雲,在透過公開網際網路傳送其他要求時,可以透過通道或 VLAN 傳送某些要求。對於 Google 圖書這類不支援私人 Google 存取權的服務,這項設定可讓您略過通道或 VLAN。如要建立這項設定,請先建立 Private Service Connect 端點,並使用 Cloud Router 自訂路徑通告通告 Private Service Connect 端點 IP 位址,然後啟用 Cloud DNS 傳入轉送政策。應用程式可以使用 Private Service Connect 端點的名稱,透過 Cloud VPN 通道或 Cloud Interconnect 連結 (VLAN) 傳送某些要求。使用預設的 DNS 名稱,就能透過網際網路傳送其他要求。
  • 如果您使用多個 Cloud Interconnect 連結 (VLAN) 將地端部署網路連線至虛擬私有雲網路,則可以透過一個 VLAN 和其他 VLAN 從地端部署系統傳送部分流量,如圖 2 所示。這樣一來,您就能使用自己的廣域網路 (而非 Google 的),並配合地理需求控管資料遷移。如要建立這項設定,請建立兩個 Private Service Connect 端點。在用於管理第一個 VLAN 的 Cloud Router BGP 工作階段上,建立第一個端點的自訂路徑通告,並在用於管理第二個 VLAN 的 Cloud Router 的 BGP 工作階段,為第二個端點建立不同的自訂路徑通告。設為使用 Private Service Connect 端點名稱的地端部署主機,會透過對應的 Cloud Interconnect 連結 (VLAN) 傳送流量。
  • 您也可以在啟用/主動拓撲中使用多個 Cloud Interconnect 連結 (VLAN)。如果您在管理 VLAN 的 Cloud Router 路由器上使用自訂路徑通告,來通告相同的 Private Service Connect 端點 IP 位址,從內部部署系統傳送至端點的封包會使用 ECMP 轉送。

5e142c2fbf6f010e.png

圖 1. 設定 Private Service Connect、Cloud Router 和地端部署主機,即可控管要使用哪些 Cloud Interconnect 連結 (VLAN) 將流量傳送至 Google API。

3. 網路需求

如要使用 Private Service Connect,沒有外部 IP 位址的虛擬機器 (VM) 執行個體在已啟用私人 Google 存取權的子網路中必須具有主要介面。

無論是否為子網路啟用私人 Google 存取權,具備外部 IP 位址的 VM 皆可透過 Private Service Connect 端點存取 Google API 和服務。Private Service Connect 端點之間的連線會保留在 Google 的網路中。

您無法從對等互連的虛擬私有雲網路存取 Private Service Connect 端點。

支援的 API

建立 Private Service Connect 端點時,請選擇您要存取的 API 組合:all-apis 或 vpc-sc。

API 套裝組合可讓您使用與私人 Google 存取權 VIP 相同的 API。

  • all-apis 套裝組合提供與 private.googleapis.com 相同的 API 存取權。
  • vpc-sc 套件可讓您存取與 restricted.googleapis.com 相同的 API。

4. 程式碼研究室拓撲與用途

2ac275eb86f26338.png

圖 1 - 程式碼研究室拓撲

程式碼研究室用途:

客戶需要混合使用私人 (互連網路) 和公開 googleapis 存取,才能移轉 Cloud Storage 資料移轉。為滿足客戶需求,我們會部署 Private Service Connect,其中包含專屬 /32 位址、BOTO 設定和 DNS 記錄更新。虛擬機器 1 會使用 PSC 存取 Cloud Storage 值區;相較之下,VM2 會透過 NAT GW 使用公開 googleapis.com IP 範圍。

研究室的所有層面都部署在 Google Cloud Platform 中,但同一個用途則適用於需要區隔流量的混合式雲端部署。

5. 設定和需求

自修環境設定

  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. 事前準備

啟用 API

在 Cloud Shell 中,確認您已設定專案 ID

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

啟用所有必要服務

gcloud services enable compute.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable dns.googleapis.com

7. 建立虛擬私有雲網路

虛擬私有雲網路

透過 Cloud Shell

gcloud compute networks create psc-lab --subnet-mode custom

建立子網路

透過 Cloud Shell

gcloud compute networks subnets create psclab-subnet \
--network psc-lab --range 10.0.0.0/24 --region us-central1 --enable-private-ip-google-access

建立防火牆規則

如要允許 IAP 連線至您的 VM 執行個體,請建立下列防火牆規則:

  • 適用於您要透過 IAP 存取的所有 VM 執行個體。
  • 允許來自 IP 範圍 35.235.240.0/20 的輸入流量。這個範圍包含 IAP 用於 TCP 轉送的所有 IP 位址。

透過 Cloud Shell

gcloud compute firewall-rules create psclab-ssh \
    --network psc-lab --allow tcp:22 --source-ranges=35.235.240.0/20

建立 Cloud NAT 執行個體

建立 Cloud Router

透過 Cloud Shell

gcloud compute routers create crnat \
    --network psc-lab \
    --asn 65000 \
    --region us-central1

建立 Cloud NAT

透過 Cloud Shell

gcloud compute routers nats create cloudnat \
    --router=crnat \
    --auto-allocate-nat-external-ips \
    --nat-all-subnet-ip-ranges \
    --enable-logging \
    --region us-central1

8. 建立 Private Service Connect 端點

設定 Private Service Connect 端點 IP <pscendpointip> 時,您必須提供虛擬私有雲中未定義的專屬 IP 位址。

透過 Cloud Shell

gcloud compute addresses create psc-ip \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=192.168.255.250 \
    --network=psc-lab

儲存「pscendpointip」持續學習

pscendpointip=$(gcloud compute addresses list --filter=name:psc-ip --format="value(address)")

echo $pscendpointip

建立轉送規則,將端點連線至 Google API 和服務。

透過 Cloud Shell

gcloud compute forwarding-rules create pscendpoint \
    --global \
    --network=psc-lab \
    --address=psc-ip \
    --target-google-apis-bundle=all-apis

列出已設定的 Private Service Connect 端點

透過 Cloud Shell

gcloud compute forwarding-rules list  \
--filter target="(all-apis OR vpc-sc)" --global

說明已設定的 Private Service Connect 端點

透過 Cloud Shell

gcloud compute forwarding-rules describe \
    pscendpoint --global

9. 建立值區

建立 Cloud Storage 值區,並將 BUCKET_NAME 替換為您偏好的全域不重複名稱。

透過 Cloud Shell

gsutil mb  -l us-central1 -b on gs://BUCKET_NAME

儲存「BUCKET_NAME」持續學習

BUCKET_NAME=YOUR BUCKET NAME
echo $BUCKET_NAME

10. DNS 設定

建立 Private Service Connect 端點時,Service Directory 會為透過該端點使用的 API 和服務產生 DNS 記錄。

DNS 記錄會指向您的 Private Service Connect 端點 IP 位址,格式為:SERVICE-ENDPOINT.p.googleapis.com。

您可以在 API 要求中使用這些 DNS 名稱,將要求導向 Private Service Connect 端點。您也可以在要求的主機標頭中使用這些 DNS 名稱。

如要在存取 Google API 和服務的用戶端或應用程式上使用 Private Service Connect 端點,請將用戶端或應用程式更新為使用 p.googleapis.com DNS 名稱。

詳情請參閱用戶端或用戶端程式庫的說明文件。例如:

  • Python:您可以在 google-api-core 套件的用戶端選項類別中設定 api_endpoint。
  • Go:您可以在 API 套件的用戶端選項套件中設定 WithEndpoint。
  • gcloud:您可以使用這個指令設定 api_endpoint_overrides。gcloud config set api_endpoint_overrides/SERVICE ENDPOINT_URL

例如:gcloud config set api_endpoint_overrides/storage https://storage-xyz.p.googleapis.com/storage/v1/

如果無法將用戶端或應用程式設為使用其他端點,請建立 DNS 記錄來採用預設 DNS 名稱。例如 storage.googleapis.com。請參閱使用預設 DNS 名稱建立 DNS 記錄

驗證 DNS 記錄

在 Cloud 控制台中,驗證「網路服務」→「Cloud DNS」之下產生的 DNS 項目。記下產生的 DNS 名稱「p.googleapis.com」。

11. 建立虛擬機器

建立用來驗證 Private Service Connect 的虛擬機器 (psc-instance-1)

透過 Cloud Shell

  gcloud compute instances create psc-instance-1 \
    --subnet psclab-subnet \
    --zone us-central1-a \
    --image=centos-7-v20210122 \
    --image-project=centos-cloud \
    --no-address \
    --metadata=startup-script=yum\ install\ tcpdump\ -y$'\n'yum\ install\ bind-utils\ -y$'\n'yum\ install\ nano\ -y 

登入 VM 執行個體 (psc-instance-1)

透過 Cloud Shell 使用 SSH 登入 VM

gcloud compute ssh --zone "us-central1-a" "psc-instance-1" --project "$projectname"

按一下「+」(下方螢幕截圖) 即可建立其他 Cloud Shell 終端機三次

69ea94e1527912bb.png

建立用來驗證公開 Googleapis 的虛擬機器 (psc-instance-2)

來自分頁 2

  gcloud compute instances create psc-instance-2 \
    --subnet psclab-subnet \
    --zone us-central1-a \
    --image=centos-7-v20210122 \
    --image-project=centos-cloud \
    --no-address \
    --metadata=startup-script=yum\ install\ tcpdump\ -y$'\n'yum\ install\ bind-utils\ -y$'\n'yum\ install\ nano\ -y 

透過 Cloud Shell 從分頁 2 透過 SSH 連至 VM

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


gcloud compute ssh --zone "us-central1-a" "psc-instance-2" --project "$projectname"

透過 Cloud Shell,從分頁 3 透過 SSH 連至 psc-instance-1

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


gcloud compute ssh --zone "us-central1-a" "psc-instance-1" --project "$projectname"

透過 Cloud Shell,從分頁 4 殼層透過 SSH 進入 psc-instance-2

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


gcloud compute ssh --zone "us-central1-a" "psc-instance-2" --project "$projectname"

12. 驗證現有的 Gsutil 行為

從分頁 4 (psc-instance-2) 啟動 tcpdump 並監控 DNS 流量

sudo tcpdump -vv -i eth0 port 53

從分頁 2 檢查儲存空間值區 DNS 查詢 (psc-instance-2)

BUCKET_NAME=YOUR BUCKET NAME
echo $BUCKET_NAME
gsutil -D ls gs://$BUCKET_NAME

檢查 gsutil 偵錯,HOST storage.googleapis.com 進行 DNS 解析

<snip>
send: 'GET /storage/v1/b/$BUCKET_NAME/o?delimiter=%2F&projection=noAcl&versions=False&fields=prefixes%2CnextPageToken%2Citems%2Fname&alt=json&maxResults=1000 HTTP/1.1\r\nHost: storage.googleapis.com\r\ncontent-length: 0\r\nauthorization: Bearer ya29.c.KpkB7wfaMjfc_WXEKCeNF4Md0fEHnfDU7tqBf3cd0u43yEmYXqj8fX_X5wWdNdDVH6k1EkjeAeIJDzKGvyjPOkf1Io2kVeUqYX69sDv53huW1NslffjAHKchbZ0CP3Cg83TS3Pa55jLcuE0TLbYycVrgSbD3H90LaapUGbWD3kj4IsJLf9J8R98Bqobu8HZwwqk92hlZ4zVzRqOM\r\naccept-encoding: gzip, deflate\r\naccept: application/json\r\nuser-agent: apitools Python/2.7.5 gsutil/4.57 (linux2) analytics/disabled interactive/True command/ls google-cloud-sdk/324.0.0\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
<snip>

在分頁 4 (psc-instance-2) 中,驗證在存取儲存空間值區時使用 GoogleAPI.com 公開 DNS A 記錄。

metadata.google.internal.domain > psc-instance-2.c.yourprojectname.internal.33973: [udp sum ok] 36442 q: A? storage.googleapis.com. 11/0/0 storage.googleapis.com. A 108.177.111.128, storage.googleapis.com. A 142.250.128.128, storage.googleapis.com. A 74.125.70.128, storage.googleapis.com. A 74.125.201.128, storage.googleapis.com. A 64.233.183.128, storage.googleapis.com. A 173.194.198.128, storage.googleapis.com. A 172.217.219.128, storage.googleapis.com. A 142.250.136.128, storage.googleapis.com. A 209.85.234.128, storage.googleapis.com. A 172.217.212.128, storage.googleapis.com. A 172.217.214.128

13. 修改 gsutil 行為

在先前的步驟中,您建立了對應至 PSC 端點 IP 位址的私人 DNS 區域和 A 記錄。在下列步驟中,我們現在會更新 psc-instance-1 上的 VM BOTO 檔案,藉此控制 gsutil 的行為。

在 VM 執行個體終端機中,從分頁 1 (psc-instance-1) 查看預設的 BOTO 設定

[psc-instance ~]$ more  /etc/boto.cfg

輸出內容 (您的專案 ID 不同)

[GSUtil]
default_project_id  = [your project number]
default_api_version = 2

[GoogleCompute]
service_account = default

使用 nano 或 VI 編輯器更新 BOTO 設定,務必複製並貼上所有項目。

範例:sudo nano /etc/boto.cfg

範例:sudo vi /etc/boto.cfg

從 VM 執行個體終端機分頁 1(psc-instance-1)

[Credentials]
gs_host = storage-pscendpoint.p.googleapis.com
gs_host_header = storage.googleapis.com
gs_json_host = storage-pscendpoint.p.googleapis.com
gs_json_host_header = www.googleapis.com

驗證設定,[憑證] 的順序對 DNS 查詢至關重要

more /etc/boto.cfg
[Credentials]
gs_host = storage-pscendpoint.p.googleapis.com
gs_host_header = storage.googleapis.com
gs_json_host = storage-pscendpoint.p.googleapis.com
gs_json_host_header = www.googleapis.com

[GSUtil]
default_project_id  = [your project number
default_api_version = 2

[GoogleCompute]
service_account = default

14. 確認更新後的 gsutil 查詢行為

從分頁 3 (psc-instance-1) 啟動 tcpdump 並監控 DNS 流量

sudo tcpdump -vv -i eth0 port 53

從分頁 1 檢查儲存空間值區 gsutil 查詢 (psc-instance-1)

BUCKET_NAME=YOUR BUCKET NAME
echo $BUCKET_NAME

gsutil -D ls gs://$BUCKET_NAME

偵錯記錄檔可確認您可以透過 Private Service Connect 端點「pscendpoint」連線至儲存空間值區

輸出:

<snip>
INFO 0131 22:14:18.795986 base_api.py] Making http GET to https://storage-pscendpoint.p.googleapis.com/storage/v1/b/$BUCKET_NAME/o?delimiter=%2F&projection=noAcl&versions=False&fields=prefixes%2CnextPageToken%2Citems%2Fname&alt=json&maxResults=1000
INFO 0131 22:14:18.796415 base_api.py] Headers: {u'Host': 'www.googleapis.com',
 'accept': 'application/json',
 'accept-encoding': 'gzip, deflate',
 'content-length': '0',
 'user-agent': 'apitools Python/2.7.5 gsutil/4.57 (linux2) analytics/disabled interactive/True command/ls google-cloud-sdk/324.0.0'}
INFO 0131 22:14:18.796502 base_api.py] Body: (none)
connect: (storage-pscendpoint.p.googleapis.com, 443)
send: 'GET /storage/v1/b/psc-bucket/o?delimiter=%2F&projection=noAcl&versions=False&fields=prefixes%2CnextPageToken%2Citems%2Fname&alt=json&maxResults=1000 HTTP/1.1\r\ncontent-length: 0\r\naccept-encoding: gzip, deflate\r\naccept: application/json\r\nuser-agent: apitools Python/2.7.5 gsutil/4.57 (linux2) analytics/disabled interactive/True command/ls google-cloud-sdk/324.0.0\r\nhost: www.googleapis.com\r\nauthorization: Bearer ya29.c.KpkB7wd3XWiYeRyTuth5_HPlNV-hPwc2Nn7RSIeMpzrpa_j4EsMPl2m_mDGKAcGHvYIgiC5bT2UVQirAPpSbbpToa6G6lkaBbH5SZwHwgNXYfisp5Ww1UjXe4rTa69a_Wp0WesafcwPNnYzDo3xf5VGh3iGhySA04kTXuyT--MgOU8U-XLII2LJQxUWlV8KEdrvyCuqRb-jsDdk_\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
<snip>

在 Tab 3 (psc-instance-1) 中,確認 PSC 端點 IP 是嘗試存取儲存空間值區時使用的 DNS A 記錄。

@psc-instance-1 ~]$ sudo tcpdump -vv -i eth0 port 53
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
05:02:33.936256 IP (tos 0x0, ttl 64, id 55416, offset 0, flags [DF], proto UDP (17), length 82)
    psc-instance-1.c.yourprojectname.internal.42296 > metadata.google.internal.domain: [bad udp cksum 0x5e4e -> 0xcceb!] 34796+ A? storage-pscendpoint.p.googleapis.com. (54)
05:02:33.936269 IP (tos 0x0, ttl 64, id 55417, offset 0, flags [DF], proto UDP (17), length 82)
    psc-instance-1.c.yourprojectname.internal.42296 > metadata.google.internal.domain: [bad udp cksum 0x5e4e -> 0x3ebd!] 5632+ AAAA? storage-pscendpoint.p.googleapis.com. (54)
05:02:33.944018 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 98)
    metadata.google.internal.domain > psc-instance-1.c.yourprojectname.42296: [udp sum ok] 34796 q: A? storage-pscendpoint.p.googleapis.com. 1/0/0 storage-pscendpoint.p.googleapis.com. A 10.10.110.10 (70)
05:02:33.946005 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 175)

確認 Private Service Connect 端點 IP 現已用於 DNS 解析

來自 Tab1

nslookup storage-pscendpoint.p.googleapis.com

輸出

@psc-instance ~]$ nslookup storage-pscendpoint.p.googleapis.com
Server:         169.254.169.254
Address:        169.254.169.254#53

Non-authoritative answer:
Name:   storage-pscendpoint.p.googleapis.com
Address: <pscip>

15. 清除步驟

結束 VM 執行個體 (所有分頁)

exit

從單一 Cloud Shell 終端機刪除研究室元件

gcloud compute routers nats delete cloudnat --router=crnat --region=us-central1 --quiet

gcloud compute routers delete crnat --region=us-central1 --quiet

gcloud compute forwarding-rules delete pscendpoint --global --quiet

gcloud compute addresses delete psc-ip --global --quiet

gsutil rm -r gs://$BUCKET_NAME

gcloud compute instances delete psc-instance-1 --zone=us-central1-a --quiet

gcloud compute instances delete psc-instance-2 --zone=us-central1-a --quiet

gcloud compute firewall-rules delete psclab-ssh --quiet

gcloud compute networks subnets delete psclab-subnet --region us-central1 --quiet

gcloud compute networks delete psc-lab --quiet

在控制台中,確認目前查看的是正確的專案,然後依序選取「Networking Services」(網路服務) →「Cloud DNS」

16. 恭喜!

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

涵蓋內容

  • Private Service Connect 用途
  • 網路需求
  • 支援的 API
  • 已建立 Private Service Connect 端點
  • 已建立 Cloud Storage 值區
  • 已更新 BOTO 設定檔
  • 已建立 NAT GW
  • 在 VM1 上執行 gsutil 清單,以解析您的 PSC 服務端點
  • 在 VM2 上執行 gsutil 清單,以解析 public googleapis.com
  • 透過 Tcpdump 驗證 DNS 解析