針對輸出連線,執行來源網路位址轉譯 (SNAT)
某些案例需要虛擬機器或計算執行個體來進行與網際網路的輸出連線。 Azure 公用負載平衡器的前端 IP 可用來為後端執行個體,提供網際網路的輸出連線能力。 這種設定會使用來源網路位址轉譯 (SNAT) 將虛擬機器的私人 IP 轉譯為負載平衡器的公用 IP 位址。 SNAT 會將後端的 IP 位址對應至負載平衡器的公用 IP 位址。 SNAT 可防止外部來源擁有後端執行個體的直接位址。
Azure 的輸出連線方法
下列方法是 Azure 最常用來啟用輸出連線能力的方法:
# | 方法 | 連接埠配置類型 | 生產環境等級? | Rating |
---|---|---|---|---|
1 | 使用負載平衡器的前端 IP 位址,透過輸出規則進行輸出 | 靜態、明確 | 是,但不是大規模 | [確定] |
2 | 建立 NAT 閘道至子網路的關聯 | 動態、明確 | Yes | 最佳 |
3 | 將公用 IP 指派至虛擬機器 | 靜態、明確 | Yes | [確定] |
4 | 預設輸出存取 | 隱式 | No | 最差 |
1.使用負載平衡器的前端 IP 位址,透過輸出規則進行輸出
輸出規則能讓您針對標準 SKU 公用負載平衡器,來明確定義 SNAT (來源網路位址轉譯)。 此設定可讓您針對後端執行個體的輸出連線能力使用負載平衡器的公用 IP。
此設定會啟用:
IP 偽裝
簡化您的允許清單
減少用於部署的公用 IP 資源數目
使用輸出規則時,您可以對輸出網際網路連線能力具有完整宣告式控制。 輸出規則可讓您透過手動連接埠配置來調整此功能,以滿足您的特定需求。 根據後端集區大小和 frontendIPConfigurations 數目手動設定 SNAT 連接埠,可協助避免 SNAT 耗盡。
您可以依「每個執行個體的連接埠數」或「後端執行個體數目上限」手動配置 SNAT 連接埠。 如果您在後端有虛擬機器,建議您依「每個執行個體的連接埠數」來配置連接埠,以取得最大的 SNAT 連接埠使用量。
計算每個執行個體的連接埠,如下所示:
前端 IP 數目 * 64K/後端執行個體數目
如果您在後端有虛擬機器擴展集,建議依「後端執行個體數目上限」配置連接埠。 如果新增至後端的 VM 超過允許的 SNAT 連接埠剩餘數量,則虛擬機器擴展集可能會遭封鎖,或新的 VM 將無法收到足夠的 SNAT 連接埠。
使用輸出規則設定多個前端IP時,輸出連線可能來自設定為後端實例的任何前端IP。 不建議建置任何可能針對連線選取前端IP的相依性。
如需輸出規則的詳細資訊,請參閱輸出規則。
2.建立 NAT 閘道至子網路的關聯
Azure NAT 閘道可為虛擬網路簡化僅限輸出的網際網路連線能力。 在子網路上設定時,所有輸出連線都會使用您指定的靜態公用 IP 位址。 在沒有負載平衡器或直接連結至虛擬機器的公用 IP 位址的情況下,輸出連線是可行的。 NAT 網路閘道完全受控且具有高度復原性。
使用 NAT 閘道是輸出連線能力的最佳方法。 NAT 閘道可高度擴充且可靠,也沒有 SNAT 連接埠耗盡的相同顧慮。
NAT 閘道優先於其他輸出連線方法,包括負載平衡器、執行個體層級公用 IP 位址和 Azure 防火牆。
如需 Azure NAT 網路閘道的詳細資訊,請參閱什麼是 Azure NAT 網路閘道 (部分機器翻譯)。
3.將公用 IP 指派至虛擬機器
關聯 | 方法 | IP 通訊協定 |
---|---|---|
VM NIC 上的公用 IP | 系統不會使用 SNAT (來源網路位址轉譯) 。 |
TCP (傳輸控制通訊協定) UDP (使用者資料包協定) ICMP (網際網路控制訊息通訊協定) ESP (封裝安全性承載) |
流量會從虛擬機器的公用 IP 位址 (執行個體層級 IP) 回到要求用戶端。
Azure 會使用指派給執行個體 NIC 之 IP 設定的公用 IP 進行所有輸出流程。 執行個體有所有可用的暫時連接埠。 VM 進行負載平衡與否並不重要。 此案例的優先順序高於其他案例,但 NAT 閘道除外。
指派給虛擬機器的公用 IP 是 1:1 關聯 (而非 1:多) 而且會實作為無狀態 1:1 NAT。
4.預設輸出存取
在 Azure 中,建立在虛擬網路中但未明確定義輸出連線能力的虛擬機器,會獲指派預設的輸出公用 IP 位址。 此 IP 位址可讓資源輸出連線到網際網路。 這項存取稱為預設輸出存取。 不建議使用這種存取方法,因為它不安全,而且IP位址可能會變更。
重要
在 2025 年 9 月 30 日,新部署的預設輸出存取將會淘汰。 如需詳細資訊,請參閱官方公告。 建議使用一種明確的連線形式,如上述選項 1-3 所示。
什麼是 SNAT 連接埠?
連接埠是用來產生維護相異流程的唯一識別碼。 網際網路會使用五個元組來提供這種差異。
如果連接埠用於輸入連線,就會有該連接埠上輸入連線要求的接聽程式。 該連接埠無法用於輸出連線。 若要建立輸出連線,則會使用暫時連接埠來提供目的地連接埠,以進行通訊並維護不同的流量流程。 當這些暫時連接埠用於 SNAT 時,稱為 SNAT 連接埠。
根據定義,每個 IP 位址都有 65535 個連接埠。 每個連接埠都可以用於 TCP (傳輸控制通訊協定) 和 UDP (使用者資料包協定) 的輸入或輸出連線。 將公用 IP 位址新增為負載平衡器的前端 IP 時,有 64000 個連接埠適用於 SNAT。
負載平衡或輸入 NAT 規則中使用的每個連接埠都會從 64,000 個可用 SNAT 連接埠中取用八個連接埠的範圍。 如果輸出連線使用相同的前端 IP,則此使用方式會減少符合 SNAT 資格的連接埠數目。 如果負載平衡或輸入 NAT 規則取用的連接埠位於另一個規則所取用之八個連接埠的相同區塊中,那麼規則就不需要額外的連接埠。
注意
如果您需要連線到任何支援的 Azure PaaS 服務,例如 Azure 儲存體、Azure SQL 或 Azure Cosmos DB,則您可以使用 Azure Private Link 來澈底迴避 SNAT。 Azure Private Link 會透過 Azure 骨幹網路 (而非透過網際網路傳送) 將來自虛擬網路的流量傳送至 Azure 服務。
Private Link 是私人存取 Azure 託管服務的服務端點所建議的選項。 若要深入了解 Private Link 與服務端點之間的差異,請參閱比較私人端點和服務端點。
預設 SNAT 的運作方式為何?
當 VM 建立輸出流程時,Azure 會將來源 IP 位址轉譯為暫時 IP 位址。 這項轉譯是透過 SNAT 完成的。
如果透過公用負載平衡器執行 SNAT,卻沒有輸出規則,則會預先配置 SNAT 連接埠,如下列預設 SNAT 連接埠配置表所述:
預設連接埠配置表
選取負載平衡規則以使用預設連接埠配置,或輸出規則設定為「使用預設輸出連接埠數目」時,預設會根據後端集區大小來配置 SNAT 連接埠。 後端會接收數據表所定義的埠數目,每個前端IP最多1024個埠。
例如,在後端集區中有 100 部 VM,且只有一個前端 IP,每個 VM 都會接收 512 個埠。 如果新增第二個前端IP,則每個VM會收到額外的512個埠。 這表示每個 VM 共配置 1,024 個埠。 因此,新增第三個前端 IP 不會使配置的 SNAT 連接埠數目超過 1024 個。
根據經驗法則,套用預設埠配置時提供的 SNAT 埠數目可以計算為:MIN(根據集區大小提供的預設 SNAT 埠數目 * 與集區相關聯的前端 IP 數目,1024)
下列資料表顯示單一前端 IP 的 SNAT 連接埠預先配置,具體視後端集區大小而定:
集區大小 (VM 執行個體) | 預設 SNAT 連接埠 |
---|---|
1-50 | 1,024 |
51-100 | 512 |
101-200 | 256 |
201-400 | 128 |
401-800 | 64 |
801-1,000 | 32 |
連接埠耗盡
相同目的地 IP 和目的地連接埠的每個連線皆使用 SNAT 連接埠。 此連線會維護從後端執行個體或用戶端到伺服器的相異流量。 此流程會為伺服器提供用來處理流量的不同連接埠。 如果沒有此流程,用戶端電腦就不會察覺封包所屬的流程。
想有多個瀏覽器進入 https://www.microsoft.com,也就是:
目的地 IP = 23.53.254.142
目的地連接埠 = 443
通訊協定 = TCP
如果沒有傳回流量的 SNAT 連接埠,用戶端就無法將一個查詢結果與另一個查詢結果分開。
輸出連線可能會突然增加。 後端執行個體配置的連接埠可能不足。 在您的應用程式中使用連線重複使用功能。 如果沒有連線重複使用,則會增加 SNAT 連接埠耗盡的風險。
如需有關使用 Azure App Service 的連線共用的詳細資訊,請參閱 Azure App Service 中的間歇性輸出連線錯誤疑難排解
發生連接埠耗盡時,目的地 IP 的新輸出連線會失敗。 當連接埠可供使用時,連線就會成功。 當來自 IP 位址的 64000 個連接埠分散在許多後端執行個體上時,就會發生這種耗盡狀況。 如需有關如何緩和 SNAT 連接埠耗盡的指引,請參閱疑難排解指南。
埠重複使用
針對 TCP 連線,負載平衡器會針對每個目的地 IP 和連接埠使用單一 SNAT 連接埠。 對於相同目的地 IP 的連線,只要目的地埠不同,就可以重複使用單一 SNAT 埠。 當已存在與相同目的地 IP 和埠的連線時,就無法重複使用。
針對UDP連線,負載平衡器會使用 埠限制的 Cone NAT 演算法,不論目的地埠為何,都會針對每個目的地 IP 取用一個 SNAT 埠。
允許重複使用的任意數目連線可以重複使用個別埠(目的地IP或埠不同時)。
在下表的範例中,具有私人IP 10.0.0.1的後端實例會對目的地 IP 23.53.254.142 和 26.108.254.155 進行 TCP 連線,而負載平衡器則設定為前端 IP 位址 192.0.2.0。 由於目的地 IP 不同,因此可以重複使用相同的 SNAT 埠進行多個連線。
Flow | 來源元組 | SNAT 之後的來源元組 | 目的地元組 |
---|---|---|---|
1 | 10.0.0.1:80 | 192.0.2.0:1 | 23.53.254.142:80 |
2 | 10.0.0.1:80 | 192.0.2.0:1 | 26.108.254.155:80 |
限制
當連線閒置且沒有傳送新的封包時,連接埠會在 4–120 分鐘後釋出。
您可以透過輸出規則設定此閾值。
每個 IP 位址都提供可用於 SNAT 的 64000 個連接埠。
每個連接埠都可以同時用於目的地 IP 位址的 TCP 和 UDP 連線
無論目的地連接埠是否唯一,都需要 UDP SNAT 連接埠。 針對目的地 IP 的每個 UDP 連線,會使用一個 UDP SNAT 連接埠。
TCP SNAT 連接埠可用於多個連線至相同目的地 IP 的連線,但前提是目的地連接埠不同。
當後端執行個體用盡指定的 SNAT 連接埠時,就會發生 SNAT 耗盡。 負載平衡器仍可能有未使用的 SNAT 連接埠。 如果後端執行個體已使用的 SNAT 連接埠超過其指定的 SNAT 連接埠,則無法建立新的輸出連線。
除非透過 VM 的 NIC 上的執行個體層級公用 IP 進行輸出,否則會捨棄分散的封包。
輸出規則不支持網路介面的次要 IPv4 設定。 如需次要 IPv4 組態的輸出連線,請附加實例層級公用 IP,或改用 NAT 閘道。
下一步
- 針對發生 SNAT 耗盡的輸出連線失敗進行疑難排解
- 複習 SNAT 計量,並熟悉其篩選、分割和檢視的正確方式。
- 了解如何將現有的輸出連線能力方法遷移至 NAT 閘道