使用通訊協定轉送

Google Compute Engine 支援通訊協定轉送,可讓您建立可將數據包發送到非 NAT 目標執行個體轉送規則物件。每個目標執行個體包含單一虛擬機器執行個體,該個體可接收和處理來自相應轉送規則的流量。

通訊協定轉送可在多種情況下使用,其中包括:

  • 依 IP 區分虛擬主機

    您可以設定多個轉送規則以指向單一目標執行個體,從而允許您以一個虛擬機器執行個體使用多個外部 IP 位址。當您想從一個虛擬機器執行個體但透過不同外部 IP 位址提供資料,您可以在類似的情況下使用此方法。在設定 SSL 虛擬主機時,這項功能尤其實用。

  • 虛擬私人網路 (VPN)

    如要搭配 VPN 使用轉送規則,請參閱 VPN 一文。

  • **私人 VIP**

    您可以將私人地區轉送規則的通訊協定轉送私人 (RFC 1918) 位址搭配使用。使用此功能即可設定私人轉送規則,該規則會將 TCP 或 UDP 流量發送到同一地區的目標執行個體。您也可以將私人地區轉送規則從使用目標執行個體切換至後端服務,反之亦然。

  • 負載平衡

    想瞭解如何將流量轉送至負載平衡器,請參閱負載平衡一文。

針對依 IP 區分虛擬主機、虛擬私人網路 (VPN) 以及負載平衡,Google Compute Engine 支援以下通訊協定的通訊協定轉送:

如果是私人 VIP,則只支援 TCP 和 UDP:

通訊協定轉送的計費方式與負載平衡服務相同。詳情請參閱價格頁面

快速入門

本快速入門導覽課程假定您已熟悉 bash

如要建立將流量發送到單一執行個體的轉送規則,您必須:

  1. 建立目標執行個體

    您的目標執行個體將包含單個虛擬機器執行個體,但是這個虛擬機器執行個體可在您建立目標執行個體時即存在,或是之後再建立。

  2. 建立轉送規則

    在建立轉送規則前,您的目標執行個體就必須存在。如果傳入封包與 IP、通訊協定,以及轉送規則所服務的通訊埠範圍 (如果適用) 相符,則轉送規則會將該流量導向至目標執行個體。

本快速入門導覽課程的其餘部分透過以下方式示範上述端對端的步驟:

  1. 在虛擬機器執行個體上設定 Apache 伺服器。
  2. 建立目標執行個體和相應的轉送規則。
  3. 將流量發送至單一目標執行個體。

完成本快速入門導覽課程後,您便可瞭解如何透過多個轉送規則將通訊協定轉送設定至單一目標執行個體。

設定虛擬機器執行個體和安裝 Apache

首先,我們要建立已安裝 Apache 的單一虛擬機器執行個體。

  1. 為新的執行個體建立一些開機指令碼。

    視您的作業系統而定,開機指令碼的內容可能會有所不同:

    • 如果您想在執行個體上使用 Debian 映像檔,請執行以下指令:

      me@local:~$ echo "sudo apt-get update && sudo apt-get -y install apache2 && mkdir -p /var/www1 &&
      mkdir -p /var/www2 && mkdir -p /var/www3 && hostname > /var/www/html/index.html &&
      echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

    • 如果您想在執行個體上使用 CentOS 映像檔,請執行以下指令:

      me@local:~$ echo "sudo yum -y install httpd && sudo service httpd restart && mkdir -p /var/www1 &&
      mkdir -p /var/www2 && mkdir /var/www3 && hostname > /var/www/html/index.html &&
      echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

  2. 為您未來的虛擬機器建立標記,以便我們之後為它套用防火牆:

    me@local:~$ TAG="www-tag"
    
  3. 建立新的虛擬機器執行個體以處理轉送規則的流量。

    gcloud compute instances create pf-instance \
        --image-project debian-cloud --image-family debian-9 --tags $TAG \
        --metadata-from-file startup-script=$HOME/pf_startup.sh
    
  4. 建立防火牆規則以允許外部流量送至這個虛擬機器執行個體:

    gcloud compute firewall-rules create www-firewall --target-tags $TAG --allow tcp
    

您已成功設定虛擬機器執行個體。您現在可以開始設定通訊協定轉送配置。

建立目標執行個體和相應的轉送規則

  1. 建立目標執行個體。

    目標執行個體包含一個虛擬機器執行個體,用於接收和處理來自轉送規則的流量。目標執行個體不具有 NAT 政策,因此您可以透過 IPsec 通訊協定直接使用它們來設定您的 VPN 連線。

    您必須先建立目標執行個體,然後才能建立轉送規則物件,這是因為轉送規則必須參照現有目標資源。無法建立將流量導向至不存在目標資源的轉送規則。在此範例中,建立如下方的目標執行個體:

    gcloud compute target-instances create pf-target-instance --instance pf-instance
    
  2. 建立轉送規則物件。

    轉送規則物件會將與 IP 通訊協定和通訊埠相符的流量導向至指定的目標執行個體。詳情請參閱轉送規則說明文件。

    在這個範例中,以下指令將建立三個轉送規則,每個都具有臨時 IP 位址,可將 TCP 流量轉送至目標執行個體。如果您擁有一些靜態外部 IP 位址,可以視需要透過指定 --address IP-ADDRESS 標記搭配轉送規則使用這些外部 IP 位址。

    gcloud compute forwarding-rules create pf-rule1 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    
    gcloud compute forwarding-rules create pf-rule2 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    
    gcloud compute forwarding-rules create pf-rule3 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    

這樣就大功告成了!您可以開始傳送流量至目標執行個體。

傳送流量至執行個體

  1. 取得新轉送規則的外部 IP 位址。

    執行 gcloud compute forwarding-rules list 即可取得轉送規則的外部 IP 位址。舉例來說,下表列出了為先前建立的轉送規則所分配的臨時 IP 位址。

    如果您選擇使用保留的 IP 位址,則會在此處列出這些位址以取代臨時 IP 位址。

    gcloud compute forwarding-rules list
    
    NAME     REGION      IP_ADDRESS     IP_PROTOCOL TARGET
    pf-rule1 us-central1 [ADDRESS_1]    TCP         us-central1-a/targetInstances/pf-target-instance
    pf-rule2 us-central1 [ADDRESS_2]    TCP         us-central1-a/targetInstances/pf-target-instance
    pf-rule3 us-central1 [ADDRESS_3]    TCP         us-central1-a/targetInstances/pf-target-instance

    請記下這些 IP 位址,以供下一個步驟使用。

  2. 設定虛擬機器執行個體的 Apache 虛擬主機,以根據到達網頁網址提供不同的資訊。

    首先,透過 SSH 登入執行個體:

    gcloud compute ssh pf-instance
    

    接著,編輯 /etc/apache2/sites-enabled/000-default.conf 檔案並新增下列指令行。針對 VirtualHost 行,請使用執行上一個步驟時所看到的 IP 位址。

    <VirtualHost [ADDRESS_1]>
     DocumentRoot /var/www1
     <Directory /var/www1>
      Require all granted
     </Directory>
    </VirtualHost>
    <VirtualHost [ADDRESS_2]>
     DocumentRoot /var/www2
     <Directory /var/www2>
      Require all granted
     </Directory>
    </VirtualHost>
    <VirtualHost [ADDRESS_3]>
     DocumentRoot /var/www3
     <Directory /var/www3>
      Require all granted
     </Directory>
    </VirtualHost>
    

    最後,重新啟動 Apache:

    user@myinst:~$ sudo /etc/init.d/apache2 restart
    
  3. 試著傳送流量送至執行個體:

    在本機電腦上,我們要向外部 IP 位址 (由我們建立的轉送規則提供) 提出要求。

    使用 curl 傳送流量至 IP 位址。視 IP 位址而定,將傳回 w1w2 或是 w3 回應。

    me@local:~$curl [ADDRESS_1]
    w1
    
    me@local:~$ curl [ADDRESS_2]
    w2
    
    me@local:~$ curl [ADDRESS_3]
    w3
    

    這樣就大功告成了!您已經設定好第一個通訊協定轉送配置!

轉送規則

轉送規則搭配目標集區和目標執行個體一起使用,以支持負載平衡和通訊協定轉送功能。如要使用負載平衡和通訊協定轉送功能,您必須建立將流量導向至目標集區 (為了負載平衡) 或是目標執行個體 (為了通訊協定轉送) 的轉送規則。如果沒有轉送規則,就無法使用這些功能。

轉送規則資源位於轉送規則集合中。每個轉送規則都會將特定 IP 位址、通訊協議以及通訊埠範圍 (選用) 配對至單一目標集區或是目標執行個體。當流量發送到由轉送規則提供的外部 IP 位址時,轉送規則會將該流量指向至相應的目標集區或目標實例執行個體。您最多可為每個專案建立 50 個轉送規則。

轉送規則的注意事項如下:

  • 轉送規則的名稱在這個專案中不得重複,長度介於 1-63 個字元,並且與規則運算式相符:[a-z]([-a-z0-9]*[a-z0-9])? 這表示第一個字元必須是小寫字母,後續所有字元則必須由連字號、小寫字母或數字組成,但最後一個字元不得為連字號。

  • 如果您沒有指定轉送規則通訊協定,系統就會預設使用 TCP。另請注意,某些通訊協定只能與目標集區或目標執行個體一起使用:

    • 如果您使用 ESPAHSCTPICMP,您必須指定目標執行個體。使用這些通訊協定時無法指定目標集區。
    • 如果您使用的是 TCPUDP,您可以指定目標集區或是目標執行個體
  • 只能針對 TCPUDP 以及 SCTP 等通訊協定指定通訊埠範圍。

新增轉送規則

如要新增新的轉送規則,您可以 gcloud compute forwarding-rules create 指令或發出 HTTP POST 要求至轉送規則集。使用 gcloud 指令列工具建立至目標執行個體的轉送規則,範例如下:

gcloud compute forwarding-rules create [FORWARDING_RULE] \
    --load-balancing-scheme internal | external \
    --region [REGION] \
    [--target-instance-zone [ZONE]] \
    --ip-protocol TCP --ports 80 \
    --target-instance [TARGET_INSTANCE]

當您省略 --target-instance-zone 標記,假如您尚未使用 compute/zone 設定 gcloud config set compute/zone 屬性,gcloud 指令列工具會提示您選擇區域。詳情請參閱「設定預設區域或地區」一文。

當負載平衡配置是內部設定時,gcloud compute forwarding-rules create 指令支援設定目標執行個體當做目標。

建立至目標集區的轉送規則,範例如下:

gcloud compute forwarding-rules create [FORWARDING_RULE] \
    --target-pool [TARGET_POOL] \
    [--region [REGION]]

當您省略 --region 標記,假如您尚未使用 gcloud config set compute/region 設定 compute/region 屬性,gcloud 指令列工具會提示您選擇地區。詳情請參閱「設定預設區域或地區」一文。

如需可用標記的完整說明,請參閱轉送規則 create 指令,或輸入 gcloud compute forwarding-rules create --help

如使用 API 新增轉送規則,請對以下 URI 發出 HTTP POST 要求:

https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/forwardingRules

要求內容應包含以下欄位:

{
 "name": "example-forwarding-rule",
 "IPAddress": "`10.1.1.1",
 "IPProtocol": "TCP",
 "portRange": "80",
 "target": "zones/us-central1-f/targetInstances/example-target-instances"
}

列出轉送規則

如要使用 gcloud 指令列工具取得轉送規則清單,請使用 list 指令:

gcloud compute forwarding-rules list

在 API 中,請對以下 URI 發出空白 HTTP GET 要求:

https://www.googleapis.com/compute/v1/project/myproject/regions/us-central1/forwardingRules

取得有關轉送規則的資訊

如要使用 gcloud 指令列工具取得單一轉送規則相關資訊,請使用 describe 指令:

gcloud compute forwarding-rules describe [FORWARDING_RULE] [--region [REGION] | --global]

當您省略 --region--global 標記,假如您尚未使用 gcloud config set compute/region 設定 compute/region 屬性,gcloud 指令列工具會假設您在執行轉送規則並提示您選擇地區。詳情請參閱「設定預設區域或地區」一文。

在 API 中,請對以下 URI 發出空白 HTTP GET 要求:

https://www.googleapis.com/compute/v1/project/myproject/regions/us-central1/forwardingRules/example-forwarding-rule

更新轉送規則目標

如果您已建立轉送規則,但想要更改轉送規則正在使用的目標集區,則可以使用 gcloud 指令列工具 set-target 指令來變更設定:

gcloud compute forwarding-rules set-target [FORWARDING_RULE] --target-pool [TARGET_POOL] \
    [--region [REGION] | --global]

在 API 中,請對以下 URI 發出 HTTP POST 要求:

https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/forwardingRules/example-forwarding-rule/setTarget

要求內容應包含要設定的目標執行個體或目標集區資源的網址。以目標集區為例,URI 格式應如下:

{
  "target": "https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/targetPools/example-target-pool"
}

刪除轉送規則

如要使用 gcloud 指令列工具刪除轉送規則,請使用 delete 指令:

gcloud compute forwarding-rules delete [FORWARDING_RULE] [--region [REGION] | --global]

如要透過 API 刪除轉送規則,請以空白要求內容對以下 URI 發出 HTTP DELETE 要求:

https://www.googleapis.com/compute/v1/project/myproject/regions/us-central1/forwardingRules/example-forwarding-rule

目標執行個體

目標執行個體資源包含一個虛擬機器執行個體 (處理來自一或多個轉送規則的流量),非常適合轉送應由單一來源 (例如 ESPAH) 代管的部分通訊協定類型流量,但您也可以將目標執行個體用於 TCPUDP 通訊協定。目標執行個體不具有 NAT 政策,因此可以將它們用於需要非 NAT 的 IPsec 流量的虛擬私人網路 (VPN) 流量。

目標執行個體必須與轉送規則位於同一地區。目標執行個體也必須與虛擬機器執行個體位於同一地區。舉例來說,假設您的轉送規則位於 us-central1,但您想要使用的執行個體位於 us-central1-a,則目標執行個體必須位於 us-central1-a。假如執行個體位於 us-central1-b,則目標執行個體必須也位於 us-central1-b

新增目標執行個體

如要新增新的目標執行個體,您可以使用 gcloud compute target-instances 指令或發出 HTTP POST 要求至目標執行個體集。您無法透過 GCP 主控台建立目標執行個體的資源。使用 gcloud 指令列工具建立目標執行個體的範例如下:

gcloud compute target-instances create [TARGET_INSTANCE] --instance INSTANCE

當您省略 --zone 標記,假如您尚未使用 gcloud 設定 compute/zone 屬性,gcloud config set compute/zone 指令列工具會提示您選擇區域。詳情請參閱「設定預設區域或地區」一文。

如需可用標記的完整說明,請參閱 create 指令,或輸入 gcloud compute target-instances create --help

在 API 中,請對以下 URI 發出 HTTP POST 要求:

https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/targetInstances

包含以下要求內容:

body = {
  "name": "example-target-instance",
  "instance": "zones/us-central1-f/instances/example-instance"
}

列出目標執行個體

如要使用 gcloud 指令列工具取得目標執行個體清單,請使用 list 指令:

gcloud compute target-instances list

在 API 中,請對以下 URI 發出空白 HTTP GET 要求:

https://www.googleapis.com/compute/v1/projects/myproject/aggregatedList/targetInstances

取得目標執行個體

如要使用 gcloud 指令列工具取得單一目標執行個體相關資訊,請使用 describe 指令:

gcloud compute target-instances describe [TARGET_INSTANCE]

在 API 中,請對以下 URI 發出空白 HTTP GET 要求:

https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/targetInstances/<target-instance>

刪除目標執行個體

如要刪除目標執行個體,您必須先確認沒有任何轉送規則參照這個執行個體。假如轉送規則目前正在參照要刪除的目標執行個體,您必須先刪除轉送規則以移除此參照。

在移除任何轉送規則所參照的目標執行個體後,您可以使用 gcloud 指令列工具 delete 指令來刪除該執行個體:

gcloud compute target-instances delete [TARGET_INSTANCE]

在 API 中,請對以下 URI 發出空白 HTTP DELETE 要求:

https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/targetInstances/<target-instance>

私人 VIP 的通訊協定轉送

通訊協定轉送可與具有私人 (RFC 1918) 位址的私人地區轉送規則搭配使用。使用此功能即可設定私人轉送規則,該規則會將 TCP 或 UDP 流量發送到同一地區的目標執行個體。您也可以輕鬆將私人地區轉送規則從使用目標執行個體切換至後端服務,反之亦然。

目標執行個體包含一個後端執行個體,用於處理來自一或多個轉送規則的流量。您只能設定一個私人轉送規則來指向每個目標執行個體。

具有目標執行個體的私人轉送規則 (點選即可放大)
具有目標執行個體的私人轉送規則 (點選即可放大)

請在以下情況使用通訊協定轉送和私人轉送規則。

  • 您希望為您的服務部署單一後端執行個體,並且希望自行管理健康狀態檢查和其他設定。
  • 您希望保留轉送規則私人 IP 位址,並且希望更改轉送規則指向的目標執行個體。
  • 在不變更私人轉送規則 IP 位址的情況下,您希望輕鬆地從單個執行個體 (目標執行個體) 移至多個後端執行個體 (後端服務)。

目標執行個體和後端服務之間的轉換

您可以更新私人轉送規則,從將流量導向至具有單一 VM 執行個體的目標執行個體,更新至將流量導向至後端服務,反之亦然。透過這種方式更新私人轉送規則時,系統將保留轉送規則 IP 地址。由於更改會啟用或禁用後端服務執行個體的負載平衡,現有連線在此轉換期間可能會中斷。

從後端服務轉換至目標執行個體 (點選即可放大)
從後端服務轉換至目標執行個體 (點選即可放大)

您只能使用私人轉送規則在目標執行個體和後端服務之間進行轉換。您無法使用通訊協定轉送與外部轉送規則進行此操作。

更新私人轉送規則的目標

如果您的轉送規則是私人轉送規則,您可以從指向目標執行個體更改為指向後端服務:

    gcloud compute forwarding-rules set-target my-forwarding-rule
        --backend-service my-backend-service

您可以接著轉換回目標執行個體:

    gcloud compute forwarding-rules set-target my-forwarding-rule
        --target-instance my-target-instance

私人轉送規則適用的通訊協定轉送的疑難排解

地區性限制

私人轉送規則適用的通訊協定轉送是地區性產品。所有用戶端和目標執行個體 VM 必須位於相同地區。

錯誤訊息:「內部目標執行個體只能是一個轉送規則的目標」

如果您看到錯誤訊息:「An internal target instance can only be the target of one forwarding rule」,您可能在嘗試將兩個轉送規則指向同一個目標執行個體。您無法將多個轉送規則指向同一個目標執行個體。

限制

  • 當您搭配私人轉送規則使用目標執行個體時,TCP 和 UDP 是唯一支持的通訊協定。

限制

  • 在每個網路中,您可以設定 100 個指向目標執行個體的私人轉送規則。

  • 每個私人轉送規則可以有 5 個通訊埠。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件