VM 執行個體的特殊設定

本頁說明 Compute Engine 虛擬機器 (VM) 執行個體的特殊網路設定,例如以下幾項:

  • 設定與執行個體之間的外部 HTTP 連線
  • 將執行個體設為網路 Proxy
  • 將執行個體設為 VPN 閘道
  • 將執行個體設為 NAT 閘道
  • 建構具有高可用性及高頻寬的 NAT 閘道

設定與執行個體之間的外部 HTTP 連線

預設防火牆規則不允許透過 HTTP 或 HTTPS 連線到您的執行個體。不過,如果想新增允許這麼做的規則也很容易。請注意,執行個體必須要有外部 IP 位址,才能接收來自虛擬私人雲端網路外部的流量。

您可以使用 gcloud 指令列工具或 Google Cloud Platform 主控台新增防火牆規則,以允許 HTTP 或 HTTPS 連線;或者,也可以透過 API 新增防火牆規則。

主控台

您可以使用 GCP 主控台,來為虛擬私人雲端網路上的所有執行個體建立整體適用的防火牆規則;或者,您也可以在建立執行個體時分別指定選項,以便個別允許特定執行個體存取 HTTP 和 HTTPS 連線。此處先說明後者,因為這個選項對於個別執行個體有比較多的控管權。

  1. 在 GCP 主控台中,前往「VM Instances」(VM 執行個體) 頁面。

    前往 VM 執行個體頁面

  2. 按一下 [建立執行個體]
  3. 在「防火牆」部分中,選取 「允許 HTTP 流量」和「允許 HTTPS 流量」
  4. 按一下 [Create] (建立) 來建立執行個體。

勾選這些核取方塊,虛擬私人雲端網路就會自動建立 default-httpdefault-https 規則,並套用到具有 http-serverhttps-server 標記的所有執行個體。系統也會根據您選取的核取方塊來為新的執行個體加上適當的標記。

如果您有現成的 default-httpdefault-https 防火牆規則,可以在執行個體的詳細資料頁面上啟用 [Allow HTTP] (允許 HTTP) 或 [Allow HTTPS] (允許 HTTPS) 選項,這樣就能將防火牆規則套用到現有的執行個體。

  1. 前往 VM 執行個體頁面
  2. 找到您需要的執行個體並按一下對應名稱。
  3. 按一下頁面頂端的 [編輯] 按鈕。
  4. 向下捲動至「防火牆」部分。
  5. 在需要的虛擬私人雲端網路下,勾選 [允許 HTTP] 或 [允許 HTTPS] 選項。
  6. 按一下 [儲存]

您也可以透過類似的方式,將一個或兩個核取方塊取消勾選,即可停用執行個體的外部 HTTP 或 HTTPS 存取權。

比起建立套用到所有執行個體的整體防火牆規則,讓外部流量存取專案內的所有虛擬機器,只允許為特定執行個體標記 HTTP 和 HTTPS 流量的這個方式,能讓 GCP 避免潛在的安全疑慮。不過,如果您想允許 HTTP 或 HTTPS 流量存取所有虛擬機器執行個體,也可以建立專屬的防火牆規則:

  1. 前往「VPC 網路」頁面。
  2. 選取您要將防火牆規則套用到哪個虛擬私人雲端網路。
  3. 按一下「防火牆規則」部分下方的 [新增防火牆規則]
  4. 為防火牆規則命名,然後在「Protocols & Ports」(通訊協定與通訊埠) 方塊中新增 tcp:80,或為 HTTPS 流量新增 tcp:443
  5. 按一下 [建立]。
gcloud 指令列工具

如果您要允許 HTTP 和 HTTP 流量存取專案中的所有虛擬機器,可以透過下列指令建立防火牆,就能允許從任何地方傳至任何執行個體的 HTTP 和 HTTPS 要求連線到這個虛擬私人雲端網路。

gcloud compute firewall-rules create FIREWALL_RULE --allow tcp:80,tcp:443

**範例**

gcloud compute firewall-rules create sample-http \
 --description "Incoming http and https allowed." \
 --allow tcp:80,tcp:443
gcloud compute firewall-rules describe sample-http
allowed:
- IPProtocol: tcp
  ports:
  - '80'
  - '443'
creationTimestamp: '2014-06-13T13:27:12.206-07:00'
id: '5057780722612413546'
kind: compute#firewall
name: sample-http
network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/samplehttp
sourceRanges:
- 0.0.0.0/0

將執行個體設為網路 Proxy

您可以自行設計虛擬私人雲端網路,只為一個執行個體設定外部存取權,而虛擬私人雲端網路中的所有其他執行個體,則全數以該執行個體為連結外部環境所用的 Proxy 伺服器。不管您想要控管虛擬私人雲端網路的內外部存取權,或想降低因使用多個外部 IP 位址而須支付的成本,都適合採用這種設定。

這個例子主要說明,如何在使用 Debian 映像檔的 VM 執行個體上設定網路 Proxy;這裡是以閘道執行個體做為 Squid Proxy 伺服器,不過,設定 Proxy 伺服器的方式不只這一種。

設定 Squid Proxy 伺服器的步驟如下:

  1. 設定一個有外部 (靜態或臨時) IP 位址的執行個體。請將這個範例的執行個體命名為 gateway-instance
  2. 指定 gcloud compute instances create ... --no-address 即可設定一或多個沒有外部 IP 位址的執行個體。在這個例子中,請呼叫 hidden-instance 執行個體。
  3. 瞭解如何讓不同的執行個體彼此連線,因為您不能直接連線到只限內部使用的執行個體。
  4. 新增防火牆,允許 TCP 流量通過連接埠 3128:

    gcloud compute firewall-rules create [FIREWALL_RULE] --network [NETWORK] --allow tcp:3128
    
  5. gateway-instance 安裝 Squid,然後設定允許虛擬私人雲端網路上的任何機器 (RFC 1918RFC 4193RFC 4291 IP 空間) 進行存取。這項操作假設 gateway-instancehidden-instance 都連線到同一個虛擬私人雲端網路,以透過該網路相互連線。

    user@gateway-instance:~$ sudo apt-get install squid3
    

    啟用區域網路上任何機器使用 Squid3 伺服器的功能。下列 sed 指令取消註解,並針對區域網路和機器啟用 Squid 設定檔中的 acl localnet src 項目。

    user@gateway-instance:~$ sudo sed -i 's:#\(http_access allow localnet\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(http_access deny to_localhost\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 10.0.0.0/8.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 172.16.0.0/12.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 192.168.0.0/16.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fc00\:\:/7.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fe80\:\:/10.*\):\1:' /etc/squid/squid.conf
    
    # Prevent proxy access to metadata server
    user@gateway-instance:~$ sudo cat <<EOF >>/etc/squid/squid.conf
    acl to_metadata dst 169.254.169.254
    http_access deny to_metadata
    EOF
    
    # Start Squid
    user@gateway:~$ sudo service squid3 start
    
  6. hidden-instance 設定為以 gateway-instance 做為 Proxy。使用 SSH 連線至 hidden-instance,並將該執行個體的 Proxy 網址位址定義為指向連接埠 3128 (Squid 預設設定) 上的 gateway-instance,如下所示:

    user@gateway-instance:~$ ssh hidden-instance
    
    user@hidden-instance:~$ sudo -s
    
    root@hidden-instance:~# echo "export http_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export https_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export ftp_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export no_proxy=169.254.169.254,metadata,metadata.google.internal" >> /etc/profile.d/proxy.sh
    

    將 sudoers 更新為傳遞這些 env 變數。

    root@hidden-instance:~# cp /etc/sudoers /tmp/sudoers.new
    
    root@hidden-instance:~# chmod 640 /tmp/sudoers.new
    
    root@hidden-instance:~# echo "Defaults env_keep += \"ftp_proxy http_proxy https_proxy no_proxy"\" >>/tmp/sudoers.new
    
    root@hidden-instance:~# chmod 440 /tmp/sudoers.new
    
    root@hidden-instance:~# visudo -c -f /tmp/sudoers.new && cp /tmp/sudoers.new /etc/sudoers
    
  7. 結束 sudo,載入變數並在 hidden-instance 上執行 apt-get;這時執行個體應該會將閘道視為 Proxy 開始運作。因為 hidden-instance 與網際網路並沒有直接連線,如果不是以閘道做為 Proxy,apt-get 就無法運作。

    root@hidden-instance:~# exit
    
    user@hidden-instance:~$ source ~/.profile
    
    user@hidden-instance:~$ sudo apt-get update
    

將執行個體設為 VPN 閘道

您可以利用 Strongswan VPN 軟體,在其中一個執行個體上設定 VPN 閘道。不過對於大部分的使用者,Google 建議使用 Cloud VPN,不要使用 Strongswan;因為透過 Cloud VPN,您就不需另行建立和設定執行個體來執行 VPN 軟體。Cloud VPN 不能提供必要功能時,再使用 Strongswan 即可。

  1. 建立內部部署網路要連線的虛擬私人雲端網路。

    gcloud compute networks create vpn-network --subnet-mode custom
    
  2. 使用與內部部署子網路不重疊的 IP 範圍建立子網路。

    gcloud compute networks subnets create vpn-subnet \
        --network vpn-network \
        --region us-central1 \
        --range 10.0.0.0/24 \
    
  3. vpn-subnet 子網路中建立執行個體,而這個執行個體就是您的 VPN 閘道。

    gcloud compute instances create vpn-gateway --can-ip-forward \
        --subnet vpn-subnet \
        --zone us-central1-a \
        --tags vpn-gateway
    
  4. 查詢並記下 VPN 閘道的內部和外部 IP 位址。

    gcloud compute instances describe --zone us-central1-a vpn-gateway
    

    外部 IP 位址是 natIP 欄位中的值;內部 IP 位址則是 networkIP 欄位中的值,例如 10.0.0.2。

  5. 建立能透過 VPN 閘道與內部部署網路用戶端通訊的執行個體。

    gcloud compute instances create test-vpn \
        --subnet vpn-subnet \
        --tags vpn \
        --zone us-central1-a
    
  6. vpn-network 網路中建立路徑,讓目的地為內部部署網路的路徑透過 vpn-gateway 傳送流量。

    gcloud compute routes create vpnnetwork-to-gateway \
        --destination-range [ON_PREM_IP_RANGE] \
        --next-hop-address [VPN_GATEWAY_INTERNAL_IP] \
        --network vpn-network \
        --tags vpn
    

    [VPN_GATEWAY_INTERNAL_IP] 值是 VPN 閘道的內部 IP 位址 (也就是 networkIP 欄位中的值)。

  7. 將下列防火牆規則新增到虛擬私人雲端網路,即可接受連入流量。

    gcloud compute firewall-rules create ssh --source-ranges 0.0.0.0/0 \
        --allow tcp:22 \
        --network vpn-network
    
    gcloud compute firewall-rules create  allow-internal \
        --source-ranges 10.0.0.0/24 \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --network vpn-network \
        --allow all
    
    gcloud compute firewall-rules create allow-ipsec-nat \
        --source-ranges [ON_PREM_VPN_GATEWAY_EXTERNAL_IP]/32 \
        --allow udp:4500,udp:500 \
        --network vpn-network \
        --target-tags vpn-gateway
    
    gcloud compute firewall-rules create from-onprem \
        --source-ranges [ON_PREM_NETWORK_ADDRESS_SPACE] \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --network vpn-network \
        --target-tags vpn
    

    在內部部署網路中建立防火牆規則,以便接受來自虛擬私人雲端網路的連入流量。

  8. 連線至您的 VPN 閘道執行個體。

  9. 安裝並設定 Strongswan VPN 軟體。

    從主目錄建立名稱為 ipsec.conf 的檔案。將下列內容填入,並將預留位置替換成您的環境值:

    conn myconn
      authby=psk
      auto=start
      dpdaction=hold
      esp=aes128-sha1-modp2048!
      forceencaps=yes
      ike=aes128-sha1-modp2048!
      keyexchange=ikev2
      mobike=no
      type=tunnel
      left=%any
      leftid=[VPN_GATEWAY_EXTERNAL_IP_ADDRESS]
      leftsubnet=10.0.0.0/24
      leftauth=psk
      leftikeport=4500
      right=[ON_PREM_EXTERNAL_IP_ADDRESS]
      rightsubnet=[ON_PREM_ADDRESS_SPACE]
      rightauth=psk
      rightikeport=4500
    

    然後執行以下指令,並使用密鑰 (一組字串值) 來替換 [secret-key]

    $ sudo apt-get update
    
    $ sudo apt-get install strongswan -y
    
    $ echo "%any : PSK \"[secret-key]\"" | sudo tee /etc/ipsec.secrets > /dev/null
    
    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
    
    $ sudo cp ipsec.conf /etc
    
    $ sudo ipsec restart
    

    此外,您還必須設定內部部署 VPN 閘道,才能順利建立 VPN 通道。

    如果您的內部部署閘道機器執行的是以 Debian 為基礎的作業系統,則可以按照相同的步驟來安裝及設定 Strongswan。舉例來說,您可以製作 ipsec.conf 檔案的複本,然後更換左右兩個 ID 和子網路。

  10. test-vpn 執行個體連線偵測內部部署機器,藉此測試您的 VPN 通道:

    gcloud compute ssh test-vpn --command 'ping -c 3 [ON_PREM_INTERNAL_ADDRESS]'
    

疑難排解

如果您按照上述操作說明設定 VPN 時遇到問題,請嘗試下列小秘訣來排解設定問題:

  1. 檢查您的連線狀態:

    $ sudo ipsec status
    

    如果畫面未列出 myconn,請啟動連線:

    $ sudo ipsec up myconn
    
  2. 判斷兩個 VPN 端點是否都能通訊。

    使用 netcat 來傳送類 VPN 的流量 (UDP,連接埠 4500);在本機 VPN 端點上執行下列命令:

    $ echo | nc -u [vpn-vm-gateway-external-address] 4500
    

    在接收端執行 tcpdump,藉此判斷您的 VM 執行個體是否可以在連接埠 4500 接收封包:

    $ tcpdump -nn -n host [public-ip-of-local-VPN-gateway-machine] -i any
    
  3. 在您的 ipsec.conf 檔案中新增下列指令行,即可開啟較進階的記錄功能:

    config setup
      charondebug="ike 3, mgr 3, chd 3, net 3"
    
    conn myconn
      authby=psk
      auto=start
      ...
    

    接下來,請重新嘗試連線。儘管連線有可能還是失敗,但您這時候就可以從記錄檔中查看錯誤。記錄檔應該會在您 VM 執行個體的 /var/log/charon.log 中。

將執行個體設為 NAT 閘道

如要建立更複雜的網路使用情況,只要修改路徑集合即可。本節說明如何設定內部位址轉譯 (NAT) 閘道執行個體,以從僅限內部使用的虛擬機器執行個體傳送流量到網際網路。這樣一來,您只需讓一個虛擬機器暴露在網際網路中,就能使用一個外部 IP 位址從多個虛擬機器執行個體傳送流量。

  1. 首先,請針對這個情況建立 VPC 網路,用於代管虛擬機器執行個體。

    gcloud compute networks create custom-network1 \
        --subnet-mode custom
    
  2. us-central1 地區建立子網路。

    gcloud compute networks subnets create subnet-us-central \
        --network custom-network1 \
        --region us-central1 \
        --range 192.168.1.0/24
    
  3. 建立防火牆規則,允許您剛剛建立的新網路使用 ssh 連線。

    gcloud compute firewall-rules create custom-network1-allow-ssh \
        --allow tcp:22 \
        --network custom-network1
    
    gcloud compute firewall-rules create custom-network1-allow-internal \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 192.168.1.0/24 \
        --network custom-network1
    
  4. 建立虛擬機器,做為 custom-network1 上的 NAT 閘道。

    gcloud compute instances create nat-gateway --network custom-network1 \
        --subnet subnet-us-central \
        --can-ip-forward \
        --zone us-central1-a \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags nat
    
  5. 將沒有外部 IP 位址且會使用閘道執行個體的任何虛擬機器執行個體標記no-ip,或者建立沒有外部 IP 位址的新執行個體,並將該執行個體標記為 no-ip

    • 將標記新增至現有的執行個體。
    gcloud compute instances add-tags existing-instance --tags no-ip
    
    • 或者,新建一個沒有外部 IP 位址的虛擬機器。
    gcloud compute instances create example-instance --network custom-network1 \
        --subnet subnet-us-central \
        --no-address \
        --zone us-central1-a \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags no-ip
    
  6. 建立路徑,透過您的閘道執行個體傳送目的地為網際網路的流量。

    gcloud compute routes create no-ip-internet-route \
        --network custom-network1 \
        --destination-range 0.0.0.0/0 \
        --next-hop-instance nat-gateway \
        --next-hop-instance-zone us-central1-a \
        --tags no-ip --priority 800
    

    請設定這個路徑的優先順序,遇到其他相衝突的路徑時,系統才能優先選用這個路徑。1000 是預設順序,而低於 1000 的值優先順序較高。

  7. 接下來請登入閘道執行個體,並將 iptables 設為傳送到網際網路的 NAT 內部流量。

    gcloud compute ssh nat-gateway --zone us-central1-a
    

    在您的執行個體中設定 iptables:

    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    

    第一個 sudo 指令可讓核心知道您允許 IP 轉送。第二個 sudo 指令會偽裝成從內部執行個體接收到的封包,就好像這些封包是從 NAT 閘道執行個體傳送來的。

    如要檢查您的 iptables NAT 規則,請使用清單選項:

    $ sudo iptables -v -L -t nat
    

    查看輸出結果是否和以下所列相似:

    Chain PREROUTING (policy ACCEPT 5 packets, 3924 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain INPUT (policy ACCEPT 5 packets, 3924 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain OUTPUT (policy ACCEPT 64 packets, 4164 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
    64  4164 MASQUERADE  all  --  any    eth0    anywhere             anywhere"
    
  8. (選用) 如果您希望日後重新啟動時仍可保留這些設定,請參考以下指令:

    $ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-natgw.conf
    
    $ sudo apt-get install iptables-persistent
    

建構具有高可用性及高頻寬的 NAT 閘道

本節說明如何設定多個 NAT 閘道,並啟用等價多路徑 (ECMP) 轉送及自動修復功能,以支援更彈性且高頻寬的部署作業。

GCP 讓虛擬機器使用 RFC 1918 私人 IP 位址;如果這些 VM 要存取公開網際網路上的資源,就需要 NAT。單一 NAT 閘道架構即已足夠簡易環境使用。不過,總處理量越大、可用性越高就需要越彈性的架構。

設定閘道

如果執行個體中有多個路徑的優先順序相同,則 GCP 會採用 ECMP 轉送來分散流量。在這種情況下,您可以建立數個 NAT 閘道,透過 ECMP 接收部分流量。接著,NAT 閘道會將流量轉送到具有其公開 IP 位址的外部主機。

下圖說明的就是這項設定。

多個閘道設定

如果想要更大的彈性,您可以將每個閘道放在不同的受管理執行個體群組中 (大小為 1),然後再附加簡單的健康狀態檢查,確保這些閘道失敗時都能自動重新啟動。由於閘道是位於個別的執行個體群組中,因此執行個體範本都已附加靜態外部 IP。在本例中,雖然您佈建了三個 n1-standard-2 NAT 閘道,但您可以使用任何其他編號或大小的閘道。舉例來說,n1-standard-2 執行個體的網路流量上限是 4 Gbps;假如您需要處理更高容量的流量,則可選擇 n1-standard-8

  1. 視需要建立虛擬私人雲端網路。如果您不打算將這些閘道新增到現有的虛擬私人雲端,則請建立虛擬私人雲端網路和子網路。如果您會將這些閘道新增到現有虛擬私人雲端,請略過第二個步驟,並根據您的環境將地區修改為適當的值。

    1. 使用 Cloud Shell,建立與 GCP 專案相關聯的自訂虛擬私人雲端。這個虛擬私人雲端可讓您使用非預設的 IP 位址,但不包含任何預設的防火牆規則:

      gcloud compute networks create example-vpc --subnet-mode custom
      
    2. 在這個虛擬私人雲端中建立子網路,並指定地區和 IP 範圍。以這個教學課程來說,請使用 10.0.1.0/24us-east1 地區:

      gcloud compute networks subnets create example-east \
          --network example-vpc --range 10.0.1.0/24 --region us-east1
      
  2. 保留並儲存三個靜態 IP 位址。

    1. 保留並儲存 us-east1 地區中名稱為 nat-1 的位址:

      gcloud compute addresses create nat-1 --region us-east1
      
      nat_1_ip=$(gcloud compute addresses describe nat-1 \
          --region us-east1 --format='value(address)')
      
    2. 保留並儲存 us-east1 中名稱為 nat-2 的位址:

      gcloud compute addresses create nat-2 --region us-east1
      
      nat_2_ip=$(gcloud compute addresses describe nat-2 \
          --region us-east1 --format='value(address)')
      
    3. 保留並儲存 us-east1 中名稱為 nat-3 的位址:

      gcloud compute addresses create nat-3 --region us-east1
      nat_3_ip=$(gcloud compute addresses describe nat-3 \
          --region us-east1 --format='value(address)')
      
  3. 使用預留的 IP 來建立三個執行個體範本。

    1. 複製開機設定:

      gsutil cp gs://nat-gw-template/startup.sh .
      

      如果您無法存取開機指令碼,請直接從「開機指令碼」部分複製。

    2. 建立 nat-1 執行個體範本:

      gcloud compute instance-templates create nat-1 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh --address $nat_1_ip
      
    3. 建立 nat-2 執行個體範本:

      gcloud compute instance-templates create nat-2 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh  --address $nat_2_ip
      
    4. 建立 nat-3 執行個體範本:

      gcloud compute instance-templates create nat-3 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh --address $nat_3_ip
      

      n1-standard-2 機器類型有兩個 vCPU,且可使用最高 4 Gbps 的網路頻寬。如果您需要更多頻寬,可選用其他主機。每個 vCPU 的頻寬為 2 Gbps,因此,8 個 vCPU 的主機上限就是 16 Gbps。

  4. 建立健康狀態檢查來監控回應速度:

    gcloud compute health-checks create http nat-health-check --check-interval 30 \
        --healthy-threshold 1 --unhealthy-threshold 5 --request-path /health-check
    
    gcloud compute firewall-rules create "natfirewall" \
        --allow tcp:80 --target-tags natgw \
        --source-ranges "130.211.0.0/22","35.191.0.0/16"
    

    如果系統失敗且無法回應 HTTP 流量,就會重新啟動。在這個情況下會需要一個專案,您可以使用現有專案或建立新專案。

  5. 為每個 NAT 閘道建立一個執行個體群組:

    gcloud compute instance-groups managed create nat-1 --size=1 --template=nat-1 --zone=us-east1-b
    gcloud compute instance-groups managed create nat-2 --size=1 --template=nat-2 --zone=us-east1-c
    gcloud compute instance-groups managed create nat-3 --size=1 --template=nat-3 --zone=us-east1-d
    
  6. 設定自動修復功能來重新啟動沒有回應的 NAT 閘道:

    gcloud beta compute instance-groups managed set-autohealing nat-1 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-b
    nat_1_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-1/ { print $1 }')
    gcloud beta compute instance-groups managed set-autohealing nat-2 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-c
    nat_2_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-2/ { print $1 }')
    gcloud beta compute instance-groups managed set-autohealing nat-3 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-d
    nat_3_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-3/ { print $1 }')
    
  7. 新增預設路徑到您的執行個體:

    gcloud compute routes create natroute1 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-b \
        --next-hop-instance $nat_1_instance
    gcloud compute routes create natroute2 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-c \
        --next-hop-instance $nat_2_instance
    gcloud compute routes create natroute3 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-d \
        --next-hop-instance $nat_3_instance
    
  8. 把要使用 NAT 的執行個體加上標記:

    gcloud compute instances add-tags natted-servers --tags no-ip
    
  9. 測試 NAT 功能。將閘道設定好並為訪客 VM 加上標記之後,請在不提供 VM 外部 IP 的情況下連線偵測外部主機,如下例所示:

    ping 8.8.8.8

    輸出範例:

    PING 8.8.8.8 (8.8.8.8): 56 data bytes
    64 bytes from 8.8.8.8: icmp_seq=0 ttl=52 time=0.618 ms
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=0.325 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=0.443 ms
    64 bytes from 8.8.8.8: icmp_seq=3 ttl=52 time=0.314 ms
    64 bytes from 8.8.8.8: icmp_seq=4 ttl=52 time=0.386 ms
    

需要考量的問題

這項設定在 us-east1 地區中提供三個 NAT 閘道,每個上限為 2 Gbps。不過,ECMP 負載平衡並不完美,且個別流程也不會分散到多個連結。

  • 這項設定的 Terraform 模組也可以用於自動化部署。
  • 這項設定最適合臨時或非靜態的輸出連結。如果 NAT 閘道集區的大小變更了,TCP 連線可能會重新平衡,而這也許會導致重設已建立的連線。
  • 節點不會自動更新,因此如果 Debian 的預設安裝出現威脅,您就需要手動更新。
  • 這些執行個體全部都位於 us-east1 地區。如果您的 VM 位於其他區域,可能就要將閘道移到距離這些區域較近的地方,才能發揮較好的效能。
  • 每個閘道的頻寬上限為每核心單向 2 Gbps。閘道失敗時,流量會分散到剩餘的其他閘道,但由於執行中的流程並不會重新進行程式設計,因此就算閘道恢復上線,流量也不會立即穩定下來。所以重新調整大小時請務必允許足夠的額外負荷。
  • 想在發生未預期的結果時收到通知,請使用 Stackdriver 監控代管的執行個體群組和網路流量。

開機指令碼:startup.sh

參照步驟 3a 中的開機指令碼:

#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-natgw.conf
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

cat <<EOF > /usr/local/sbin/health-check-server.py
#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
import subprocess

PORT_NUMBER = 80
PING_HOST = "www.google.com"

def connectivityCheck():
  try:
    subprocess.check_call(["ping", "-c", "1", PING_HOST])
    return True
  except subprocess.CalledProcessError as e:
    return False

#This class handles any incoming request
class myHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    if self.path == '/health-check':
      if connectivityCheck():
        self.send_response(200)
      else:
        self.send_response(503)
    else:
      self.send_response(404)

try:
  server = HTTPServer(("", PORT_NUMBER), myHandler)
  print "Started httpserver on port " , PORT_NUMBER
  #Wait forever for incoming http requests
  server.serve_forever()

except KeyboardInterrupt:
  print "^C received, shutting down the web server"
  server.socket.close()
EOF

nohup python /usr/local/sbin/health-check-server.py >/dev/null 2>&1 &

將執行個體 NAT 閘道移轉至 Cloud NAT

若您有執行個體 NAT 閘道,但想將該閘道移轉至 Cloud NAT,請執行以下操作:

  1. 在您的執行個體閘道所在地區設定 Cloud NAT
  2. 刪除一或多個靜態路徑,也就是傳送執行個體 NAT 閘道封包的路徑。請注意,您的網路應有預設閘道路徑。
  3. 流量應會開始通過 Cloud NAT。
  4. 確認一切運作正常後,請刪除執行個體 NAT 閘道。

後續步驟

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

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

這個網頁
虛擬私人雲端