这些年总结过多次容器网络数据包路径相关的文章, 如:
但每次过段时间后,总会忘记细节。分析容器网络异常是否是由于某些基于netfilter的驱动影响时,总是要重新梳理。这次再从内核实现的角度来分析一次容器网络数据包的转发路径。
还是以外部访问bridge模式docker容器的场景进行分析。
入包
外部主机访问docker容器的数据包到达网卡后, 由内核函数:netif_receive_skb处理进入协议栈处理。对于IP数据包,会调用到函数ip_rcv:
1 | return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, NULL, skb, |
在这里会进行netfilter的PRE_ROUTING阶段处理。入包在PRE_ROUTING阶段会由docker的iptables规则完成DNAT操作,数据包目的IP变更为docker容器的IP。