【網絡】iptables 1 概念
【網絡】iptables 2 查看規則
【網絡】使用 DNAT 進行負載均衡時,若未配置配套的 SNAT,回包失敗
【網絡】回包路由原理
使用 DNAT 進行負載均衡時,若未配置配套的 SNAT,后端服務器將直接回包給客戶端,導致客戶端因收到源 IP 不匹配的響應而丟棄數據包,最終連接失敗。
場景設定
客戶端 (Client):?
IP_C
負載均衡器 (Load Balancer):?
IP_VIP
?(虛擬服務 IP),?IP_LB
?(LB 的內部接口 IP)后端真實服務器 (Real Server):?
IP_RS1
,?IP_RS2
網絡拓撲:
客戶端?
IP_C
?可以訪問?IP_VIP
。負載均衡器?
IP_LB
?可以訪問后端服務器?IP_RS1/RS2
。后端服務器?
IP_RS1/RS2
?知道如何到達?IP_C
(例如,IP_C
?和?IP_RS
?在同一個二層網絡,或者?IP_RS
?的默認網關指向了能到達?IP_C
?的路由器)。
流量路徑分析
1. 請求 (Request) 路徑:IP_C -> IP_VIP
客戶端發送:?
IP_C
?發送一個請求包到?IP_VIP
。到達負載均衡器: 包到達負載均衡器。此時包的源/目的為:
src=IP_C, dst=IP_VIP
。iptables DNAT 執行:
負載均衡器上的?
iptables
?規則(通常在?PREROUTING
?鏈的?nat
?表)匹配到該包。執行 DNAT,將目的 IP?從?
IP_VIP
?修改為某個后端服務器的 IP,例如?IP_RS1
。關鍵:?源 IP (
IP_C
) 保持不變。包變為:
src=IP_C, dst=IP_RS1
。
負載均衡器轉發: 負載均衡器根據路由表,將修改后的包轉發給?
IP_RS1
。
2. 響應 (Response) 路徑:IP_RS1 -> IP_C
?(問題發生!)
后端服務器處理:?
IP_RS1
?收到一個來自?IP_C
?的請求包(src=IP_C, dst=IP_RS1
)。它認為這是一個直接的、正常的連接。后端服務器直接回包:
IP_RS1
?準備響應包。它查詢自己的路由表,發現有到達?
IP_C
?的路由(直連或通過網關)。因此,它直接將響應包發送給?
IP_C
。響應包的源/目的為:
src=IP_RS1, dst=IP_C
。
響應包繞過負載均衡器: 這個響應包直接從?
IP_RS1
?發往?IP_C
,完全繞過了負載均衡器。
產生的問題
客戶端收到“錯誤”的響應:
客戶端?
IP_C
?發起的是到?IP_VIP
?的連接。它期望收到的響應包的源 IP 是?
IP_VIP
。但它實際收到的響應包的源 IP 是?
IP_RS1
。客戶端的 TCP/IP 協議棧會認為這是一個不屬于任何已知連接的、無效的包(因為五元組?
src=IP_RS1, dst=IP_C
?與它發起的?src=IP_C, dst=IP_VIP
?不匹配)。結果: 客戶端通常會丟棄這個包,并可能發送一個?
RST
?(復位) 包給?IP_RS1
,導致連接中斷。
連接狀態不完整:
負載均衡器只看到了請求包(并執行了 DNAT),但從未看到響應包。
它無法維護一個完整的連接狀態(conntrack)。如果后續有同一個連接的包到達,負載均衡器可能會再次進行 DNAT 決策,導致行為不一致。
非對稱路由 (Asymmetric Routing):
請求路徑:?
IP_C -> LB -> IP_RS1
響應路徑:?
IP_RS1 -> IP_C
?(繞過 LB)這種進出路徑不一致的情況就是非對稱路由,在安全設備、狀態防火墻等場景下會引發問題。
為什么需要 SNAT/MASQUERADE?
為了解決上述問題,必須確保響應包也經過負載均衡器。這就是 SNAT 或 MASQUERADE 的作用。
在 DNAT 的同時配置 SNAT:
當負載均衡器執行 DNAT (
dst=IP_VIP -> dst=IP_RS1
) 時,同時執行 SNAT,將源 IP?從?IP_C
?修改為負載均衡器自己的 IP (IP_LB
)。發送給后端服務器的包變為:
src=IP_LB, dst=IP_RS1
。
后端服務器回包:
IP_RS1
?收到?src=IP_LB, dst=IP_RS1
?的包。它認為連接是?
IP_LB
?發起的,所以會回復?IP_LB
:src=IP_RS1, dst=IP_LB
。這個包必須經過負載均衡器(因為?
IP_LB
?是它的直接鄰居或默認網關)。
負載均衡器處理回包:
負載均衡器收到?
src=IP_RS1, dst=IP_LB
?的包。它查詢連接跟蹤表 (conntrack),找到原始連接記錄(
orig=IP_C->IP_VIP, reply=IP_RS1->IP_LB
)。執行逆向轉換:
將目的 IP 從?
IP_LB
?改回?IP_C
?(逆向 SNAT)。將源 IP 從?
IP_RS1
?改回?IP_VIP
?(逆向 DNAT)。
最終發給客戶端的包為:
src=IP_VIP, dst=IP_C
,客戶端完全滿意。
總結
在 iptables
DNAT 負載均衡中,如果不配置 SNAT/MASQUERADE:
后端服務器會直接回包給客戶端,繞過負載均衡器。
客戶端收到源 IP 錯誤的響應包(是?
IP_RS
?而不是?IP_VIP
)。客戶端丟棄響應包,導致連接失敗。
因此,在標準的 DNAT 負載均衡場景中,SNAT/MASQUERADE 不是“可選”,而是“必需”的,以保證流量路徑的對稱性和連接的完整性。