不需要 MASQUERADE 的場(chǎng)景 (ClusterIP)
- Kubernetes ClusterIP Service 的標(biāo)準(zhǔn)配置,在集群內(nèi)部通信時(shí)確實(shí)不需要 MASQUERADE(SNAT)
-
pod訪問service,響應(yīng)不經(jīng)過 service
image.png
image.png
數(shù)據(jù)包流向示例(ClusterIP):
客戶端 Pod (172.16.3.4) → ClusterIP (10.96.1.2:80)
→ DNAT 到目標(biāo) Pod (172.16.1.2:9376) ## dnat在當(dāng)前node會(huì)conntrack記錄dnat狀態(tài),下一步回到當(dāng)前node會(huì)直接映射回來原本的,因?yàn)榘l(fā)起請(qǐng)求的pod和原來的node是同一個(gè)節(jié)點(diǎn)
→ 目標(biāo) Pod 直接回復(fù)客戶端 (172.16.3.4)
驗(yàn)證命令:
conntrack -L -d 10.96.1.2 -p tcp
需要 MASQUERADE 的場(chǎng)景 (NodePort/LoadBalancer)
- (1)外部流量進(jìn)入集群
外部客戶端 IP 會(huì)被替換為節(jié)點(diǎn) IP,以確保回復(fù)流量能正確返回。
對(duì)應(yīng)規(guī)則示例:
-A KUBE-SEP-YYYY1 -p tcp -j DNAT --to-destination 172.16.1.2:9376
-A KUBE-SEP-YYYY1 -p tcp -j MASQUERADE # 額外啟用 SNAT
確保回復(fù)流量返回節(jié)點(diǎn):
外部客戶端(如公網(wǎng)用戶)的請(qǐng)求通過 NodePort 或 LB 進(jìn)入集群。
如果 Pod 直接回復(fù)客戶端,客戶端可能丟棄數(shù)據(jù)包(因未主動(dòng)與 Pod 建立連接)。
SNAT 將客戶端 IP 替換為節(jié)點(diǎn) IP,使回復(fù)流量先回到節(jié)點(diǎn),再由節(jié)點(diǎn)轉(zhuǎn)發(fā)給客戶端。
數(shù)據(jù)包流向示例(NodePort):
外部客戶端 (192.168.1.100) → NodePort (10.0.0.1:30080)
→ DNAT 到目標(biāo) Pod (172.16.1.2:9376)
→ SNAT 將源 IP 改為節(jié)點(diǎn) IP (10.0.0.1)
→ Pod 回復(fù)節(jié)點(diǎn) (10.0.0.1) ## 因?yàn)閜od和node不一定是在同一個(gè)節(jié)點(diǎn)的,相同節(jié)點(diǎn)直接返回沒問題,但是pod和noded不在同一個(gè),只能回復(fù)響應(yīng)到節(jié)點(diǎn)node,直接響應(yīng)給用戶dnat不在用戶的conntrack中,這樣就會(huì)默認(rèn)隱藏用戶的真實(shí)IP
→ 節(jié)點(diǎn)轉(zhuǎn)發(fā)給客戶端 (192.168.1.100)
驗(yàn)證命令:
conntrack -L -d 10.0.0.1 -p tcp --dport 30080

