Flannel后端为UDP模式下,分析数据包的发送方式(二)

发往 10.244.2.5 的数据包最终会经过物理网卡 enp0s3 ,尽管路由表直接指定通过 flannel.1 发出。以下以 Markdown 格式详细解释为什么会经过 enp0s3,结合 Kubernetes 和 Flannel UDP 模式的背景。


问题分析

在 Kubernetes 环境中,使用 Flannel 的 UDP 模式,数据包的目标 IP 10.244.2.5 根据路由表匹配到以下路由:

复制代码
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.244.2.0      10.244.2.0      255.255.255.0   UG    0      0        0 flannel.1

这表明数据包通过 flannel.1 网卡发出,网关为 10.244.2.0。但问题是,数据包是否最终会经过物理网卡 enp0s3?答案是肯定的,我们从 Flannel UDP 模式的工作机制来详细分析。


Flannel UDP 模式的数据包转发过程

在 Flannel 的 UDP 模式下,flannel.1 是一个 TUN 设备 ,工作在用户态,负责将数据包交给 Flannel 的用户态进程(flanneld)进行封装。以下是数据包从发出到最终传输的步骤:

  1. 路由匹配

    • 目标 IP 10.244.2.5 匹配路由 10.244.2.0/24,指定通过 flannel.1 接口,网关为 10.244.2.0
    • 数据包被发送到 flannel.1,这是一个虚拟 TUN 设备,数据包会从内核态传递到用户态的 flanneld 进程。
  2. Flanneld 的 UDP 封装

    • flanneld 进程接收到数据包后,查询 etcd 或 Kubernetes API 中的子网映射,确定 10.244.2.0/24 对应的目标节点。例如,目标节点的物理 IP 可能是 192.168.1.x(假设在 192.168.1.0/24 网络中)。
    • flanneld 将原始数据包(目标 IP 10.244.2.5)封装为 UDP 数据包,默认使用端口 8472。
    • 封装后的 UDP 数据包的目标 IP 是目标节点的物理 IP(例如 192.168.1.x),源 IP 是当前节点的物理 IP(例如 192.168.1.y)。
  3. 通过物理网卡发送

    • 封装后的 UDP 数据包需要通过节点的物理网络接口发送到目标节点。

    • 根据路由表,物理 IP 192.168.1.x 属于 192.168.1.0/24,匹配以下路由:

      复制代码
      Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
      192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
    • 因此,UDP 数据包通过 enp0s3 网卡发送到目标节点的物理 IP。

  4. 目标节点处理

    • 目标节点上的 flanneld 进程监听 UDP 端口 8472,接收到 UDP 数据包。
    • flanneld 解封装数据包,提取原始数据包(目标 IP 10.244.2.5)。
    • 数据包通过目标节点的 cni0 接口转发到本地 Pod 子网(10.244.2.0/24),最终到达目标 Pod。

为什么会经过 enp0s3?

  • flannel.1 的角色flannel.1 是 TUN 设备,负责将数据包从内核态传递到用户态的 flanneld 进程。它不直接与物理网络交互,而是依赖 flanneld 进行 UDP 封装。
  • UDP 封装后的传输 :封装后的 UDP 数据包需要通过物理网络发送到目标节点。当前节点的物理网络接口是 enp0s3,它负责处理 192.168.1.0/24 网络的通信(包括目标节点的物理 IP)。
  • 路由表的作用 :路由表中的 192.168.1.0/24 条目明确指定通过 enp0s3 发送物理网络的流量。因此,flanneld 生成的 UDP 数据包会通过 enp0s3 发出。

数据包路径总结

  1. 数据包(目标 IP 10.244.2.5)根据路由表通过 flannel.1 发出。
  2. flannel.1 将数据包交给 flanneldflanneld 封装为 UDP 数据包(目标 IP 为目标节点的物理 IP,例如 192.168.1.x)。
  3. UDP 数据包根据路由表(192.168.1.0/24)通过 enp0s3 发出。
  4. 目标节点接收 UDP 数据包,解封装后转发到目标 Pod。

最终答案

是的,发往 10.244.2.5 的数据包最终会经过物理网卡 enp0s3 ,因为 Flannel UDP 模式将数据包封装为 UDP 格式后,通过物理网络接口 enp0s3 发送到目标节点。

复制代码
 - UDP 模式下,数据包在 `enp0s3` 上是 UDP 封装的,源和目标 IP 分别是发送和接收节点的物理 IP,端口为 8472。
  • 验证方法
    • 使用更广的过滤条件抓包,例如:

      bash 复制代码
      tcpdump -i enp0s3 udp port 8472

      这会抓取 Flannel UDP 模式的所有流量(默认端口 8472)。

    • 检查是否有 UDP 数据包,源和目标 IP 是否为节点间的物理 IP(例如 192.168.1.y -> 192.168.1.x)。

    • 如果需要确认数据包内容,可以使用 -X 查看数据包的原始内容,检查是否包含内部的 Pod IP 10.244.2.5


相关推荐
YuMiao1 天前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
Jony_4 天前
高可用移动网络连接
网络协议
chilix4 天前
Linux 跨网段路由转发配置
网络协议
DianSan_ERP6 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅6 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
gihigo19986 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
2501_946205526 天前
晶圆机器人双臂怎么选型?适配2-12寸晶圆的末端效应器有哪些?
服务器·网络·机器人
linux kernel6 天前
第七部分:高级IO
服务器·网络
数字护盾(和中)6 天前
BAS+ATT&CK:企业主动防御的黄金组合
服务器·网络·数据库
~远在太平洋~6 天前
Debian系统如何删除多余的kernel
linux·网络·debian