不需要 MASQUERADE 的场景 (ClusterIP)
- Kubernetes ClusterIP Service 的标准配置,在集群内部通信时确实不需要 MASQUERADE(SNAT)
-
pod访问service,响应不经过 service
image.png
image.png
数据包流向示例(ClusterIP):
客户端 Pod (172.16.3.4) → ClusterIP (10.96.1.2:80)
→ DNAT 到目标 Pod (172.16.1.2:9376) ## dnat在当前node会conntrack记录dnat状态,下一步回到当前node会直接映射回来原本的,因为发起请求的pod和原来的node是同一个节点
→ 目标 Pod 直接回复客户端 (172.16.3.4)
验证命令:
conntrack -L -d 10.96.1.2 -p tcp
需要 MASQUERADE 的场景 (NodePort/LoadBalancer)
- (1)外部流量进入集群
外部客户端 IP 会被替换为节点 IP,以确保回复流量能正确返回。
对应规则示例:
-A KUBE-SEP-YYYY1 -p tcp -j DNAT --to-destination 172.16.1.2:9376
-A KUBE-SEP-YYYY1 -p tcp -j MASQUERADE # 额外启用 SNAT
确保回复流量返回节点:
外部客户端(如公网用户)的请求通过 NodePort 或 LB 进入集群。
如果 Pod 直接回复客户端,客户端可能丢弃数据包(因未主动与 Pod 建立连接)。
SNAT 将客户端 IP 替换为节点 IP,使回复流量先回到节点,再由节点转发给客户端。
数据包流向示例(NodePort):
外部客户端 (192.168.1.100) → NodePort (10.0.0.1:30080)
→ DNAT 到目标 Pod (172.16.1.2:9376)
→ SNAT 将源 IP 改为节点 IP (10.0.0.1)
→ Pod 回复节点 (10.0.0.1) ## 因为pod和node不一定是在同一个节点的,相同节点直接返回没问题,但是pod和noded不在同一个,只能回复响应到节点node,直接响应给用户dnat不在用户的conntrack中,这样就会默认隐藏用户的真实IP
→ 节点转发给客户端 (192.168.1.100)
验证命令:
conntrack -L -d 10.0.0.1 -p tcp --dport 30080