排解設定問題
本指南可協助您解決 Cloud NAT 的常見問題。
常見問題
在沒有 Cloud NAT 的情況下,VM 可能會意外連上網際網路
如果虛擬機器 (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 互動。
在虛擬私有雲網路中列出路徑,找出可透過下一個躍點提供網際網路連線的路徑,該躍點必須與預設網際網路閘道不同。舉例來說:
請注意,VPC 網路中的其他自訂路徑可能比下一個躍點為預設網際網路閘道的路徑優先順序更高。如要瞭解Google Cloud 如何評估路徑,請參閱「轉送的適用性和順序」。
不會產生任何記錄
- 確認已啟用 NAT 記錄功能。
請仔細檢查記錄檢視畫面是否篩除您要查看的記錄。如需操作說明,請參閱「查看記錄」。
請確認防火牆規則不會封鎖流量。系統會在流量傳送至 NAT 閘道之前,套用封鎖輸出 (外送) 流量的防火牆規則。您可以使用防火牆規則記錄功能,查看自訂傳出規則是否封鎖傳出流量。
請參閱「Cloud NAT 類型」。流量目的地可能不會由 NAT 處理。
排除特定記錄檔
確認已啟用 NAT 記錄功能,且記錄篩選器不會排除您要保留的記錄。您可以清除記錄檔篩選器,讓系統不排除任何項目。
Cloud NAT 不會記錄每個事件。在輸出流量繁重的期間,NAT 記錄會受到限制,並與 VM 的機器類型成比例。翻譯或錯誤記錄可能會遭到捨棄,而且無法判斷在節流期間省略了哪些內容。
封包遭到捨棄,原因:資源用盡
如果您發現使用 Cloud NAT 的 VM 發生封包遺失,可能是因為在封包遺失 (通訊埠用盡) 時,VM 可用的 NAT 來源 IP 位址和來源通訊埠元組不夠多。五元組 (NAT 來源 IP 位址、來源通訊埠和目的地 3 元組) 無法在 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 的適當最低通訊埠數量。
封包遭到捨棄,原因:端點獨立性衝突
如果您發現使用公開 NAT 的 VM 發生封包遺失,且已啟用端點無關對應,則封包遺失可能由端點無關衝突所造成。如果是,則 dropped_sent_packets_count
reason 為 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。您可以透過下列任一方式執行此操作:
部署
ip-masq-agent
,並將感興趣的目的地新增至nonMasqueradeCIDRs
清單。建立叢集時,使用
--disable-default-snat
標記為預設非偽裝目的地停用 SNAT。
已收到但遭捨棄的封包
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 位址。這類問題可能有多種原因。詳情請參閱下表。
根本原因 | 問題 | 解決方案 |
---|---|---|
您已手動分配地址,但考量目前的通訊埠使用量,您分配的地址數量不足。 |
|
執行下列其中一個步驟:
|
您已超過 NAT IP 位址的硬性限制。 |
|
|
如要監控因 IP 位址數量不足而導致的失敗情形,請為 nat_allocation_failed
指標建立快訊。如果 Google Cloud 無法為 NAT 閘道中的任何 VM 分配足夠的 IP 位址,這項指標就會設為 true
。如要瞭解快訊政策,請參閱「定義快訊政策」。
減少通訊埠用量
在無法或不希望分配更多 NAT IP 位址的情況下,您可以將每個 VM 使用的通訊埠數量降至最低。
如要減少連接埠使用量,請完成下列步驟:
啟用動態通訊埠分配功能。如要使用動態通訊埠分配功能,您必須設定每個 VM 的通訊埠數量下限和上限。Cloud NAT 會在最低和最高通訊埠數量之間 (含兩者),自動分配多個 NAT 來源 IP 位址和來源通訊埠元組。使用較低的最低通訊埠數量,可減少在連線數量較少的 VM 上浪費 NAT 來源 IP 位址和來源通訊埠元組的情況。如果在分配連接埠時發生連線逾時問題,請參閱「透過動態連接埠分配功能減少封包遺失」。
決定滿足需求的最低通訊埠數量。這麼做的方法有很多種,大多是透過檢查已用連接埠數量 (
compute.googleapis.com/nat/port_usage
) 來做為決策過程的輸入內容。如要瞭解如何查看通訊埠用量,請參閱「查看通訊埠用量」。以下是兩種用於判斷最低連接埠數量的範例方法:- 請考量
compute.googleapis.com/nat/port_usage
在代表性時間範圍內的平均值,以及代表性 VM 數量。 - 請考量代表性 VM 數量在代表性時間範圍內,
compute.googleapis.com/nat/port_usage
最常出現的值。
- 請考量
決定滿足需求的最低通訊埠數量上限。再次檢查
compute.googleapis.com/nat/port_usage
,將其做為決策過程的輸入內容。請考量代表性時間範圍內的compute.googleapis.com/nat/port_usage
最大值,並以此為代表性 VM 數量的起點,計算通訊埠數量上限。請注意,設定的最大值過高可能會導致其他 VM 無法接收 NAT 來源 IP 位址和來源通訊埠元組。找出最小和最大通訊埠的正確值需要進行多次測試。如要瞭解如何變更最小和最大通訊埠編號,請參閱「在設定動態通訊埠分配功能時,變更最小或最大通訊埠」一文。
請查看NAT 逾時、其含義和預設值。如果您需要快速建立一系列 TCP 連線,以連線至相同的目的地 3 元組,請考慮減少 TCP 等待時間,讓 Cloud NAT 更快重複使用 NAT 來源 IP 位址和來源通訊埠元組。這可讓 Cloud NAT 更快使用相同的 5 組合,而不需要使用獨特的 5 組合,因為後者可能需要為每個傳送 VM 分配額外的 NAT 來源 IP 位址和來源通訊埠組合。如要瞭解變更 NAT 逾時期限的步驟,請參閱「變更 NAT 逾時期限」。
常見問題
Cloud NAT 的地區限制
我可以在多個區域中使用相同的 Cloud NAT 閘道嗎?
否。Cloud NAT 閘道無法與多個區域、虛擬私有雲網路或 Cloud Router 建立關聯。
如果您需要為其他區域或 VPC 網路提供連線,請為這些區域或網路建立其他 Cloud NAT 閘道。
Cloud NAT 閘道使用的外部 NAT IP 位址是全球或區域性?
Cloud NAT 閘道會使用區域外部 IP 位址做為 NAT IP 位址。雖然是區域性質,但可公開路由。如要瞭解分配或指派 NAT IP 位址的不同方式,請參閱「NAT IP 位址」。
可使用和無法使用 Cloud NAT 的情況
Cloud NAT 是否適用於具有外部 IP 位址的執行個體 (包括 GKE 節點 VM)?
一般來說,不會。如果 VM 的網路介面具有外部 IP 位址, Google Cloud 會一律為從網路介面的主要內部 IP 位址傳送的封包執行 1 對 1 NAT,而不會使用 Cloud NAT。不過,Cloud NAT 仍可為從同一個網路介面的別名 IP 位址範圍傳送的封包提供 NAT 服務。如需更多詳細資訊,請參閱「Cloud NAT 規格」和「Compute Engine 互動」。
即使來源和目的地位於同一個虛擬私有雲網路,公用 NAT 是否仍可讓網路介面缺少外部 IP 位址的來源 VM 將流量傳送至具有外部 IP 位址的目的 VM 或負載平衡器?
可以,網路路徑會透過預設網際網路閘道將流量傳送出虛擬私人雲端網路,然後在相同網路中接收。
當來源 VM 將封包傳送至目的地時,Public NAT 會先執行來源 NAT (SNAT),然後再將封包傳送至第二個執行個體。公用 NAT 會針對從第二個執行個體傳回至第一個執行個體的回應,執行目的地 NAT (DNAT)。如需逐步操作範例,請參閱「基本公用 NAT 設定和工作流程」。
我可以使用 Private NAT 在同一個虛擬私有雲網路中的 VM 之間進行通訊嗎?
否,Private NAT 不會在相同虛擬私有雲網路的 VM 之間執行 NAT。
不支援未經同意的傳入連線
Cloud NAT 是否允許傳入連線 (例如 SSH) 連線至沒有外部 IP 位址的執行個體?
否,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 僅套用至 Primary 的範圍後,系統會同時減少每個 VM 的通訊埠數量下限設定,才會變更指派給這些執行個體的實際通訊埠數量。
如要減少分配給這些執行個體的通訊埠數量,請在切換至主要範圍後,降低每個 VM 的最低通訊埠數量設定。當該值降低後,Cloud NAT 會自動調整每個執行個體的通訊埠數量,進而減少通訊埠用量。
Cloud NAT 和其他 Google 服務
Cloud NAT 是否可存取 Google API 和服務?
為子網路的主要 IP 範圍啟用 Cloud NAT 時, Google Cloud 會自動啟用私人 Google 存取權。詳情請參閱「私人 Google 存取權互動」。