情境
我們在 Google Cloud (舊稱:GCP) 上的服務有使用 Cloud NAT,最近會遇到時好時壞的狀況,看起來是 NAT 有封包被 drop 掉。目前解法是增加 GCP 對外 NAT 的 IP 數量,但我們不能隨意新增 NAT IP 數量,因為被呼叫端有鎖我們過去的 IP 為白名單,請問我們該如何處理?
操作
常見的情況有兩種
第一種情況 Out of Resources,您可以減少您 port 的使用,例如:
- 關閉 Endpoint-Independent Mapping.
- 開啟 dynamic port allocation
- 確認 port 最少的使用量。
第二種情況 Endpoint-Independent Conflict
您可以關閉 Endpoint-Independent Mapping 或是增加每台 VM 最低的 port 數量。
每個 VM 執行個體的最低通訊埠數量 30000 代表 NAT 後端的 VM 每台都會至少開啟這個數量的通訊埠。而這個數量也會影響到 1 個 NAT IP 所能支援的 VM 數量。
以官方文件的例子,計算方式大致如下 (最後數量只取整數):
⌊(1 個 NAT IP) × (每個 IP 64,512 個通訊埠) / (每台 VM 64 個通訊埠)⌋ = 1,008 VMs
⌊(2 個 NAT IP) × (每個 IP 64,512 個通訊埠) / (每台 VM 64 個通訊埠)⌋ = 2,016 VMs
⌊(1 個 NAT IP) × (每個 IP 64,512 個通訊埠) / (每台 VM 4096 個通訊埠)⌋ = 15 VMs
而調大調小的影響: 若是使用靜態分配,調大對於流量不會有實際影響。調小會造成原有的 NAT 連線中斷,用戶端則必須重新建立 TCP 連線。
若是使用動態分配,配置有更改時 (不論調大或調小),所有分配到 VM 的 port 數量會短暫被重新調整至最低數量,這則會造成部份流量影響,或是您也可以選擇減少 port 的使用。
參考文件
[1] https://cloud.google.com/nat/docs/troubleshooting#insufficient-ports
[2] https://cloud.google.com/nat/docs/troubleshooting#endpoint-independent-conflict
[3] https://cloud.google.com/nat/docs/ports-and-addresses#port-reservation-examples
[4] https://cloud.google.com/nat/docs/ports-and-addresses#specs-increasing
[5] https://cloud.google.com/nat/docs/ports-and-addresses#specs-reducing
[6] https://cloud.google.com/nat/docs/troubleshooting#reduce-ports