排解設定問題

本指南可協助您解決 Cloud NAT 的常見問題。

常見問題

VM 可能在沒有 Cloud NAT 的情況下連上網際網路

如果虛擬機器 (VM) 執行個體或容器執行個體不使用 Cloud NAT 就能連上網際網路,但您不希望這樣,請檢查下列問題:

  • 判斷 VM 的網路介面是否具有外部 IP 位址。如果網路介面已指派外部 IP 位址, Google Cloud會自動對來源符合介面主要內部 IP 位址的封包執行一對一 NAT。詳情請參閱「Cloud NAT 規格」。

    如要判斷 VM 是否有外部 IP 位址,請參閱將外部 IP 位址變更或指派至現有執行個體

  • 確認 Google Kubernetes Engine (GKE) 叢集是私人叢集。非私人叢集中的每個節點 VM 都有外部 IP 位址,因此每個節點都能使用虛擬私有雲 (VPC) 網路中的路徑,而下一個躍點是預設網際網路閘道,不必依賴 Cloud NAT。如要瞭解詳情,包括非私人叢集與 Cloud NAT 閘道的互動方式,請參閱「Compute Engine 互動」。

  • 列出虛擬私有雲網路中的路徑,找出可透過預設網際網路閘道以外的下一個躍點提供網際網路連線的路徑。舉例來說:

    • 下一個躍點為 VM、內部直通網路負載平衡器或 Cloud VPN 通道的靜態路徑,可能會間接提供網際網路連線。舉例來說,內部直通式網路負載平衡器的下一個躍點 VM 或後端 VM 本身可能具有外部 IP 位址,或者 Cloud VPN 通道可能連至提供網際網路存取的網路。

    • 虛擬私有雲網路中的 Cloud Router 從內部部署網路取得的動態路徑,可能會連線至提供網際網路存取的網路。

  • 請注意,虛擬私有雲網路中的其他自訂路徑,優先順序可能高於下一個躍點為預設網際網路閘道的路徑。如要瞭解Google Cloud 如何評估路徑,請參閱「路徑適用範圍與順序」。

不會產生任何記錄

  • 確認已啟用 NAT 記錄
  • 請確認記錄檢視畫面未篩除您要尋找的記錄。如需操作說明,請參閱「查看記錄」。

  • 確認防火牆規則未封鎖流量。系統會在流量傳送至 NAT 閘道前,套用封鎖輸出流量的防火牆規則。您可以透過防火牆規則記錄,查看自訂輸出規則是否封鎖傳出流量。

  • 查看Cloud NAT 類型。流量目的地可能無法由 NAT 處理。

系統會排除特定記錄

  • 確認已啟用 NAT 記錄功能,且記錄篩選器未排除您想保留的記錄。您可以清除記錄篩選器,這樣就不會排除任何項目。

  • Cloud NAT 不會記錄每個事件。在輸出流量較大的期間,系統會根據 VM 的機器類型,按比例節流 NAT 記錄。翻譯或錯誤記錄可能會遭到捨棄,且無法判斷節流期間省略的內容。

封包遭捨棄,原因:資源不足

如果使用 Cloud NAT 的 VM 發生封包遺失情形,可能是因為在封包遺失時,VM 沒有足夠的可用 NAT 來源 IP 位址和來源通訊埠元組 (通訊埠耗盡)。五元組 (NAT 來源 IP 位址、來源通訊埠和目的地三元組) 無法在 TCP TIME_WAIT 超時內重複使用。

如果可用的 NAT 元組不足,dropped_sent_packets_count reason 會是 OUT_OF_RESOURCES。如要進一步瞭解指標,請參閱「使用 VM 執行個體指標」。

如要瞭解如何減少通訊埠用量,請參閱「減少通訊埠用量」。

如果使用動態通訊埠分配,請參閱下一節,瞭解如何在使用動態通訊埠分配時減少封包遺失。

設定動態通訊埠分配時,封包遭捨棄

動態通訊埠分配功能會偵測 VM 何時即將用盡通訊埠,並將分配給 VM 的通訊埠數量加倍。這有助於確保不會浪費連接埠,但分配的連接埠數量增加時,可能會導致封包遭到捨棄。

如要減少遭捨棄的封包數,請考慮下列事項:

  • 如果連線速度較慢,Cloud NAT 就有更多時間分配通訊埠。

  • 如果 VM 正在建立 TCP 連線,您可以為 VM 設定較大的 tcp_syn_retries 值,讓系統有更多時間建立連線,並提高連線成功機率。

    舉例來說,如果是 Linux VM,您可以查看目前的設定:

      sysctl net.ipv4.tcp_syn_retries
      

    如有需要,可以提高設定:

      sudo sysctl -w net.ipv4.tcp_syn_retries=NUM
      

  • 如果您有爆量工作負載,且需要快速分配更多通訊埠,可能需要調整每個 VM 的通訊埠數量下限。查看通訊埠用量,並為每個 VM 決定適當的通訊埠數量下限

封包遭捨棄,原因:端點有獨立性衝突

如果使用 Public NAT 的 VM 發生封包遺失情形,且您已開啟「Endpoint-Independent Mapping」,封包遺失可能是因為端點獨立衝突所致。如果是,則dropped_sent_packets_count 原因ENDPOINT_INDEPENDENCE_CONFLICT。如要進一步瞭解指標,請參閱「使用 VM 執行個體指標」。

您可以運用下列技巧,降低端點獨立衝突的發生機率:

  • 關閉端點獨立對應。 這樣一來,來自特定來源 IP 位址和通訊埠的新連線,就能使用與先前不同的 NAT 來源 IP 位址和通訊埠。停用或啟用與端點無關的對應關係不會中斷已建立的連線。

  • 提高每個 VM 執行個體的 NAT 通訊埠預設數量下限,以便通訊埠預留程序為每個用戶端 VM 指派更多 NAT 來源 IP 位址和來源通訊埠元組。這樣一來,兩個以上的用戶端 IP 位址和暫時性來源通訊埠元組,就不太可能獲派相同的 NAT 來源 IP 位址和來源通訊埠元組。

  • 檢查使用的暫時性來源連接埠數量:

    • Linux VM:

      netstat -an | egrep 'ESTABLISHED|TIME_WAIT|CLOSE_WAIT' | wc -l
      
    • Windows VM:

      netstat -tan | findstr "ESTABLISHED TIME_WAIT CLOSE_WAIT" | find /c /v ""
      
  • 設定 VM 執行個體,使用較大的臨時來源通訊埠集:

    • Linux VM:

      • 您可以使用下列指令,查看設定的通訊埠範圍:

        cat /proc/sys/net/ipv4/ip_local_port_range
        
      • 您可以使用下列指令,將 ip_local_port_range 設為暫時性來源連接埠數量上限 (64,512):

        echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range
        
    • Windows VM:

      • 您可以使用下列指令查看設定的連接埠範圍:

        netsh int ipv4 show dynamicport tcp
        netsh int ipv4 show dynamicport udp
        
      • 您可以使用下列指令,將暫時性來源 TCP 和 UDP 連接埠的數量設為上限 (64,512):

        netsh int ipv4 set dynamicport tcp start=1024 num=64512
        netsh int ipv4 set dynamicport udp start=1024 num=64512
        
      • 在 Google Kubernetes Engine 節點上,您可以使用具備權限的 DaemonSet 自動執行這項設定。

  • 如果是 GKE 叢集,請針對傳送至感興趣目的地的封包,停用每個節點執行的來源 NAT。您可以選擇使用以下其中一種方法:

已收到但遭捨棄的封包

Cloud NAT 閘道會維護連線追蹤表,儲存有效連線詳細資料,以及 IP 位址和通訊埠對應 (VM IP 位址和通訊埠如何轉換為 NAT IP 位址和通訊埠)。如果連線追蹤表沒有連線的任何項目,Cloud NAT 閘道就會捨棄輸入資料封包。

如果表格中沒有連線項目,可能是因為下列任一原因:

  • 已建立的 TCP 連線逾時,因為 TCP 已建立連線閒置逾時時間已到期。
  • 外部端點無法在 TCP 暫時性連線閒置逾時到期前建立新連線。舉例來說, Google Cloud 資源會與 TCP SYN 建立連線,但外部端點無法以 SYN ACK 回應。
  • 外部端點 (例如探測器) 嘗試連線至 NAT IP 位址和連接埠。Cloud NAT 不會接受未經要求的傳入連線。連線表格中不會顯示這類連線的項目。 因此系統會捨棄所有收到的封包。
  • 如果 NAT 連線仍處於啟用狀態,您就從閘道移除 NAT IP,則 NAT 對應會失效,這些連線也會立即從連線追蹤資料表中移除,任何回傳流量都會遭到捨棄。

解決連入封包捨棄問題前,請先確認捨棄是否會實際影響應用程式。如要確認,請在發生大量捨棄的連入封包時,檢查應用程式是否有錯誤。

如果輸入封包捨棄問題會影響應用程式,請嘗試使用下列技術解決問題:

  • 在應用程式中使用存活機制,讓長期連線保持開啟更久的時間。
  • 提高臨時 TCP 連線閒置逾時值,讓透過 Cloud NAT 閘道接收流量 (由 Google Cloud 資源啟動) 的外部端點有更多時間回應及建立連線。
  • 如果大幅降低預設值,請調高 TCP 已建立連線的閒置逾時值。

需要分配更多 IP 位址

有時,VM 無法連上網際網路,是因為您沒有足夠的 NAT IP 位址。這個問題可能有多種原因。詳情請參閱下表。

根本原因 問題 解決方案
您已手動分配地址,但根據目前的連接埠用量,分配的地址數量不足。
  • Google Cloud 控制台顯示錯誤訊息,指出「您至少須再分配『X』個 IP 位址,才能讓所有執行個體都連上網際網路」
  • 指標 nat_allocation_failed 的值為 true

請執行下列任一步驟:

您已超過 NAT IP 位址的硬性限制

如要監控因 IP 位址數量不足而導致的失敗,請為 nat_allocation_failed 指標建立快訊。如果 NAT 閘道無法為任何 VM 分配足夠的 IP 位址,這項指標就會設為 true。 Google Cloud 如要瞭解快訊政策,請參閱設定快訊政策

減少連接埠用量

如果無法或不希望分配更多 NAT IP 位址,您可以盡量減少每個 VM 使用的通訊埠數量。

如要減少使用的連接埠,請完成下列步驟:

  1. 停用端點獨立對應

  2. 啟用動態通訊埠分配。 如要使用動態通訊埠分配功能,請設定每個 VM 的通訊埠數量下限和上限。Cloud NAT 會自動在通訊埠數量下限和上限之間,分配一定數量的 NAT 來源 IP 位址和來源通訊埠元組 (含首尾)。如果將通訊埠數量下限設為較低的值,即可減少在有效連線較少的 VM 上浪費 NAT 來源 IP 位址和來源通訊埠元組。如果在分配通訊埠時發生連線逾時問題,請參閱「使用動態通訊埠分配功能減少封包遺失」。

  3. 判斷滿足需求的最低通訊埠數量下限。有多種方法可以達成這個目標,其中大多數方法都依賴於查看使用的連接埠數量 (compute.googleapis.com/nat/port_usage),並將其做為決策過程的輸入內容。如要瞭解如何查看通訊埠用量,請參閱「查看通訊埠用量」。以下是兩種判斷最少連接埠數量的範例方法:

    • 請考量代表性 VM 數在代表性時間範圍內的 compute.googleapis.com/nat/port_usage 平均值。
    • 請考量代表性 VM 數量在代表性時間範圍內最常出現的值。compute.googleapis.com/nat/port_usage
  4. 判斷滿足需求的最低通訊埠數量上限。再次查看 compute.googleapis.com/nat/port_usage,做為決策程序的輸入內容。以代表性 VM 數量在代表性時間範圍內的最大值 compute.googleapis.com/nat/port_usage 為通訊埠數量上限的起點。請注意,如果將上限設得太高,其他 VM 可能就無法接收 NAT 來源 IP 位址和來源通訊埠元組。

  5. 如要找出通訊埠數量下限和上限的合適值,需要進行反覆測試。如要瞭解如何變更通訊埠號碼下限和上限,請參閱「變更已設定動態通訊埠分配功能的通訊埠下限或上限」。

  6. 請參閱 NAT 超時、其意義和預設值。如需快速建立一系列與相同目的地 3 元組的 TCP 連線,請考慮縮短 TCP 等待時間,讓 Cloud NAT 更快速地重複使用 NAT 來源 IP 位址和來源通訊埠元組。這樣一來,Cloud NAT 就能更快使用相同的 5 元組,而不必使用專屬的 5 元組,這可能需要為每個傳送 VM 分配額外的 NAT 來源 IP 位址和來源通訊埠元組。如要瞭解如何變更 NAT 超時,請參閱「變更 NAT 超時」。

常見問題

Cloud NAT 的地區限制

我可以在多個區域中使用相同的 Cloud NAT 閘道嗎?

否。Cloud NAT 閘道無法與多個區域、VPC 網路或 Cloud Router 建立關聯。

如要為其他區域或虛擬私有雲網路提供連線,請為這些區域或網路建立額外的 Cloud NAT 閘道。

Cloud NAT 閘道使用的外部 NAT IP 位址是全域還是區域?

Cloud NAT 閘道會使用區域外部 IP 位址做為 NAT IP 位址。雖然是區域性 IP 位址,但可公開路由。如要瞭解分配或指派 NAT IP 位址的各種方式,請參閱「NAT IP 位址」。

Cloud NAT 的適用和不適用情況

Cloud NAT 是否適用於有外部 IP 位址的執行個體 (包括 GKE 節點 VM)?

一般來說,不會。如果 VM 的網路介面有外部 IP 位址, Google Cloud 一律會為從網路介面主要內部 IP 位址傳送的封包執行一對一 NAT,而不會使用 Cloud NAT。不過,Cloud NAT 仍可為從該網路介面別名 IP 位址範圍傳送的封包提供 NAT 服務。詳情請參閱 Cloud NAT 規格Compute Engine 互動

如果來源和目的地位於相同虛擬私有雲網路,即使來源 VM 的網路介面沒有外部 IP 位址,公用 NAT 是否仍可讓來源 VM 將流量傳送至有外部 IP 位址的目的地 VM 或負載平衡器?

可以。網路路徑包括透過預設網際網路閘道將流量傳送出虛擬私有雲網路,然後在同一個網路中接收流量。

來源 VM 將封包傳送至目的地時,公用 NAT 會先執行來源 NAT (SNAT),再將封包傳送至第二個執行個體。公開 NAT 會對從第二個執行個體傳送至第一個執行個體的回應執行目的地 NAT (DNAT)。如需逐步範例,請參閱基本公用 NAT 設定和工作流程

我可以使用 Private NAT,在同一個虛擬私有雲網路中的 VM 之間通訊嗎?

不會。Private NAT 不會對同一個虛擬私有雲網路中 VM 之間的流量執行 NAT。

不支援未經要求的連入連線

Cloud NAT 是否允許連線至沒有外部 IP 位址的執行個體 (例如 SSH)?

否,Cloud NAT 不支援未經要求的連入連線。 詳情請參閱「Cloud NAT 規格」。不過,如果目的地 IP 位址是 Cloud NAT 閘道的外部 IP 位址,且該位址至少有一個 VM 執行個體的有效連接埠對應,則 Google Cloud的網路邊緣可能會回應 Ping。如要查看指派給 Cloud NAT 閘道的 IP 位址,請使用 gcloud compute routers get-nat-ip-info 指令。標示為 IN_USE 的外部 IP 位址可能會回應 Ping。

如需連線至沒有外部 IP 位址的 VM,請參閱「選擇僅限內部連線的 VM 連線選項」。舉例來說,在Cloud NAT 範例 Compute Engine 設定中,您可以使用 Identity-Aware Proxy 連線至沒有外部 IP 位址的 VM。

Cloud NAT 和連接埠

為什麼 VM 的通訊埠數量固定 (預設為 64)?

Cloud NAT 閘道為 VM 提供 NAT 時,會根據通訊埠預留程序預留來源位址和來源通訊埠元組。

詳情請參閱通訊埠預留範例

我可以變更為 VM 保留的通訊埠數量下限嗎?

可以。建立新的 Cloud NAT 閘道時,或在之後編輯閘道時,您可以增加或減少每個 VM 的通訊埠數量下限。每個 Cloud NAT 閘道都會根據連接埠預留程序,預留來源位址和來源連接埠元組。

如要進一步瞭解如何減少最低連接埠數量,請參閱下一個問題。

建立 Cloud NAT 閘道後,可以減少每個 VM 的通訊埠數量下限嗎?

可以,但減少通訊埠數量下限可能會導致通訊埠預留程序為每個 VM 預留較少的通訊埠。發生這種情況時,現有的 TCP 連線可能會重設,如果重設,就必須重新建立連線。

將 NAT 對應從主要和次要範圍切換為僅限主要範圍時,系統是否會立即釋放分配給每個執行個體的額外連接埠?

不會。次要範圍使用的任何額外通訊埠都會由執行個體保留,直到每個 VM 的最低通訊埠數量設定減少為止。如果 Cloud NAT 設定為對應子網路的次要 (別名) 範圍,Cloud NAT 會根據通訊埠預留程序,為每個執行個體指派至少 1,024 個通訊埠。

切換為僅使用主要範圍後,Cloud NAT 會為已指派這些通訊埠的執行個體保留額外分配的通訊埠。將 Cloud NAT 適用的範圍變更為「僅限主要」後,除非每個 VM 的通訊埠數量下限設定也減少,否則系統不會變更指派給這些執行個體的實際通訊埠數量。

如要減少分配給這些執行個體的通訊埠數量,請切換至主要範圍,然後減少「每個 VM 的最低通訊埠數量」設定。減少該值後,Cloud NAT 會自動調降每個執行個體分配到的通訊埠數量,進而減少通訊埠用量。

Cloud NAT 和其他 Google 服務

Cloud NAT 是否允許存取 Google API 和服務?

為子網路的主要 IP 範圍啟用 Cloud NAT 時,系統會自動啟用 Google Cloud 私人 Google 存取權。詳情請參閱私人 Google 存取權互動

使用 Gemini Cloud Assist 調查 Cloud NAT 問題

您可以使用 Gemini Cloud Assist 調查功能,排解 Cloud NAT 問題。

如要建立調查,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Cloud NAT」頁面。

    前往 Cloud NAT

  2. 按一下 Cloud NAT 閘道。

  3. 在「Cloud NAT 閘道詳細資料」頁面中,按一下「調查」

  4. 在調查建立面板中,說明要排解的問題,選取受影響的資源,然後按一下「建立」開始調查。

    詳情請參閱「建立調查」。

如果 Cloud NAT 設定有警告和錯誤,警示會顯示「調查」按鈕。建立警告或錯誤的調查時,系統會自動在調查建立面板中預先填入問題說明和相關資源。

後續步驟