实验需要,最近看了一点pktgen的简单用法。
首先激活pktgen内核模块。 root@××# modprobe pktgen
查看pktgen信息
root@××# modinfo pktgen filename: /lib/modules/3.13.0-32-generic/kernel/net/core/pktgen.ko version: 2.74 license: GPL 加载成功后,我们可以看一下pktgen线程是否在运行:
root@SDN:/proc/net/pktgen# ps aux | grep pktgen root 3399 0.0 0.0 15952 932 pts/1 S+ 09:13 0:00 grep --color=auto pktgen root 21782 0.0 0.0 0 0 ? S 8月14 0:01 [kpktgend_0] root 21783 0.0 0.0 0 0 ? S 8月14 0:01 [kpktgend_1]
此时我们在内核文件中查看信息
root@XX:/proc/net/pktgen# ls kpktgend_0 kpktgend_1 pgctrl
对于文件kpktgend_X是内核线程,我的电脑是2核,所以只有两个文件0和1,pgctrl显示的是pktgen版本。
下面是初次使用的心得。
(我使用两台电脑eth0连接,在另一台电脑启动wireshark抓包)
网上给出了很多脚本文件,都很不错,但是在接收方抓包时发现发送的包seq不会递增,不知道为什么?还有待下一步研究。下面贴出一个脚本。
# thread config # Each CPU has own thread. Two CPU exammple. We add eth1, eth2 respectivly. PGDEV=/proc/net/pktgen/kpktgend_0 echo "Removing all devices" pgset "rem_device_all" echo "Adding eth0" pgset "add_device eth0" echo "Setting max_before_softirq 10000" pgset "max_before_softirq 10000" # device config # ipg is inter packet gap. 0 means maximum speed. CLONE_SKB="clone_skb 1000000" # NIC adds 4 bytes CRC PKT_SIZE="pkt_size 60" # COUNT 0 means forever #COUNT="count 0" COUNT="count 10000000" IPG="ipg 0" PGDEV=/proc/net/pktgen/eth0 echo "Configuring $PGDEV" pgset "$COUNT" pgset "$CLONE_SKB" pgset "$PKT_SIZE" pgset "$IPG" pgset "dst 127.0.0.1" pgset "dst_mac ec:a8:6b:82:4e:69" # Time to run PGDEV=/proc/net/pktgen/pgctrl echo "Running... ctrl^C to stop" pgset "start" echo "Done" # Result can be vieved in /proc/net/pktgen/eth0虽然可以实现发包,但是seq不会递增,而实验需要seq递增发包,所以下面的脚本可以实现seq的递增。 #! /bin/bash echo "rem_device_all" > /proc/net/pktgen/kpktgend_0 echo "add_device eth0" > /proc/net/pktgen/kpktgend_0 echo "rx eth0" > /proc/net/pktgen/pgrx 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.0.0.1" > /proc/net/pktgen/eth0 echo "dst 10.0.0.2" > /proc/net/pktgen/eth0 echo "start" > /proc/net/pktgen/pgctrl