Flannel后端为UDP模式下,分析数据包的发送方式——tun设备(三)
在分析 Kubernetes 环境中 Flannel UDP 模式的数据包转发时,我们提到 flannel.1
是一个 TUN 设备,它在数据包处理中起到了关键作用。
什么是 TUN 设备?
TUN 设备(Tunnel 设备)是 Linux 系统中一种虚拟网络接口,工作在 网络层(Layer 3),用于在用户态和内核态之间传递 IP 数据包。TUN 设备是 虚拟化网络 的核心组件,常用于 VPN、隧道技术(如 Flannel、OpenVPN)和网络虚拟化场景。
关键特性
- 工作层次:TUN 设备处理 IP 数据包(网络层),而不处理链路层帧(如以太网帧)。相比之下,TAP 设备 工作在链路层(Layer 2),处理以太网帧。
- 用户态与内核态桥接:TUN 设备充当用户态程序(如
flanneld
)和内核网络协议栈之间的桥梁,允许用户态程序读写 IP 数据包。 - 虚拟接口:TUN 设备是虚拟的,没有物理硬件支持,通过软件模拟网络接口的功能。
- 用途:常用于网络隧道、虚拟化网络、VPN 和容器网络(如 Kubernetes 的 Flannel)。
TUN 设备的工作原理
TUN 设备可以看作一个“管道”,一端连接内核的网络协议栈,另一端连接用户态程序(如 flanneld
)。其工作流程如下:
-
接收数据包:
- 当内核根据路由表决定将数据包发送到 TUN 设备(如
flannel.1
)时,数据包从内核态传递到用户态。 - 用户态程序(如
flanneld
)通过文件描述符读取 TUN 设备上的数据包(通常是 IP 数据包)。
- 当内核根据路由表决定将数据包发送到 TUN 设备(如
-
处理数据包:
- 用户态程序可以对数据包进行处理,例如封装(添加 UDP 头部)、加密或转发。
- 在 Flannel UDP 模式中,
flanneld
将原始 IP 数据包(例如目标 IP 为10.244.2.5
)封装为 UDP 数据包。
-
发送数据包:
- 用户态程序处理后的数据包(例如 UDP 封装后的数据包)通过 TUN 设备写回内核,或直接通过其他接口(如
enp0s3
)发送。 - 在接收方向,外部数据包到达 TUN 设备后,同样由用户态程序解封装,然后写回内核,交给协议栈处理。
- 用户态程序处理后的数据包(例如 UDP 封装后的数据包)通过 TUN 设备写回内核,或直接通过其他接口(如
TUN 设备在 Flannel UDP 模式中的作用
在 Kubernetes 环境中,Flannel 使用 UDP 模式时,flannel.1
是一个 TUN 设备,用于跨节点 Pod 通信。结合你的路由表和问题背景(ping 10.244.2.5
),我们分析 TUN 设备(flannel.1
)的具体作用:
路由表相关条目
10.244.2.0 10.244.2.0 255.255.255.0 UG 0 0 0 flannel.1
- 数据包(目标 IP
10.244.2.5
)匹配此路由,通过flannel.1
发出,网关为10.244.2.0
。
TUN 设备的工作流程
-
数据包到达 flannel.1:
- 当源 Pod(例如
10.244.0.x
)发送 ICMP 数据包(ping 10.244.2.5
),数据包通过cni0
进入主机网络命名空间。 - 主机路由表将数据包路由到
flannel.1
,因为目标 IP10.244.2.5
匹配10.244.2.0/24
。
- 当源 Pod(例如
-
flanneld 读取数据包:
flannel.1
是一个 TUN 设备,数据包从内核态传递到用户态的flanneld
进程。- 数据包是原始 IP 数据包(源 IP
10.244.0.x
,目标 IP10.244.2.5
,大小为 84 字节:20 字节 IP 头部 + 64 字节 ICMP)。
-
UDP 封装:
flanneld
查询 etcd 或 Kubernetes API,确定10.244.2.0/24
对应的目标节点物理 IP(例如192.168.1.x
)。flanneld
将原始数据包封装为 UDP 数据包:- 外部 IP 头部:20 字节(源 IP 为当前节点物理 IP,目标 IP 为目标节点物理 IP)。
- UDP 头部:8 字节(默认端口 8472)。
- 原始数据包:84 字节。
- 总大小:
20 + 8 + 84 = 112 字节
。
- 封装后的 UDP 数据包通过主机的物理接口(如
enp0s3
)发送。
-
接收方向:
- 目标节点接收到 UDP 数据包(通过其物理接口),
flanneld
通过目标节点的 TUN 设备(类似flannel.1
)读取数据。 flanneld
解封装,提取原始 IP 数据包,写回内核,通过cni0
转发到目标 Pod(10.244.2.5
)。
- 目标节点接收到 UDP 数据包(通过其物理接口),
TUN 设备的角色
- 桥接用户态和内核态:
flannel.1
允许flanneld
进程处理跨节点通信,封装和解封装数据包。 - 透明性:Pod 认为自己直接与目标 IP 通信,TUN 设备和
flanneld
隐藏了 UDP 封装的复杂性。 - 灵活性:TUN 设备支持用户态程序(如
flanneld
)自定义数据包处理,适合 Flannel UDP 模式的轻量实现。
TUN 设备与 UDP 模式的关联
在 Flannel UDP 模式中,TUN 设备(flannel.1
)是关键组件:
- 数据包封装:TUN 设备允许
flanneld
在用户态封装 IP 数据包为 UDP 数据包,适合不支持内核态 VXLAN 的环境。 - 性能特点:UDP 模式通过用户态处理,性能低于 VXLAN(内核态),但更简单,适合小型集群或特殊环境。
- 路由表依赖:路由表中的
10.244.2.0/24
条目将数据包导向flannel.1
,确保跨节点通信由flanneld
处理。