1. 簡介
透過 Private Service Connect,您可以使用虛擬私有雲網路中的全域內部 IP 位址建立私人端點,存取 Google API。您可以為這些內部 IP 位址指派 DNS 名稱,例如 storage-pscendpoint.p.googleapis.com 和 bigtable-adsteam.p.googleapis.com。不必將 API 要求傳送至 storage.googleapis.com 等公開服務端點,而是傳送至 Private Service Connect 端點,這個端點是虛擬私有雲網路的內部私人端點。
這些名稱和 IP 位址屬於 VPC 網路內部,以及透過 Cloud VPN 通道或 Cloud Interconnect 連結 (VLAN) 連線至 VPC 網路的任何地端部署網路。
您可以控管哪些流量傳至哪個端點,並證實這些流量會留在 Google Cloud 中。
課程內容
- Private Service Connect 用途
- 網路需求
- 支援的 API
- 建立 Private Service Connect 端點
- 建立 Cloud Storage 值區
- 建立及更新 Cloud DNS 私人區域
- 建立 NAT GW 以存取公開 googleapis
- 建立及更新 BOTO 設定檔
- 針對 PSC 服務端點解析的 VM1 執行 gsutil list
- 在 VM2 上執行 gsutil list,並針對公開的 googleapis.com 進行解析
- 使用 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 存取。
- 您可以在 VM 執行個體上設定防火牆規則,禁止所有網際網路流量;傳送至 Private Service Connect 端點的流量仍會抵達 Google。
- 如果地端部署主機透過 Cloud VPN 通道或 Cloud Interconnect 連結 (VLAN) 連線至 VPC,您可以透過通道或 VLAN 傳送部分要求,同時透過公開網際網路傳送其他要求。這項設定可讓您略過通道或 VLAN,存取私人 Google 存取權不支援的服務,例如 Google 圖書。如要建立這項設定,請建立 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 上的 BGP 工作階段通告相同的 Private Service Connect 端點 IP 位址,則從內部部署系統傳送到端點的封包會使用 ECMP,在 VLAN 之間路由傳送。

圖 1. 設定 Private Service Connect、Cloud Router 和內部部署主機後,您就能控管要使用哪個 Cloud Interconnect 連結 (VLAN) 將流量傳送至 Google API。
3. 網路需求
如要使用 Private Service Connect,沒有外部 IP 位址的虛擬機器 (VM) 執行個體,其主要介面必須位於已啟用 Private Google Access 的子網路中。
無論子網路是否啟用 Private Google Access,具有外部 IP 位址的 VM 都可以使用 Private Service Connect 端點存取 Google API 和服務。連至 Private Service Connect 端點的連線會留在 Google 網路中。
無法從對等互連的虛擬私有雲網路存取 Private Service Connect 端點。
支援的 API
建立 Private Service Connect 端點時,請選擇要存取的 API 套件:all-apis 或 vpc-sc。
API 套裝組合提供的 API,與透過私人 Google 存取權 VIP 提供的 API 相同。
- all-apis 套裝組合提供的 API 存取權與 private.googleapis.com 相同。
- vpc-sc 套裝組合提供的 API 與 restricted.googleapis.com 相同。
4. 程式碼研究室拓樸和用途

圖 1:Codelab 拓撲
程式碼研究室應用情境 -
客戶需要混合使用私有 (互連) 和公開的 Googleapis 存取權,才能轉移 Cloud Storage 資料。為滿足客戶需求,我們將部署 Private Service Connect,其中包含專屬的 /32 位址、BOTO 設定和 DNS 記錄更新。虛擬機器 1 會使用 PSC 存取 Cloud Storage 值區;相較之下,虛擬機器 2 會透過 NAT GW 使用公用 googleapis.com IP 範圍。
實驗室的所有層面都部署在 Google Cloud Platform 中,但同樣的用途也適用於需要流量分離的混合雲部署。
5. 設定和需求
自修實驗室環境設定



請記住專案 ID,這是所有 Google Cloud 專案中不重複的名稱 (上述名稱已遭占用,因此不適用於您,抱歉!)。本程式碼研究室稍後會將其稱為 PROJECT_ID。
- 接著,您必須在 Cloud 控制台中啟用帳單,才能使用 Google Cloud 資源。
完成本程式碼研究室的費用應該不高,甚至完全免費。請務必按照「清除」部分的指示操作,瞭解如何停用資源,避免在本教學課程結束後繼續產生帳單費用。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
啟動 Cloud Shell
雖然可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。
在 GCP 主控台,按一下右上角工具列的 Cloud Shell 圖示:

佈建並連線至環境的作業需要一些時間才能完成。完成後,您應該會看到如下的內容:

這部虛擬機器搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 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. 建立 bucket
建立 Cloud Storage bucket,並將 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 端點。您也可以在要求的「Host」標頭中使用這些 DNS 名稱。
如要搭配存取 Google API 和服務的用戶端或應用程式使用 Private Service Connect 端點,請更新用戶端或應用程式,改用 p.googleapis.com DNS 名稱。
詳情請參閱用戶端或用戶端程式庫的說明文件。例如:
- Python:您可以在 google-api-core 套件的用戶端選項類別中設定 api_endpoint。
- Go:您可以在 api 套件的用戶端選項套件中設定 WithEndpoint。
- gcloud: You can configure api_endpoint_overrides using this command. 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 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 終端機。

建立虛擬機器 (psc-instance-2),用於驗證公開 Googleapis
從分頁 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
從分頁 2 透過 Cloud Shell 透過 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"
從分頁 3 透過 Cloud Shell 建立 psc-instance-1 的 SSH 連線
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"
從分頁 4 Shell 透過 Cloud Shell 建立 psc-instance-2 的 SSH 連線
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 (psc-instance-2) 檢查 Storage bucket DNS 查詢
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 行為
回想一下,您在上一個步驟中建立了私人 DNS 區域和 A 記錄,並對應至 PSC 端點 IP 位址。在下一個步驟中,我們將更新 psc-instance-1 上的 VM BOTO 檔案,控制 gsutil 的行為。
從分頁 1 (psc-instance-1) 的 VM 執行個體終端機查看預設 BOTO 設定
[psc-instance ~]$ more /etc/boto.cfg
輸出內容 (您的 project_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 (psc-instance-1) 檢查儲存空間 bucket gsutil 查閱
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 是嘗試存取儲存空間 bucket 時使用的 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)
確認 DNS 解析現在使用 Private Service Connect 端點 IP
從分頁 1
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
在控制台中,確認您正在查看正確的專案,然後選取「網路服務」→「Cloud DNS」
16. 恭喜!
恭喜您完成本程式碼研究室。
涵蓋內容
- Private Service Connect 用途
- 網路需求
- 支援的 API
- 已建立 Private Service Connect 端點
- 已建立 Cloud Storage bucket
- 更新 BOTO 設定檔
- 已建立 NAT GW
- 在 VM1 上執行 gsutil list,針對 PSC 服務端點進行解析
- 在 VM2 上執行 gsutil list,針對公開的 googleapis.com 進行解析
- 使用 Tcpdump 驗證 DNS 解析