在进行网络开发中,我们经常会通过抓包来定位分析问题,在不使用DPDK的情况下,Linux系统通常用tcpdump,windows用wireshark,但是如果我们使用了DPDK来收包,就无法用这两个工具来抓包了。
这个时候我们需要用DPDK对应的抓包工具,DPDK自带有两个抓包工具,分别是dpdk-pdump和dpdk-dumpcap,dpdk-pdump功能太简单,不支持按条件过滤报文,所以这里我们重点讲一下dpdk-dumpcap的用法。
前面的文章DPDK的源码编译安装已经讲过DPDK的源码安装方法,DPDK安装好后,dpdk-dumpcap也在系统上安装好了。
需要说明的是,DPDK有primary和second进程的说法,dpdk-dumpcap属于second进程,在抓包之前,必须先启动一个primary进程进行收包才行,primary进程可以使用前面提到过的dpdk-testpmd。
可以先使用dpdk-dumpcap -h查看帮助信息:
业务口抓包工具使用dpdk-dumpcap,参数说明如下:
选项 | 说明 | 示例 |
-i | 指定抓包网口,使用网口的pcie地址 | '*': 表示所有业务网口 0000:01:00.1: 某个网口的pcie地址 可以用过指定多个-i参数来抓取多个网口的报文,例如:-i 0000:01:00.0 -i 0000:02:00.0 |
-f | 指定ip、port和协议等过滤条件 支持条件或或者条件与 | 源ip: src host 1.1.1.1 或 src host 1111::1 源端口: src port 5000 目的ip: dst host 2.2.2.2 或 dst host 2222::2 目的端口:dst port 80 协议: 如果是all,不用指定;如果是ipv6,ip,tcp和udp,分别指定ip6, ip,tcp,udp 条件与: and 条件或: || |
-D | 列出所有网卡的pcie地址 | 0. 0000:0b:00.0 1. 0000:13:00.0 |
-c | 指定抓包个数 | |
-a | 自动结束条件 | duration:10, 抓包10秒钟后自动结束抓包 filesize:100, 抓包文件达到100KB后自动结束抓包 packets: 1000, 抓包1000个报文后自动结束抓包 |
-w | 指定抓包的文件名称 | 例如1.pcap |
-v | 显示版本号 | dpdk-dumpcap 1.0 (DPDK 21.11.0) |
-n | 使用pcapng格式保存抓包文件 | pcapng格式的文件可以看到每个报文的网口id和队列id |
例如,抓取所有网卡上源ip为1.1.1.1,目的ip为2.2.2.2,源端口为5000,目的端口为80,协议为udp的1000个报文保存到1.pcap文件中,抓包命令为:
dpdk-dumpcap -i '*' -f "src host 1.1.1.1 and src port 5000 and dst host 2.2.2.2 and dst port 80 and udp" -c 1000 -w 1.pcap
需要说明的是,如果想要按方向来抓包,需要修改dumpcap的源码,在抓包的时候指定是抓收包方向还是发包方向的报文。
好了,关于dumpcap抓包工具的使用方法就讲到这里了。