网络数据包流程和 Netfilter 框架

包含了 XDP、Netfilter 和 traffic control 部分。带颜色的部分为 Netfilter 模块,有着更细节的内核协议栈各 hook 点位置和 iptables 规则优先级的经典配图.
Netfilter 实际上就是一个过滤器框架,Netfilter 在网络包收发以及路由的“管道”中,一共切了 5 个口(hook),分别是 PREROUTING、FORWARD、POSTROUTING、INPUT 以及 OUTPUT,其它内核模块(例如 iptables、IPVS 等)可以向这些 hook 点注册处理函数。每当有数据包留到网络层,就会自动触发内核模块注册在这里的回调函数,这样程序代码就能够通过回调函数来干预 Linux 的网络通信,进而实现对数据包过滤、修改、SNAT/DNAT 等各类功能。
Kubernetes 集群服务的本质其实就是负载均衡或反向代理,而实现反向代理,归根结底就是做 DNAT,即把发送给集群服务的 IP 地址和端口的数据包,修改成具体容器组的 IP 地址和端口。

当一个 Pod 跨 Node 进行通信时,数据包从 Pod 网络 Veth 接口发送到 cni0 虚拟网桥,进入主机协议栈之后,首先会经过 PREROUTING hook,调用相关的链做 DNAT,经过 DNAT 处理后,数据包目的地址变成另外一个 Pod 地址,再继续转发至 eth0,发给正确的集群节点
