Linux提供了一个基于内核的发包工具pktgen,理论上来讲肯定比应用层的发包工具性能要好很多,但它是以内核模块的形式存在,有兴趣可以耍一耍
下面以Debian7.8为例,在两个VM上来测试下这个工具
1:查看内核模块
理论上linux默认会自带这个ko模块,根据内核版本到响应的目录进行查询
root@pktgen-1:~# uname -r 3.2.73 root@pktgen-1:~# ls -l /lib/modules/3.2.73/kernel/net/core/pktgen.ko -rw-r--r-- 1 root root 65344 Feb 16 17:15 /lib/modules/3.2.73/kernel/net/core/pktgen.ko
2:加载模块
root@pktgen-1:~# modprobe pktgen root@pktgen-1:~# lsmod | grep pktgen pktgen 38383 0
3:查询
正确加载了模块之后,下面目录中会有文件生成,我这里只有一个kpktgend_0,原因是我加载pktgen的VM只有一个Core,假如你创建的是多核虚拟机,这里会对应生成kpktgend_1,kpktgend_2,……,kpktgend_n,每个线程RSS绑上一个Core,这里测试的就一个了
root@pktgen-1:~# ls -l /proc/net/pktgen/ total 0 -rw------- 1 root root 0 Mar 17 23:21 kpktgend_0 -rw------- 1 root root 0 Mar 17 23:21 pgctrl root@pktgen-1:~# root@pktgen-1:~# root@pktgen-1:~# cat /proc/cpuinfo | grep process processor : 0
4:测试发包
这里我有两台VM,pktgen-1作为TX,pktgen-2作为RX
TX:这里提供一个shell脚本
#!/bin/bash echo "rem_device_all" > /proc/net/pktgen/kpktgend_0 echo "add_device eth0" > /proc/net/pktgen/kpktgend_0 echo "pkt_size 1000" > /proc/net/pktgen/eth0 echo "count 1000" > /proc/net/pktgen/eth0 echo "delay 1000000000" > /proc/net/pktgen/eth0 echo "src 10.180.80.179" > /proc/net/pktgen/eth0 echo "dst 10.180.80.181" > /proc/net/pktgen/eth0 echo "start" > /proc/net/pktgen/pgctrl
pkt_size就是包长,count发包个数,delay是time间隔,单位是纳米,源目的IP都懂的,直接执行shell脚本即可发包
RX:这里推荐tshark来进行抓包,直接识别pktgen协议,过滤条件也简单
root@pktgen-2:~# tshark -i eth0 -R "udp and frame.len == 1000" Running as user "root" and group "root". This could be dangerous. Capturing on eth0 3.586879 10.180.80.179 -> 10.180.80.181 PKTGEN 1000 Seq: 1 3.586888 10.180.80.179 -> 10.180.80.181 PKTGEN 1000 Seq: 2 4.586882 10.180.80.179 -> 10.180.80.181 PKTGEN 1000 Seq: 3 5.586840 10.180.80.179 -> 10.180.80.181 PKTGEN 1000 Seq: 4 6.586872 10.180.80.179 -> 10.180.80.181 PKTGEN 1000 Seq: 5 7.587032 10.180.80.179 -> 10.180.80.181 PKTGEN 1000 Seq: 6 8.586795 10.180.80.179 -> 10.180.80.181 PKTGEN 1000 Seq: 7 9.586834 10.180.80.179 -> 10.180.80.181 PKTGEN 1000 Seq: 8 10.586894 10.180.80.179 -> 10.180.80.181 PKTGEN 1000 Seq: 9 11.586924 10.180.80.179 -> 10.180.80.181 PKTGEN 1000 Seq: 10
可以看到收到的包1秒钟一个,包长1000,源目的IP地址也匹配
这里需要注意的是:
1:这里测试如果收不到包注意看下iptables规则,是否enable过滤掉了你测试的报文类型
2:内核发包工具,TX机器上用tcpdump之类用户态工具是无法抓到包的
3:测试用的是私有网之间互通,假如是连外网过L3,脚本里需要指定网关的MAC地址,可以在namespace里进行查询
echo "dst_mac fa:16:3e:a5:36:69" > /proc/net/pktgen/eth0
4:我这里的包长和发包时间间隔都比较大,数据可以在脚本里任意修改,但请不要过猛,效果自己把握