k8s使用snat使用MASQUERADE

不需要 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
主要点:流量是否完全在集群内流动,集群外的话需要借助node返回给用户
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。