kubernetes flannel 下 外部主机通过nodeport访问pod的问题


场景如下: 外部主机A 通过nodeport方式访问 serverice! 当主机A发出的数据包到达docker网口前,需要经过iptables 的kube-postrouting链,这个链的作用是 将 IP数据包的源ip替换为 docker0
的ip,然后 docker0将修改后的ip数据包转发给pod(这个过程,通过wireshark证实,pod收到的数据包的源ip确实是docker0)。pod做回复处理的时候,ip数据包的目的地址只能是 docker0吧? 那么docker0收到这个数据包,怎么知道真实目的ip是A?
已邀请:

silenceshell - ieevee.com

赞同来自:


这个问题很好,可惜这么久了都没有人回答,我尝试回答一下。

flannel下,的确是同时做了SNAT,是POSTROUTING链上下面这条规则的作用。

-A POSTROUTING ! -s 10.244.0.0/16 -d 10.244.0.0/16 -j MASQUERADE

也就是说,只要源地址不是flannel网络的,就会做源地址转换,在容器里看到的源地址,的确是docker0的地址(在我的环境上是cni0)

题主的问题是,容器中进程把报文扔到docker0网桥上以后,物理机怎么知道真正的源地址呢?
原来,内核记录了回话,回程报文会去根据回话来查找,重新做一次DNAT。

回话记录在/proc/net/nf_conntrack里。
ipv4     2 tcp      6 12 TIME_WAIT src=192.168.143.69 dst=192.168.143.132 sport=36382 dport=5432 src=10.244.0.9 dst=10.244.0.1 sport=5432 dport=36382 [ASSURED] mark=0 zone=0 use=2

要回复问题请先登录注册