虚拟 eth 上的 Linux 内核忽略了注入的 TCP/UDP 数据包

虚拟 eth 上的 Linux 内核忽略了注入的 TCP/UDP 数据包

我尝试使用网络命名空间为 DPDK 转发应用程序创建本地测试设置。我创建的设置如下所示:

veth0(10.0.0.1, namespace vnet0) <> veth1(no ip, host) <-DPDK forward-> veth3(no ip, host) <> veth2(10.0.0.2, namespace vnet1)

因此,2 个网络命名空间每个都有一个 veth 对,其中主机端使用转发 DPDK 应用程序“连接”。

这些是我用来创建此设置的完整命令:

sudo ip link add veth0 type veth peer name veth1
sudo ip link add veth2 type veth peer name veth3

sudo ip netns add vnet0
sudo ip netns add vnet1

sudo ip link set veth0 netns vnet0
sudo ip link set veth2 netns vnet1

sudo ip -n vnet0 set veth0 up
sudo ip -n vnet1 set veth2 up

sudo ip link set veth1 up
sudo ip link set veth3 up

sudo ip -n vnet0 addr add 10.0.0.1/24 dev veth0
sudo ip -n vnet1 addr add 10.0.0.2/24 dev veth2

DPDK应用程序:

sudo dpdk-skeleton --vdev=net_af_packet0,iface=veth1 --vdev=net_af_packet1,iface=veth3

帧在命名空间之间正确转发,ICMP ECHO 也可以工作:

sudo ip netns exec vnet1 ping 10.0.0.1

PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.116 ms

但是,UDP 和 TCP 数据包会被内核忽略:

sudo ip netns exec vnet0 nc -l -p 8080
sudo ip netns exec vnet1 nc 10.0.0.1 8080

(TCPsyn数据包正在重传,syn+ack10.0.0.1没有任何响应)

在两个命名空间中运行wireshark会显示所有相关帧,但内核似乎忽略了注入(转发)的UDP/TCP数据包。我缺少什么?是否有另一种方法可以在单个主机上测试转发应用程序?

答案1

问题在于veth接口默认使用校验和卸载,因此转发的数据包校验和错误并被内核忽略。ethtool --offload IFACE rx off tx off在所有 4 个接口上运行veth修复了该问题。

相关内容