tcpreplay使用

tcpreplay命令使用详解

 

tcpreplay用于重放保存在pcap文件中的网络流量,它支持按照捕获pcap文件时数据包的速度、或者指定速度去重放网络流量,只要在硬件承受的范围内即可。

它可以根据需要,使流量可以在两个网卡直接拆分、写入文件、进行筛选、以各种方式进行编辑,从而为测试防火墙、NIDS和其他网络设备提供了方法。

格式:tcpreplay [-flags] [-flag [value]] [--option-name[[=| ]value]] <pcap_file(s)>

1、 命令参数:

  -d number--dbug=number

启用调试输出。此选项最多可出现1次。此选项将整数作为参数。 number的值被限制为:在0到5的范围内
此选项的默认输入number为:0
如果使用--enable-debug进行配置,则可以为调试输出指定详细级别。数字越大,越详细。

  -q--quiet

静默模式。除了运行结束时的统计数据外,不打印任何内容

  -T string--timer=string

选择数据包计时模式:select,ioport,gtod,nano。此选项最多可出现1次。此选项的默认string是:gtod
允许您选择要使用的数据包计时方法:

nano - Use nanosleep() API

select - Use select() API

ioport - Write to the i386 IO Port 0x80

gtod [default] - Use a gettimeofday() loop

  --maxsleep=number

设置数据包之间休眠不超过X毫秒。此选项将整数作为参数。此选项的默认输入number为:0
设置tcpreplay在数据包之间休眠的最大毫秒数限制。有效防止数据包之间的长时间延迟,而不会影响大多数数据包。默认为禁用。

  -v--verbose

通过tcpdump将解码后的数据包打印到标准输出。此选项最多可出现1次

  -A string--decode=string

传递给tcpdump解码器的参数。此选项最多可出现1次。此选项必须与-v参数以前使用。
当启用详细模式(-v)时,您还可以指定一个或多个附加参数以传递给tcpdump来修改数据包的解码方式。默认情况下,使用-n和-l。确保string用双引号引起来,如:-A“-axxx”,否则会被tcpreplay作为参数误用。有关选项的完整列表,请参见tcpdump(1)手册页

  -K--preload-pcap

在发送之前将数据包预加载到RAM中。
此选项在开始发送之前将指定的pcap加载到RAM中,以便提高启动性能,进而提高重放性能。预加载可以使用或不使用--loop。此选项还会控制每次迭代的流统计信息收集,这可以显着减少内存使用量。基于所提供的选项和从第一循环迭代收集的统计来预测流(flow)统计。

  -c string--cachefile=string

通过tcpprep缓存(cache)文件拆分流量。此选项最多可出现1次。此选项必须与以下选项一起使用:intf2。此选项不得与以下选项一起使用:dualfile。
如果你有一个pcap文件,你想用它来通过一个设备(防火墙,路由器,IDS等)发送双向流量,然后使用tcpprep你可以创建一个缓存文件,tcpreplay将用它来分割两个网络接口的流量。 

  -2--dualfile

从network tap一次重放两个文件。此选项最多可出现1次。此选项必须与以下选项一起使用:intf2。此选项不得与以下任项一起使用:cachefile。
如果您使用网络分流器捕获网络流量,那么您最终可以获得两个pcap文件 - 每个方向一个。此选项将同时重放这两个文件,每个接口一个,并使用每个文件中的时间戳混合它们

  -i string--intf1=string

Client to server/RX/primary traffic output interface. This option may appear up to 1 times.
Required network interface used to send either all traffic or traffic which is marked as ’primary’ via tcpprep. Primary traffic is usually client-to-server or inbound (RX) on khial virtual interfaces.

  -I string--intf2=string

Server to client/TX/secondary traffic output interface. This option may appear up to 1 times.

Optional network interface used to send traffic which is marked as ’secondary’ via tcpprep. Secondary traffic is usually server-to-client or outbound (TX) on khial virtual interfaces. Generally, it only makes sense to use this option with --cachefile.

  --listnics

列出所有可用的网卡并退出。

  -l number--loop=number

循环捕获文件X次。此选项最多可出现1次。此选项将整数作为输入参数。 number的值被限制为:
大于或等于0,此选项的默认输入number为:1

  --loopdelay-ms=number

循环之间的延迟(以毫秒为单位)。此选项必须与以下选项一起出现:--loop。此选项将整数作为输入参数。 number的值被限制为:大于或等于0,此选项的默认输入number为:0

  --pktlen

覆盖snaplen并使用实际的数据包len。此选项最多可出现1次。
默认情况下,tcpreplay将根据pcap文件中存储的“snaplen”的大小发送数据包,这通常是正确的做法。但是,偶尔,工具会存储更多的字节。通过指定此选项,tcpreplay将忽略snaplen字段,而是尝试根据原始数据包长度发送数据包。如果指定此选项,可能会发生错误。

  -L number--limit=number

限制要发送的数据包数量。此选项最多可出现1次。此选项将整数作为输如参数。 number的值被限制为:大于或等于1,此选项的默认输如number为:-1
默认情况下,tcpreplay将发送所有数据包。或者手工指定要发送的最大数据包数。

  --duration=number

限制发送的秒数。此选项最多可出现1次。此选项将整数作为输入参数。 number的值被限制为:大于或等于1,此选项的默认number为:-1
默认情况下,tcpreplay将发送所有数据包。或者手工指定要传输的最大秒数。

  -x string--multiplier=string

将重放速度修改为指定倍数。此选项最多可出现1次。此选项不得与以下任何选项一起出现:pps,mbps,oneatatime,topspeed。
指定一个值以修改数据包重放速度。例子:
2.0:将以捕获速度的两倍重放流量
0.7:将以捕获的速度的70%重放流量

  -p string--pps=string

以给定的packets/sec重放数据包。此选项最多可出现1次。此选项不得与以下任何选项一起出现:multiplier, mbps, oneatatime, topspeed.。
指定一个值以将数据包重放调整为特定的packets/sec速率。例子:
200:将以每秒200个数据包重放流量
0.25:将以每分钟15个数据包重放流量

  -M string--mbps=string

以给定的Mbps重放数据包。此选项最多可出现1次。此选项不得与以下任何选项一起出现:multiplier,pps,oneatatime,topspeed。
可为tcpreplay设定其发送数据包的Mbps速率,该值可以指定为浮点值

  -t--topspeed

尽可能快地重放数据包。此选项不得与以下任何选项一起出现: mbps, multiplier, pps, oneatatime.

  -o--oneatatime

根据用户输入重放每个数据包。此选项不得与以下任何选项一起出现:mbps,pps,multiplier,topspeed。
允许您一次单步执行一个或多个数据包。 

  --pps-multi=number

指定每个时间间隔要发送的数据包数。此选项必须与以下选项一起使用:pps。此选项将整数作为输入参数。 number的值被限制为:大于或等于1,此选项的默认值为:1
当尝试以非常高的速率发送数据包时,每个数据包之间的时间可能很短,以至于不可能在所需的时间段内准确地休眠。此选项允许您一次发送多个数据包,从而允许更长的睡眠时间,这可以更准确地实现。

  --unique-ip

修改每个循环迭代的IP地址以生成唯一流。此选项必须与以下选项一起使用:loop。
确保每个--loop迭代的IPv4和IPv6数据包都是唯一的。这是以不会改变数据包CRC的方式完成的,因此通常不会影响性能。此选项将显着增加多次循环迭代生成的flow/sec。

  --unique-ip-loops=string

分配新的唯一IP之前循环的次数。此选项最多可出现1次。此选项必须与以下选项一起使用: unique-ip.

Number of --loop iterations before a new unique IP is assigned. Default is 1. Assumes both --loop and --unique-ip.

  --netmap

将数据包直接写入启用netmap的网络适配器。
此功能将检测Linux和BSD系统上支持netmap的网络驱动程序。如果检测到,则会在执行期间绕过网络驱动程序,并直接写入网络缓冲区。这将允许您在商用网络适配器上实现全线速率,类似于商用网络流量生成器实现的速率。请注意,绕过网络驱动程序将中断通过测试接口连接的其他应用程序。有关更多信息,请参阅INSTALL。
This feature can also be enabled by specifying an interface as ’netmap:<intf>’ or ’vale:<intf>. For example ’netmap:eth0’ specifies netmap over interface eth0.

  --nm-delay=number

Netmap启动延迟。此选项将整数作为参数。此选项的默认输入为:10
加载netmap后延迟的秒数。在netmap传输之前确保接口完全开启工作。需要netmap选项。默认值为10秒。

  --no-flow-stats

阻止打印和跟踪流量,速率和到期

禁止收集和打印流量统计信息。 不使用--preload-pcap选项时,此选项可以提高性能,否则它的唯一功能是禁止打印。

流功能将跟踪和打印正在发送的流的统计信息。 简单来讲,一个流是由5元组进行唯一区分的,即源IP、目的IP、源端口、目的端口和协议。
如果指定了--loop,则从一次迭代到下一次迭代的流将不是唯一的,除非数据包被更改。 使用--unique-iptcpreplay-edit在迭代之间更改数据包。 

  --flow-expiry=number

流被视为过期前的非活动秒数。此选项不得与以下选项一起使用:no-flow-stats。此选项将整数作为输入参数。 number的值被限制为:大于或等于0
此选项的默认值为:0
此选项将根据流的idle time来跟踪和报告流的过期。 pcap文件中的时间戳用于确定到期时间,而不是重放数据包的实际时间戳。例如,值30表示如果流上没有流量持续30秒,则任何后续流量都将被视为新流量,从而将增加流量和每秒流量(fps)统计量。

( For example, a value of 30 suggests that if no traffic is seen on a flow for 30 seconds, any subsequent traffic would be considered a new flow, and thereby will increment the flows and flows per second (fps) statistics.)
此选项可用于优化流产品的流超时设置。当实际流量响应速度很慢时,将超时设置较低可能会导致流量被丢弃。将流量超时配置得过高可能会增加流量产品所需的资源。
请注意,在高于原始速度的重放时使用此选项可能会导致流量和fps计数膨胀。
默认值为0(无到期),典型值为30-120秒

  -P--pid

在启动时打印tcpreplay的PID

  --stats=number

每X秒打印统计信息,如果为'0'则打印每个循环。此选项将整数作为输入参数。 number的值被限制为:大于或等于0
Note that timed delays are a "best effort" and long delays between sending packets may cause equally long delays between printing statistics.

  -V--version

打印版本信息

  -h--less-help

打印简单的帮助信息

  -H--help

打印帮助信息

  -!--more-help

打印详细帮助信息

  --save-opts [=cfgfile]

将选项状态保存到cfgfile。默认值是下面的OPTION PRESETS章节中列出的最后一个配置文件。该命令在更新配置文件后退出。

  --load-opts=cfgfile--no-load-opts

Load options from cfgfile. The no-load-opts form will disable the loading of earlier config/rc/ini files. --no-load-opts is handled early, out of order.

 2、返回值

One of the following exit values will be returned: 
0 (EXIT_SUCCESS)

Successful program execution.

1 (EXIT_FAILURE)

The operation failed or the command syntax was not valid.

66 (EX_NOINPUT)

A specified configuration file could not be loaded.

70 (EX_SOFTWARE)

libopts had an internal operational error. Please report it to autogen-users@lists.sourceforge.net. Thank you.

 3、使用示例

1、重放在客户端 ftp 连接的报文 

a、在客户端使用 ethereal 抓包,存为 ftp.pcap 文件。

b、 将 ftp.pcap 文件进行 tcpprep 操作,制作 cache 文件。

[root@A ~]# tcpprep -an client -i ftp.pcap -o ftp.cache –v 

c、 将 DUT 设备的两个接口和 PC 的两个接口使用网线连接,使用 tcpreplay 重 放报文。注意防火墙的配置为网桥(透明)模式。 

[root@A ~]# tcpreplay -c ftp.cache -i eth0 -j eth1 ftp.pcap -R –v 

-R 参数表示全速发送,-v 显示打印信息。 

2、重放在客户端 BT 连接的报文 

a、在实验室 BT 下载一些台湾的娱乐节目和热门的大片,使用 ethereal 抓包, 存为 bt.pcap 文件。注意 pcap 文件大小的控制,对 pc 的内存要求比较高,我保 存了一个 600 多 M 的 pcap 文件用了 40 多分钟,大家有需要可以直接从实验室 copy。 

b、将 bt.pcap 文件进行 tcpprep 操作,制作 cache 文件。

 [root@A ~]# tcpprep -an client -i bt.pcap -o bt.cache -C "100M BT Packet" –v

制作 cache 文件,在 cache 文件中写入“100M BT Packet”的注释。 

c、使用 tcpreplay 重放报文。 

[root@A ~]# tcpreplay -c bt.cache -i eth0 -j eth1 bt.pcap -v –R 

3、重放 tftp 服务器上抓到的报文 

a、在 tftp 服务器上使用 ethereal 抓包,存为 tftp.pcap 文件。 

b、将 pcap 文件进行 tcpprep 的操作,制作 cache 文件。 

[root@A ~]# tcpprep -an server -i tftp.pcap -o tftp.cache –v 

注意:我在测试的时候犯了一个错误,使用 DUT 的 tftp 升级来做实验,同时穿 过 DUT 重放报文,结果在网卡发送报文的后,DUT 的 mac 地址做了的回应,导致 交互过程没有穿过 DUT,这个问题比较搞笑,上午弄了半天才发现原因,开始还 以为 udp 的连接不能重放。 

c、使用 tcpreplay 重放报文。 

[root@A ~]# tcpreplay -c tftp.cache -i eth0 -j eth1 tftp.pcap –v

 4、重放pcap包,并指定速率和loop次数

[root@A ~]# tcpreplay -i eth1 -M 10 -l 0 /home/demo/LSDK/LSDK.pcap

 以速率10Mbps,0为无限次循环进行重放

 

 

简单的说,tcpreplay是一种pcap包的重放工具,它可以将用ethreal、wireshark工具抓下来的包原样或经过任意修改后重放回去。它允许你对报文做任意的修改(主要是指对2层、3层、4层报文头),指定重放报文的速度等,这样tcpreplay就可以用来复现抓包的情景以定位bug,以极快的速度重放从而实现压力测试。

 

语法

tcpreplay [选项]

 

选项

-A "" 在使用 tcpdump 风格打印输出信息时,同时再调用tcpdump中的参数, 默认已经带有“-n,-l”,所以一般看到的都是ip地址,而没有主机名的打印,注意这个是在tcpreplay使用了-v参数时才能使用,不带-v不会报错,但是没有实际意义。格式:-vA “nnt”表示以tcpdump风格输出报文信息,并且不打印时间戳、主机名、端口服务名称。注意不要使用-c参数来指定打印的数据报文的个数,这样发送出去的报文也会变少。

-c 双网卡回放报文必选参数,后面紧跟cache文件名,该文件为tcpprep根据对应的pcap文件构造出来。

-D 把应用层的数据,使用dump mode写入到指定文件中去,和-w、-W 参数一起使用。

-e 指定端点的ip,即把发送报文的和接收的报文的ip都修改称对应的参数值中指定的ip,但是这样发送的出的报文不会区分client和server

-f 指定配置文件。

-F 在发送报文时,自动纠正错误的校验和。对测试DUT的校验和检验。

-h 显示帮助文件。

-i 双网卡回放报文必选参数,指定主接口。

-I 重写主网卡发送出报文的目的MAC地址。

-j 双网卡回放报文必选参数,指定从接口。

-J 重写从网卡发送出报文的目的MAC地址。

-k 重写主网卡发送报文的源MAC地址。

-K 重写从网卡发送报文的源MAC地址。

-l 指定循环的次数。

-L 指定最大的发包数量。可以在确认连接的调试时使用。

-m 指定一个倍数值,就是必默认发送速率要快多少倍的速率发送报文。 加大发送的速率后,对于DUT可能意味着有更多的并发连接和连接数,特别是对于BT报文的重放, 因为连接的超时是固定的,如果速率增大的话, 留在session表中的连接数量增大,还可以通过修改连接的超时时间来达到该目的。

-M 表示不发送“火星”的ip报文,man文件中的定义是 0/8、172/8、 255/8。 -n 在使用-S参数,不对混杂模式进行侦听。

-N <cidr1:cidr2,...>通过伪造的NAT,重写IP地址。这个参数应该有很重要的应用,目前没有测试使用。

-O 没有测试使用。

-p 指定每秒发送报文的个数,指定该参数,其它速率相关的参数被忽略,最后的打印信息不会有速率和每秒发送报文的统计。

-P 表示在输出信息中打印PID的信息,用于单用户或单帐户模式下暂停和重启程序。

-r 指定发送的速率。目前-m/-r/-p这3个参数的相互关系。

-R 让网卡极限速度发数据包。

-t 指定MTU,标准的10/100M网卡的默认值是1500。

-T Truncate packets > 截去报文中MTU大于标准值的部分再发送出去,默认是不发送,skip掉。

-v 每发送一个报文都以 tcpdump 的风格打印出对应的信息。

-V 查看版本号。

-w 将主网卡发送的报文写入一个文件中,参数后紧跟文件名。

 

实例

 

1、重放在客户端 ftp 连接的报文 

 

a、在客户端使用 ethereal 抓包,存为 ftp.pcap 文件。

 

b、 将 ftp.pcap 文件进行 tcpprep 操作,制作 cache 文件。

[root@A ~]# tcpprep -an client -i ftp.pcap -o ftp.cache –v 

 

c、 将 DUT 设备的两个接口和 PC 的两个接口使用网线连接,使用 tcpreplay 重 放报文。注意防火墙的配置为网桥(透明)模式。

[root@A ~]# tcpreplay -c ftp.cache -i eth0 -j eth1 ftp.pcap -R –v 

 

-R 参数表示全速发送,-v 显示打印信息。

 

2、重放在客户端 BT 连接的报文 

 

a、在实验室 BT 下载一些台湾的娱乐节目和热门的大片,使用 ethereal 抓包, 存为 bt.pcap 文件。注意 pcap 文件大小的控制,对 pc 的内存要求比较高,我保 存了一个 600 多 M 的 pcap 文件用了 40 多分钟,大家有需要可以直接从实验室 copy。

 

b、将 bt.pcap 文件进行 tcpprep 操作,制作 cache 文件。

[root@A ~]# tcpprep -an client -i bt.pcap -o bt.cache -C "100M BT Packet" –v

 

制作 cache 文件,在 cache 文件中写入“100M BT Packet”的注释。

 

c、使用 tcpreplay 重放报文。

[root@A ~]# tcpreplay -c bt.cache -i eth0 -j eth1 bt.pcap -v –R 

 

3、重放 tftp 服务器上抓到的报文 

 

a、在 tftp 服务器上使用 ethereal 抓包,存为 tftp.pcap 文件。

 

b、将 pcap 文件进行 tcpprep 的操作,制作 cache 文件。

[root@A ~]# tcpprep -an server -i tftp.pcap -o tftp.cache –v 

 

c、使用 tcpreplay 重放报文。

[root@A ~]# tcpreplay -c tftp.cache -i eth0 -j eth1 tftp.pcap –v

 

 

 

 

参考:

tcpreplay man page
下面的链接包含一系列man包括:tcpreplay,tcprewrite,tcpreplay-edit,tcpprep,tcpbridge,tcpliveplay,tcpcapinfo
Tcpreplay - Pcap editing and replaying utilities
tcpreplay的使用方法

posted @ 2021-04-10 15:59  lucky8492  阅读(1273)  评论(0编辑  收藏  举报