3、veth pair:连接网络命名空间的虚拟以太网设备

veth(Virtual Ethernet)设备是 Linux 内核提供的一种虚拟以太网设备,它总是成对出现,像一根虚拟的“网线”连接两个网络命名空间。veth pair 是容器网络、Kubernetes Pod 网络以及 DPDK KNI 与内核协议栈交互的基础设施之一。

核心概念:veth pair 的两端分别位于不同的网络命名空间,一端发送的数据包会直接出现在另一端,实现跨命名空间的二层以太网通信。

3.1 veth pair 的工作原理

veth pair 的本质是一对相互连接的虚拟网卡。当一端(如 veth0)发送数据包时,内核直接将数据包注入到另一端(如 veth1)的接收队列中,无需经过物理硬件或真实网络栈的转发。

veth pair 跨命名空间数据流 网络命名空间 A veth0 应用 / 容器进程 网络命名空间 B veth1 应用 / 容器进程 数据包直接传递 veth pair 本质是内核中的一对虚拟网卡,数据包不经过物理网络栈

3.2 创建与配置 veth pair

使用 ip 命令可以快速创建 veth pair 并将其一端移动到目标网络命名空间。以下是标准操作流程:

  1. 创建 veth pair:ip link add veth0 type veth peer name veth1
  2. 将一端移入目标命名空间:ip link set veth1 netns ns1
  3. 为两端配置 IP 地址:分别在默认命名空间和 ns1 中执行 ip addr add
  4. 启用设备:ip link set veth0 up 和 ip netns exec ns1 ip link set veth1 up
完整示例:创建两个命名空间并通过 veth pair 连通
# 创建两个网络命名空间
ip netns add red
ip netns add blue

# 创建 veth pair
ip link add veth-red type veth peer name veth-blue

# 将两端分别移入命名空间
ip link set veth-red netns red
ip link set veth-blue netns blue

# 配置 IP 地址并启用
ip netns exec red ip addr add 10.0.1.1/24 dev veth-red
ip netns exec red ip link set veth-red up

ip netns exec blue ip addr add 10.0.1.2/24 dev veth-blue
ip netns exec blue ip link set veth-blue up

# 测试连通性
ip netns exec red ping -c 3 10.0.1.2

3.3 veth pair 与容器网络模型

在容器网络(如 Docker、Kubernetes)中,veth pair 是连接容器网络命名空间与宿主机网络命名空间的标准方式。每个容器通常拥有一对 veth:一端在容器内部(eth0),另一端连接在宿主机上的网桥(如 docker0、cni0)或路由设备上。

组件 位置 角色
容器端 veth 容器网络命名空间 作为容器的 eth0,接收/发送容器流量
宿主机端 veth 宿主机默认命名空间 连接至网桥或路由设备,转发容器流量
网桥(bridge) 宿主机默认命名空间 汇聚多个 veth 宿主机端,实现容器间通信
容器网络中的 veth pair 架构 宿主机默认网络命名空间 docker0 / cni0 网桥 veth-host-1 veth-host-2 容器 1 命名空间 eth0 (veth-container-1) 容器 2 命名空间 eth0 (veth-container-2) veth pair 1 veth pair 2 每个容器通过一对 veth 连接到宿主机网桥,实现容器间通信

3.4 veth pair 与 DPDK KNI 的关联

在 DPDK 应用中,KNI(Kernel NIC Interface)也使用了类似 veth pair 的设计理念——在用户态 DPDK 和内核协议栈之间建立一条虚拟通道。理解 veth pair 有助于深入理解 KNI 的虚拟设备对模型。

特性 veth pair DPDK KNI
设备类型 虚拟以太网设备 虚拟网络设备(基于 kni 驱动)
连接对象 两个网络命名空间 用户态 DPDK 与内核协议栈
数据传递方式 内核直接转发 通过 kni fifo 队列 + mbuf 交换
性能特点 高吞吐,低延迟 兼顾性能与内核协议栈兼容性
典型用途 容器网络、命名空间隔离 DPDK 应用与内核网络栈交互
注意:veth pair 的数据包传递完全在内核空间完成,不经过物理网卡。在 DPDK 场景中,如果需要在用户态 DPDK 应用和内核协议栈之间传递数据包,应使用 KNI 而非 veth pair,因为 veth pair 无法直接与 DPDK 的 mbuf 和 poll mode driver 协同工作。

3.5 常见问题与排查

  • veth 两端无法 ping 通:检查两端 IP 是否在同一子网,设备是否已启用(ip link set ... up),以及是否存在防火墙规则(iptables -L)。
  • veth 设备未出现在目标命名空间:确认使用 ip netns exec 执行命令,或使用 ip netns list 验证命名空间是否存在。
  • MTU 不匹配:veth pair 两端默认 MTU 为 1500,如果容器内应用需要巨帧(jumbo frame),需手动调整两端 MTU。
  • ARP 表项问题:跨命名空间通信时,ARP 请求通过 veth 传递,确保两端 MAC 地址正确学习。
调试技巧:使用 ip netns exec <ns> tcpdump -i vethX 在目标命名空间内抓包,可以直观观察 veth 两端的流量情况,快速定位通信故障。