Tcpreplay的使用

Tcpreplay概述

Tcpreplay是一套免费的开源实用程序集合,用于编辑和重放以前捕获的网络数据流量。最初的目标是重放恶意流量到入侵检测预防系统。 现在已经有很多用途,例如重放报文到Web服务器等。 Tcpreplay是多个工具的集合,我们主要介绍以下两个工具,这也是我曾经使用过的两个工具。

  • tcprewrite – 修改pcap文件,例如修改报文的二层或三层消息头。
  • tcpreplay – 以捕获报文的速度来重放pcap文件,并支持以任意的速度来重放pcap文件。

编译及安装

如果在ubuntu操作系统上,可以通过apt-get 命令进行安装,命令为:

apt-get install tcpreplay

如果其他系统则可能需要编译安装,首先下载代码。

git clone https://github.com/appneta/tcpreplay

或apt-get source tcpreplay

在编译时,tcpreplay默认会链接静态pcap库,需要寻找libpcap.a文件,如果没有该文件,则需要在编译时改为动态链接。我这里使用ubuntu上下载的代码,编译命令如下:

./configure –enable-dynamic-link

make

make install;

注意:如果是从git服务器上下载的新版本,可能需要安装一些软件的新版本,尽量使用apt-get来下载对应时间的低版本软件。

回放报文

通常我们使用tcpreplay来回放报文,命令如下:

tcpreplay -i eth0 /srv/bjbook.pcap

-i eth0 表示指定eth0网卡来回放报文。这时文件bjbook.pcap里面报文,会按照捕获时的速率通过网卡eth0发送出去。可以使用tcpdump/wireshark来进行捕获验证是否发送出去,那是当然全部发送出去了。

Tcpreplay常用选项如下:

  • -l,–loop = num循环调用捕获的文件指定次数。
  • -i,–intf1 = str 指定重放报文的输出接口。
  • -p,–pps = num以给定的包速率来重放数据包。
  • -M,–mbps = str以给定的传输速率Mbps重放数据包。
  • -K,–enable-file-cache启用数据包缓存到内存中,从而在多次重放中不用每次都从影片读取,这样可以在多次重放时提高性能。通常和loop选项同时使用。需要确保有足够的空闲内存来缓存整个报文。
  • -o, –oneatatime为用户每输入一次将重放一个数据包。这个选项不能和一些控制速率选项相结合:mbps,pps,topspeed。这允许你一次重放一个数据包,便于程序调试。
  • -t – topspeed选项将以仅可能快的速率来发送报文。

示例1-1 tcpreplay –topspeed –intf1=eth0 puma.pcap

  • –topspeed 以最快的速率来发送报文
  • –intf1=eth0 指定接口eth0来发送报文。
  • puma.pcap 所要发送的报文。

示例1-2 一个一个报文的发送。(用于调试程序)

tcpreplay –oneatatime –intf1=eth0 puma.pcap

如果不指定回放速率,则按照报文本身的速率进行回放,如果报文的时间跨度非常长,则回放速率非常慢,这时可以使用“–pps”选项来指定包回放速率。示例如下:

tcpreplay -i eth2 –pps=2000 puma.pcap

回放输出:

_images/tcpreplay.png

图1-1回放输出

如果回放报文出现了如图6-1 所示消息过长“Error whith PF_PACKET send() :Message to long”的错误,通常mtu的默认值为1500, 将网卡的mtu值改大,例如命令为

ip link set eth2 mtu 1520

ifconfig eth2 mtu 1520

_images/tcpreplay_mtu.png

图1-2 tcpreplay提示报文太长

tcpdump是对报文进行捕获和过滤,tcpreplay重放tcpdump抓取的报文。如果我们需要修改报文,则使用tcprewrite。例如我们要去除报文的vlan部分内容。可以采用以下命令:

tcprewrite –enet-vlan=del –infile=aaa.pcap –outfile=bbb.pcap

将aaa.pcap文件中带有vlan标识的报报文中的vlan信息去除,并保存为bbb.pcap文件。

参考文献