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)。其工作流程如下:

  1. 接收数据包

    • 当内核根据路由表决定将数据包发送到 TUN 设备(如 flannel.1)时,数据包从内核态传递到用户态。
    • 用户态程序(如 flanneld)通过文件描述符读取 TUN 设备上的数据包(通常是 IP 数据包)。
  2. 处理数据包

    • 用户态程序可以对数据包进行处理,例如封装(添加 UDP 头部)、加密或转发。
    • 在 Flannel UDP 模式中,flanneld 将原始 IP 数据包(例如目标 IP 为 10.244.2.5)封装为 UDP 数据包。
  3. 发送数据包

    • 用户态程序处理后的数据包(例如 UDP 封装后的数据包)通过 TUN 设备写回内核,或直接通过其他接口(如 enp0s3)发送。
    • 在接收方向,外部数据包到达 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 设备的工作流程

  1. 数据包到达 flannel.1

    • 当源 Pod(例如 10.244.0.x)发送 ICMP 数据包(ping 10.244.2.5),数据包通过 cni0 进入主机网络命名空间。
    • 主机路由表将数据包路由到 flannel.1,因为目标 IP 10.244.2.5 匹配 10.244.2.0/24
  2. flanneld 读取数据包

    • flannel.1 是一个 TUN 设备,数据包从内核态传递到用户态的 flanneld 进程。
    • 数据包是原始 IP 数据包(源 IP 10.244.0.x,目标 IP 10.244.2.5,大小为 84 字节:20 字节 IP 头部 + 64 字节 ICMP)。
  3. 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)发送。
  4. 接收方向

    • 目标节点接收到 UDP 数据包(通过其物理接口),flanneld 通过目标节点的 TUN 设备(类似 flannel.1)读取数据。
    • flanneld 解封装,提取原始 IP 数据包,写回内核,通过 cni0 转发到目标 Pod(10.244.2.5)。

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 处理。

相关推荐
17(无规则自律)3 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞16 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠1 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember2 天前
Linux网络基础
linux·网络·arm开发
代码游侠2 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟2 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows
wkm9562 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
unicrom_深圳市由你创科技2 天前
基于ARM+DSP+FPGA异构计算架构的高速ADC采集卡定制方案
arm开发·fpga开发
松涛和鸣2 天前
DAY69 Practical Guide to Linux Character Device Drivers
linux·服务器·arm开发·数据库·单片机·嵌入式硬件
松涛和鸣2 天前
69、Linux字符设备驱动实战
linux·服务器·网络·arm开发·数据库·驱动开发