一.Tcpreplay功能简介
首先推荐一个网站:http://tcpreplay.synfin.net/ ,上面有Tcpreplay的安装包和很多文档,包括手册、man页和FAQ等。
Tcpreplay是一系列工具的总称,包括tcpreplay、tcprewrite和tcpprep等工具,它可以用来在Unix系统或者linux系统上重放网络包。这些包是由tcpdump、ethereal和wireshark等软件抓取到的,即pcap格式的数据包。
安装Tcpreplay包时,默认情况下是安装了下面这些工具的, 用于准备发包的cache, 重写报文等:
(1)tcpprep: 这个工具的作用就是划分客户端和服务器,区分pcap数据包的流向,即划分那些包是client的,哪些包是server的,一会发包的时候client包从一个网卡发,另一个server的包可能从另一个网卡发。
(2)tcprewrite:这个工具的作用就是来修改报文,主要修改2层,3层,4层报文头,即MAC地址,IP地址和PORT地址。
(3)tcpreplay: 这是最终真正发包使用的工具,可以选择主网卡、从网卡、发包速度等。
一.Tcpreplay安装条件
Tcpreplay要实现它的功能要用到其它一些库:
1)libpcap库:由于tcpreplay在使用过程中主要依赖于libpcap库,因此在安装tcpreplay之前需要先安装libpcap,否则在安装tcpreplay的时候会提示你libpcap没有安装而安装失败。但如果希望libpcap能在linux上正常工作,则必须使内核支持"packet"协议,也即在编译内核时 打开配置选项 CONFIG_PACKET(选项缺省为打开)。
Libpcap可以从以下链接下载:http://www.tcpdump.org/ 可以用源码安装,比较简单。
2)tcpdump:这个不是必须的,这个工具的主要作用就是来解码数据包,在linux系统下查看pcap文件内的数据包,也可以用它来进行抓包。在安装tcpreplay时可以选择安装它也可以不选择安装。(个人建议也一起安装,以防止在使用tcpreplay时发生其他错误。)
3)libnet库。也不是必须的一个库。Tcpreplay也可用它来发送数据包,但由于libnet自身的bug比较多且已不再有人维护,Tcpreplay未来版本有可能取消对它的支持。(目前的版本还需要这个库的支持,因此建议也安装)
另外,你所使用的linux系统需要安装了GCC编译器,否则无法安装所有工具。
二.Tcpreplay安装过程
(1)首先来说明一下如何安装libpcap库(在安装tcpreplay之前需要先安装libpcap),安装libpcap之前需要首先安装m4、bison,flex,否则会出现错误:
1)打开网址:www.tcpdump.org/ 下载 libpcap-1.1.1.tar.gz (512.0KB) 软件包,通过命令 tar zxvf libpcap-1.1.1.tar.gz 解压文件,并将其放入自定义的安装目录。
2)打开网址:flex.sourceforge.net/ 下载 flex-2.5.35.tar.gz (1.40MB) 软件包,通过 tar zxvf flex-2.5.35.tar.gz 解压文件,并将其放入上述自定义的安装目录中。
注意:如果没有编译安装此文件,在编译安装libpcap时,就会出现 “configure: error: Your operating system‘s lex is insufficient to compile libpcap.”的错误提示。
3)打开网址:ftp.gnu.org/gnu/bison/ 下载 bison-2.4.1.tar.gz (1.9MB) 软件包,通过 tar zxvf bison-2.4.1.tar.gz 解压文件,并将其放入上述自定义的安装目录中。
注意:如果没有编译安装此文件,在编译安装libpcap时,就会出现 "configure: WARNING: don‘t have both flex and bison; reverting to lex/yacc checking for capable lex... insufficient" 的错误提示。
4)打开网址:ftp.gnu.org/gnu/m4/ 下载 m4-1.4.13.tar.gz (1.2MB)软件包,通过 tar zxvf m4-1.4.13.tar.gz 解压文件,并将其放入上述自定义的安装目录中。
注意:如果没有编译安装此文件,在编译安装bison-2.4.1时,就会出现 “configure: error: GNU M4 1.4 is required”的错误提示。
然后,依次进入m4-1.4.13,bison-2.4.1,flex-2.5.35,libpcap-1.1.1 并执行以下命令:
# ./configure
# make
# make install
命令完成后,libpcap才能正常使用。
(2)安装完libpcap后就可以安装tcpreplay了,从这个链接http://tcpreplay.synfin.net/下载 tcpreplay-3.4.4.tar.gz软件包,通过 tar zxvf tcpreplay-3.4.4.tar.gz 解压文件,并将其放入上述自定义的安装目录中。然后进入tcpreplay-3.4.4,并执行以下命令:
# ./configure
# make
# make install
执行完后,tcpreplay 就可以使用了,可以通过命令:tcpreplay –vesion来查看它的版本信息,tcpreplay –h来查看帮助内容。
三.Tcpreplay使用的各种参数
(1)tcpprep使用的参数:
Usage: # tcpprep [-a -n <mode> -N <type> | -c <cidr> | -p | -r <regex>] -o <out> -i <in> <args>
-a Split traffic in Auto Mode
一般情况下都需要该参数,表示按模式自动分离的通讯流量生成cache文件,表示自动分离采取的拓扑模式,来决定采取那种模式分离通讯流量的双方。
-c CIDR1,CIDR2,... Split traffic in CIDR Mode
可选参数,表示分离流量时采用CIDR(无类别域间路由选择)模式。格式:tcpprep -ac 10.10.0.0/24,表示把源地址匹配10.10.0.0/24网段的报文全部由主网卡发送,剩下的报文由从网卡发送出来,这里还有一点需要补充,就是tcpreplay在重放报文时对两个网卡的定义很明确,一个主网卡(primary interface),一个是从网卡(secondary interface),不同的模式,两块网卡的属性不一样。
-C <comment> Embed comment in tcpprep cache file
可选参数,表示在cache文件中嵌入注释内容,可以用于注释说明cache文件的内容,注意使用时参数位置,不要放在最后,我测试时放在-o参数值的后面就报错,放到-i参数之前就可以。生成cache文件后使用-P可以查看写入的内容。(这个参数一般用不着)
-h Help
显示帮助文件
-i <capfile> Input capture file to process
生成cache文件的必带参数,后面紧跟pcap文件名,表示这个pcap文件需要处理。
-m <minmask> Minimum mask length in Auto/Router mode
可选参数,在选用router模式时使用,表示最小掩码,默认是30(2个有效ip地址)。
-M <maxmask> Maximum mask length in Auto/Router mode
可选参数,在选用router模式时使用,表示最大掩码,默认是8(1600万个ip地址)。
-n <auto mode> Use specified algorithm in Auto Mode
生成cache文件的必带参数,后面紧跟模式名称,可选项有(bridge|router|client|server),目前的版本只支持这4种模式。模式的选择很关键,例如在客户端使用ftp软件下载文件,那么你在客户端抓到的报文生成的pcap文件,那么就选用client模式,在服务器端抓到的报文生成的pcap文件就选用server模式。只有模式选对了,才能正确的分离流量从正确的接口发出正确的报文。注意:Server端的报文由主网卡发送出去,Client端的报文由从网卡发送出去。怎么确定主从网卡由tcpreplay的命令(-i –I两个参数)来决定。
-o <outputfile> Output cache file name
生成cache文件的必带参数,后面紧跟cache文件名,表示这个输出的cache文件以这个名字命名。
-p Split traffic based on destination port
可选参数,基于目的端口来分离通讯流量,它区分的依据是认为0-1023端口都是服务器的端发出的报文,其它的端口都是客户端发出的报文,具体的端口对应的/etc/services文件里的的内容。使用的格式:-p /etc/services,可以根据自己的需要来制作一个文件也可以。
-r <regex> Split traffic in Regex Mode
可选参数,表示使用Regex模式分离通讯流量,有点类似于CIDR模式,但是它匹配的是服务器的源IP。man文件提示不能和-a、-c参数一起使用。
-R <ratio> Specify a ratio to use in Auto Mode
可选参数,一个比例值,这个比例值的意义是服务器端发起的连接数和客户端发起的连接数的比例,这个值大于2的话就视为server端。这个英文原意我也不是太肯定,大家可以参考一下原文:
The ratio of server connections to client connections necessary to be classified as a server in auto mode. A system is classified as a server if [# server connections] >= ([# client connections] * [ratio]). Default is: 2.0
-x <match> Only send the packets specified
重要的可选参数,表示按照参数定义的需求来定义发送报文。后面还有具体的参数,因为在我们的抓包过程中,可能会由于网络环境原因,抓到了许多我们不需要回放的报文,我们就可以根据这个参数决定我们需要回放哪些报文内容。具体的参数意思如下:
S:<CIDR1>,... - Src IP must match specified CIDR(s)
在CIDR模式下必须匹配源IP,格式:-xS:100.1.1.0/24,10.10.10.0/26。多个用逗号隔开,参数个数没有试过,3个没有问题。
D:<CIDR1>,... - Dst IP must match specified CIDR(s)
在CIDR模式下必须匹配目的IP,格式同上。
B:<CIDR1>,... - Both src and dst addresses must match
必须同时匹配源和目的IP,格式同上。
E:<CIDR1>,... - Either src or dst address must match
匹配源或目的IP,格式同上。
Ex: -xP:1-5,9,15 would only send packets 1 through 5, 9 and 15.
根据参数后的参数值(报文编号)发送指定的报文。可以在ethereal中确认报文的编号,然后把需要的报文发送。可以用于排除ARP报文。
Tcpprep使用小结:在使用过程中,很多参数都没有用到,用的比较多的选项参数就-v、-P、-xB、-xP,一般都是client和server的模式,其它两种模式没有实验过,暂时还不知道怎么使用。
Tcpprep区分模式举例:
1)tcpprep -e 00:00:00:00:00:05 --include=P:1,2,3 -i test.pcap -o test.cache &(mac模式include)
2)tcpprep -e 00:1e:c9:4c:03:0a --exclude=P:1,2-5 -i test.pcap -o test.cache &(mac模式exclude)
3)tcpprep -a server --exclude=P:1,2-5 -i test.pcap -o test.cache &(auto模式)
4)tcpprep --cidr=192.168.0.0/16,10.0.0.0/8 --include=P:1,2-5 -i test.pcap -o test.cache & (CIDR)
5)tcpprep -p --include=P:1,2-5 -i test.pcap -o test.cache & (port模式)
(2)tcprewrite使用的参数
-r rewrite TCP/UDP ports
重写TCP/UDP端口
-e rewrite IP addresses to be between two endpoints
重写两个端点之间的IP地址
-b skpi rewriting broadcast/multicast IPv4/IPv6 addresses
跳过重写广播/多播IPv4/IPv6地址
--enet-dmac Override destination Ethernet MAC addresses
修改目的MAC地址
--enet-smac Override source Ethernet MAC addresses
修改源端MAC地址
-i Input pcap file to be processed
输入被处理的pcap文件
-o out pcap file
输出pcap文件(这里这个生成的文件我还没有弄清楚到底是什么作用)
-c Split traffic via tcpprep cache file
发送的文件,即tcpprep处理生成的cache文件
-h help
显示帮助
(tcprewrite 工具还没有真正的使用测试过,因此具体功能还要验证)
(3)tcpreplay使用的参数:
Usage: tcpreplay [args] <file(s)>
-c <cachefile> Split traffic via cache file
双网卡回放报文必选参数,后面紧跟cache文件名,该文件为tcpprep根据对应的pcap文件构造出来。
-F Fix IP, TCP, UDP and ICMP checksums
可选参数,在发送报文时,自动纠正错误的校验和。对测试DUT的校验和检验还是有用的。
-i <nic> Primary interface to send traffic out of
双网卡回放报文必选参数,指定主接口。
-I <nic> Secondary interface to send traffic out of
双网卡回放报文必选参数,指定从接口。
-L <limit> Specify the maximum number of packets to send
可选参数,指定最大的发包数量。可以在确认连接的调试时使用。
-x <multiple> Set replay speed to given multiple
可选参数,指定一个倍数值,就是必默认发送速率要快多少倍的速率发送报文。加大发送的速率后,对于DUT可能意味着有更多的并发连接和连接数,特别是对于BT报文的重放,因为连接的超时是固定的,如果速率增大的话,留在session表中的连接数量增大,还可以通过修改连接的超时时间来达到该目的。
-p <packetrate> Set replay speed to given rate (packets/sec)
可选参数,指定每秒发送报文的个数,指定该参数,其它速率相关的参数被忽略,最后的打印信息不会有速率和每秒发送报文的统计。
这是是主要的一些参数,从网上查找的一些资料跟具体的tcpreplay中的参数有很大出入,因此建议想要使用其他参数时,使用命令:# tcpreplay –h 查看帮助。
四.Tcpreplay使用举例:
试验过程:从客户端上抓取的访问butterfly的原始包,tcp.pcap,通过TCPreplay回方后,在交换机上抓取的包result.pcap,可以看出,两个文件中的包顺序完全相同。
配置实例:
如图:
将DUT设备的两个接口和PC的两个接口使用网线连接,使用tcpreplay重放报文。注意防火墙的配置为网桥(透明)模式。PC机的一个网卡连接DUT的端口1,另一个网卡连接DUT的端口2,DUT内的MAC地址设为静态映射。
1) 在客户端利用Ethreal抓取客户端访问butterfly的TCP包,目的IP地址为:10.1.145.249,本机地址为:10.1.145.96;
2) 将抓取的包文件存为:tcp.pcap,然后拷贝到linux系统中,放到你安装tcpreplay目录中。
3) 使用tcpprep区分client和server端,生成cache文件。
# tcpprep –a client –i tcp.pcap –o tcp.cache
(这里采用自动客户端模式区分)
4) 使用tcpreplay重放报文
#tcpreplay –p 1000 –c tcp.cache –i eth0 –I eth1 tcp.pcap
结论:在慢速重放包时,可以按照原有报文的交互顺序 通过被测设备。即完全模拟了客户端和服务器的交互过程。
该软件默认是线速发包,试验发现会有错误的包和乱序的包。配置为1000个包/s时,不会失序。
推测失序原因:在高速发包时,特别依赖于网卡,只要网卡有抖动,可能会导致client端和服务器端发送的包在通过DUT时,排序有问题。
安装tcpreplay需要的所有安装包文件,我已经上传到//pmd-3/测试部/tools目录下。如果大家在使用中发现什么问题欢迎互相交流。
使用经验总结:
如果不对包文件进行改写,则重发包流程为:
- 1. 先对包进行区分客户端和服务器端:
tcpprep -a client -i http. pcap -o http. cache
- 2. 重放包文件,命令为:
tcpreplay –p 1 -c http.cache -i eth0 -I eth1 http.pcap
如果对包文件进行改写,则重发包文件流程为:
- 1. 先对包进行区分客户端和服务器端:
tcpprep -a client -i http. pcap -o http. Cache
- 2. 对包文件进行改写:
tcprewrite -e 192.85.1.2:192.85.2.2 --enet-dmac=00:15:17:2b:ca:14,00:15:17:2b:ca:15 --enet-smac=00:10:f3:19:79:86,00:10:f3:19:79:87 -c test.cache -i test.tcpdump -o 1.pcap
- 3. 重放包文件:
tcpreplay -i eth0 -I eth1 -l 1000 -t -c /dev/shm/test.cache /dev/shm/1.pcap