네트워크 네임스페이스를 사용하여 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개의 네트워크 네임스페이스에는 각각 호스트 측에서 전달 DPDK 애플리케이션을 사용하여 "연결"하는 veth 쌍이 있습니다.
다음은 이 설정을 만드는 데 사용한 전체 명령입니다.
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
(TCP syn
패킷을 재전송 중인데 syn+ack
10.0.0.1에서 응답이 없습니다.)
두 네임스페이스 모두에서 Wireshark를 실행하면 관련 프레임이 모두 표시되지만 커널은 삽입된(전달된) UDP/TCP 패킷을 무시하는 것 같습니다. 내가 무엇을 놓치고 있나요? 단일 호스트에서 전달 애플리케이션을 테스트하는 다른 방법이 있습니까?
답변1
문제는 veth
인터페이스가 기본적으로 체크섬 오프로딩을 사용하므로 전달된 패킷의 체크섬이 잘못되어 커널에서 무시된다는 것입니다. ethtool --offload IFACE rx off tx off
4개 인터페이스 모두에서 실행하면 veth
문제가 해결되었습니다.