内核pktgen使用

内核pktgen使用

什么是pktgen

pktgen 是一款 Linux 发包工具,可在内核高速发包。由于pktgen是内核内置的,使用内核空间,所以它可以达到高带宽、高发包速率,以此更好地测试路由器、交换机和其他网络设备。

一旦加载pktgen模块后,会自动为每一个CPU创建一个内核线程^1^,并将该线程绑定在对应的CPU上。与此同时,在/proc/net/pktgen/目录下,为每一个线程创建一个kpktgend_X文件(其中的X为CPU编号),用来控制和监控这些线程,以及一个pgctrl文件,用来控制pktgen程序。当卸载pktgen模块时,/proc/net/pktgen文件夹会被自动删除。

同时,当将某个网卡绑定在某个线程时,也会在/proc/net/pktgen/目录下自动创建以该网卡名称为名的文件,用于记录此网卡设备的配置信息和运行信息。

测试程序可以配置成一直运行,或者在发送固定数量的包之后结束。也可以使用快捷键Ctrl+C终止运行。

使能 pktgen

使用pktgen需要在内核配置文件开启CONFIG_NET_PKTGEN

内核在执行一下命令后:

bash 复制代码
$ sudo modprobe pktgen

会在文件夹/proc/net/下创建一个pktgen文件夹

使用pktgen发包

在加载pktgen之后会在proc/net/pktgen下创建出如下几个文件:

添加设备

bash 复制代码
$ echo "add_device ens33" > /proc/net/pktgen/kpktgend_0

设置报文

  • 部分配置
bash 复制代码
$ echo "pkt_size 64" > /proc/net/pktgen/etn
$ echo "count 1000000" > /proc/net/pktgen/eth3
$ echo "dst_mac aa:bb:cc:dd:ee:ff" > /proc/net/pktgen/eth3
  • 查看配置结果
bash 复制代码
cat /proc/net/pktgen/ens33

发送报文

bash 复制代码
$ echo "start" > /proc/net/pktgen/pgctrl

查看统计信息

bash 复制代码
$ cat /proc/net/pktgen/ens33

配置命令

控制命令

名称 含义
start 所有的线程开始发送
stop 停止

线程命令

名称 含义
add_device 添加某个端口到某个线程
rem_device_all 删除绑定在某个线程的所有端口
max_before_softirq 在最多发送多少个数据包后执行do_softirq()

端口命令

名称 含义
count 发送数据包的个数,0 表示一直发送
clone_skb 对每个skb进行多少个复制,0表示不复制。对于Dos等测试必须至零
debug 调试
frags 数据包的片段数量
delay 发送两个数据包之间的延时
src_mac_count 源mac的数量,从src mac设置的mac开始轮询
dst_mac_count 目的mac的数量,从dst mac设置的mac开始轮询
pkt_size 链路包的大小(前去CRC的值)
min_pkt_size 数据包最小值
max_pkt_size 数据包最大值
udp_src_min 最小源udp端口号
udp_src_max 最大源udp端口号
udp_dst_min 最小目的udp端口号
udp_dst_max 最大目的udp端口号
flag IPSRC_RND TXSIZE_RND IPDST_RND UDPSRC_RND UDPDST_RND MACSRC_RND MACDST_RND PSRC_RND 源IP随机发送
dst_min 目的IP的最小值
dst_max 目的IP的最大值
src_min 源IP最小值
src_max 源IP最大值
dst_mac 目的mac
src_mac 源mac
clear_counters 清空计数器,一般程序自动清空
dst6 目的IPv6地址
src6 源IPv6地址
flows 并发流的个数
flowlen 流的长度

pktgen脚本

脚本实例

bash 复制代码
#!/bin/bash
#modprobe pktgen

function pgset() {
    local result
    echo $1 > $PGDEV
    result=`cat $PGDEV | fgrep "Result: OK:"`
    
    if [ "$result" = "" ]; then
    	cat $PGDEV | fgrep Result:
    fi
}

function pg() {
    echo inject > $PGDEV
    cat $PGDEV
}

# Config Start Here -----------------------------------------------------------
# thread config
# Each CPU has own thread. Two CPU exammple. We add ens33 respectivly.

for i in {0..3}; do
    PGDEV=/proc/net/pktgen/kpktgend_$i
    echo "Removing all devices"
    pgset "rem_device_all"
done

PGDEV=/proc/net/pktgen/kpktgend_2
echo "Adding ens33"
pgset "add_device ens33"
echo "Setting max_before_softirq 10000"
pgset "max_before_softirq 100000"

# device config
# 改为0可以加速
CLONE_SKB="clone_skb 1000000"

# NIC adds 4 bytes CRC
# 一般值越大,可以达到的throughput越大
PKT_SIZE="pkt_size 1500"
# COUNT 0 means forever
#COUNT="count 0"
COUNT="count 1000000"

# ipg is inter packet gap. 0 means maximum speed. 有些设备不支持
IPG="ipg 0"
PGDEV=/proc/net/pktgen/ens33
echo "Configuring $PGDEV"
pgset "$COUNT"
pgset "$CLONE_SKB"
pgset "$PKT_SIZE"

#pgset "$IPG"
#pgset "dst 192.168.253.23"
# 配置发送的源mac
pgset "src_mac 00:05:9a:5c:7a:00"
# 配置接收的目的mac
pgset "dst_mac 0a:00:27:8a:00:07"

# 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/ens33

执行结果

内核pktgen脚本

在仓库torvalds/linux/samples/pktgen中提供了多个pktgen的脚本例子,

脚本使用

bash 复制代码
./pktgen_sample01_simple.sh -i ens33 -d 127.0.0.1 -t 1 -n 1000 -m 00:15:5d:4b:19:b1 -s 100000

测试网络PPS性能指标,判断是否丢包

客户端安装pktgen来发包,接收端通过sar命令(linux系统)来查看端口统计信息,通过对比收发两端的速率来判断是否有丢包。

其他pktgen命令

查看版本

bash 复制代码
$ cat pgctrl
Packet Generator for packet performance testing. Version: 2.75

查看kpktgend进程

bash 复制代码
ps -A | grep pkt
   5614 ?        00:00:03 kpktgend_0
   5615 ?        00:00:03 kpktgend_1
   5616 ?        00:00:02 kpktgend_2
   5618 ?        00:00:02 kpktgend_3
   5619 ?        00:00:02 kpktgend_0
   5620 ?        00:00:02 kpktgend_1
   5621 ?        00:00:02 kpktgend_2
   5622 ?        00:00:02 kpktgend_3

参考

pktgen | 孙勇峰的部落格 (sunyongfeng.com)

pktgen------the packet generator within linux kernel-CSDN博客

kernel.org/doc/Documentation/networking/pktgen.txt

networking:pktgen Wiki (linuxfoundation.org)

pktgen使用指南 - mrwuzs - 博客园 (cnblogs.com)

pktgen使用详细教程 - 可酷可乐 - 博客园 (cnblogs.com)

pktgen: A packet traffic generator in kernel space for testing network throughput. -- Julio Faracco (wordpress.com)

利用pktgen发包工具做性能测试_pktgen prbs_S100400507的博客-CSDN博客

network-testing/pktgen at master · netoptimizer/network-testing (github.com) pktgen测试脚本。

pktgen的使用 (jialeicui.github.io)

使用pktgen测试网络带宽


😏

🏍

👽


  1. 注意:一个设备只能属于一个线程。 ↩︎
相关推荐
独行soc9 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节
XuanRanDev13 小时前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
鹏大师运维18 小时前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos
亦枫Leonlew19 小时前
微积分复习笔记 Calculus Volume 1 - 4.7 Applied Optimization Problems
笔记·数学·微积分·1024程序员节
小肥象不是小飞象19 小时前
(六千字心得笔记)零基础C语言入门第八课——函数(上)
c语言·开发语言·笔记·1024程序员节
一个通信老学姐1 天前
专业130+总400+武汉理工大学855信号与系统考研经验电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
力姆泰克1 天前
看电动缸是如何提高农机的自动化水平
大数据·运维·服务器·数据库·人工智能·自动化·1024程序员节
力姆泰克1 天前
力姆泰克电动缸助力农业机械装备,提高农机的自动化水平
大数据·服务器·数据库·人工智能·1024程序员节
程思扬1 天前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节
转世成为计算机大神1 天前
网关 Spring Cloud Gateway
java·网络·spring boot·1024程序员节