k8s使用snat使用MASQUERADE

不需要 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
主要點(diǎn):流量是否完全在集群內(nèi)流動(dòng),集群外的話需要借助node返回給用戶
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容