如何使用 DPDK 从 internet/remote 主机接收和捕获数据包?

How to Receive and capture packets from internet/remote host using DPDK?

我想从任何主机捕获原始数据包并将它们捕获到一个文件中,如“recieved.pcap”绕过内核。 我为此使用虚拟 ec2 实例。 为了绕过内核,我在我的实例上设置了 DPDK。 我是网络新手,如有任何帮助,我们将不胜感激!

我有:

  1. DPDK 版本:亚马逊上安装的 19.11.5 Linux 2 个 ec2 实例。
  2. NIC 绑定到 DPDK:Amazon eni
  3. 我安装了 libpcap-dev。

我 运行 testpmd 应用程序,这是输出:

[ec2-user@ip-172-31-82-187 app]$ sudo ./testpmd -l 0-3 -n 4 -- -i
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: PCI device 0000:00:05.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 1d0f:ec20 net_ena
EAL: PCI device 0000:00:06.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 1d0f:ec20 net_ena
Interactive-mode selected
testpmd: create a new mbuf pool <mbuf_pool_socket_0>: n=171456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc

Warning! port-topology=paired and odd forward ports number, the last port will pair with itself.

Configuring Port 0 (socket 0)
Port 0: 16:61:BE:67:49:75
Checking link statuses...
Done
Error during enabling promiscuous mode for port 0: Operation not supported - ignore

基于拦截场景,有4种方案可以解决这个问题

  1. Option-1:远程终端使用单个 DPDK 端口并修改 MAC|VLAN 地址。
  2. 选项 2:使用两个 DPDK 端口的远程终端,没有 MAC 地址修改。
  3. 选项 3:对于本地终止,使用 DPDK TAP PMD 终止到 HOST/GUEST OS,没有数据包 MAC|VLAN 修改。
  4. Option-4:对于本地终端,使用 DPDK PCAP PMD 拦截来自内核接口的数据包,没有数据包 MAC|VLAN 修改。

请按照以下步骤正确捕获流量。对于

选项-1:

  1. 创建具有 1 个 DPDK 端口的 VM。
  2. 使用 testpmd 或示例应用程序 l2fwd(使用 DPDK rte_pdump_init 修改)捕获并重放回 PORT。
  3. 由于MAC-address|使用适当的规则修改了 VLAN,因此可以从远程 HOST 转发到所需的目的地
  4. 启动 dpdk PDUMP 应用程序,示例 sudo ./build/app/dpdk-pdump -- --pdump 'port=0,queue=*,tx-dev=./tx.pcap'。这将捕获从外部进入并写入 tx.pcap.
  5. 的数据包

选项 2:

  1. 创建具有 2 个 DPDK 端口的 VM
  2. 启动 DPDK 修改后的应用程序(使用 dpdk rte_pdump_init)骨架或 l2fwd。
  3. 对于 l2fwd 使用选项 --no-mac-updating.
  4. 启动 dpdk PDUMP 应用程序,示例 sudo ./build/app/dpdk-pdump -- --pdump 'port=0,queue=*,tx-dev=./tx.pcap'。这将捕获从外部进入并写入 tx.pcap
  5. 的数据包

选项 3:

  1. 创建具有 1 个 DPDK 端口的 VM (AMAZON enic)
  2. 将所需的 DPDK 端口 (WAN) 与适当的 UIO 驱动程序绑定
  3. 像basicfwd一样启动DPDK应用sudo ./build/basicfwd -l 2 --vdev=net_tap0,mac="mac address of DPDK port" -a <PCIe BDF>.
  4. 在linux航站楼内sudo ifconfig dtap0 <ip address/mask> up
  5. [可选] 添加所需的路由条目。
  6. 使用 linux tcpdump、python 或任何数据包捕获应用程序从 dtap0 接口抓取数据包用于 RX|TX 或双向。

选项 4:

  1. 创建具有 1 个 DPDK 端口的 VM (AMAZON enic)
  2. 确保接口与内核驱动绑定。
  3. 确保接口能够使用 ping -I <interface name> whosebug.com
  4. 访问外部网络 (WAN)
  5. 运行 dpdk 修改后的应用程序,如 basicfwd 或 l2fwd,带有 rte_pdump_init(示例 ./build/l2fwd -l 2 --vdev=net_pcap0,iface=<interface name> -- -p 1 -T 1 --no-mac-updating
  6. 使用 DPDK PDUMP 应用程序捕获数据包。示例:sudo ./build/app/dpdk-pdump -- --pdump 'port=0,queue=*,tx-dev=./tx.pcap'

注:

  • 参考用例。
  • 建议使用 option 3,因为它不需要 DPDK 辅助进程并禁用 ASLR。