Pktgen

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:我这里的包长和发包时间间隔都比较大,数据可以在脚本里任意修改,但请不要过猛,效果自己把握

发表回复