工具的名称就能猜到工具的作用,就是重放TCP的报文,但是这个工具究竟功能如何,是不是仅仅局限于在一个网卡上回放报文,这篇说明书主要介绍tcprelay的一些与测试有关的使用,在介绍tcpreplay命令的使用之前,先要介绍与之密切相关的一个命令:tcpprep,中文直译就是tcp准备的意思,它的作用可以参见官方网站的介绍说明:
tcpprep is the pcap pre-processor for tcpreplay and tcprewrite. The purpose of tcpprep is to create a cache file which is used to "split" traffic into two sides (often called primary/secondary or client/server). If you are intending to use tcpreplay with two NIC’s, then tcpprep is what decides which interface each packet will use. By using a seperate process to generate cache files, tcpreplay can send packets at a much higher rate then if it had to do the calculations to split traffic itself.
个人翻译:(建议大家看man文件,阅读3次就能够比较好的理解了)
P:<list> – Must be one of the listed packets where the list corresponds to the packet number in the capture file.
Ex: -xP:1-5,9,15 would only send packets 1 through 5, 9 and 15.
根据参数后的参数值(报文编号)发送指定的报文。可以在ethereal中确认报文的编号,然后把需要的报文发送。可以用于排除ARP报文。
F:"<filter>" – BPF filter. See the tcpdump(8) man page for syntax.
未知,以后补充。
-X <match> Send all the packets except those specified
可选参数,就是-x参数的取反,参数内容也是一样。
-v Verbose
可选参数,显示trpprep生成cache文件的处理过程,就是一些信息的即时打印。
-V Version
显示版本号。
Tcpprep使用小结
再构造cache文件的过程中我用的比较多的选项参数就-v、-P、-xB、-xP,一般都是client和server的模式,其它两种模式没有实验过,暂时还不知道怎么使用,bridge模式我使用过一次,结果发现报文是从一个网卡送出。
对于tcp和udp协议都做了测试,是可以支持的,icmp还没有成功。对于网络上的BT报文,只要你有pcap文件,也是可以构造cache文件来模拟完全真实的BT流量。
目前的使用就是这么多,感觉还是很有用的,tcpreplay的参数有一部分是和tcpprep重复,下面的帮助文件说明就不详细说明了,但是特殊有好用的参数会使用蓝色字体标记出来给予重视。存在的不足是还没有学会在nat模式下重放报文,现在所有的报文重放都是在透明模式下完成的。
Tcpreplay帮助文件说明
Usage: tcpreplay [args] <file(s)>
-A "<args>" Pass arguments to tcpdump decoder (use w/ -v)
可选参数,在使用tcpdump风格打印输出信息时,同时再调用tcpdump中的参数,默认已经带有“-n,-l”,所以一般看到的都是ip地址,而没有主机名的打印,注意这个是在tcpreplay使用了-v参数时,才能使用,不带-v不会报错,但是没有实际意义。格式:-vA “nnt”表示以tcpdump风格输出报文信息,并且不打印时间戳、主机名、端口服务名称。注意不要使用-c参数来指定打印的数据报文的个数,这样发送出去的报文也会变少。
-b Bridge two broadcast domains in sniffer mode
可选参数,没有用过
-c <cachefile> Split traffic via cache file
双网卡回放报文必选参数,后面紧跟cache文件名,该文件为tcpprep根据对应的pcap文件构造出来。
-C <CIDR1,CIDR2,…> Split traffic by matching src IP
可选参数,
-D Data dump mode (set this BEFORE -w and -W)
可选参数,把应用层的数据,使用dump mode写入到指定文件中去,和-w、-W参数一起使用。
-e <ip1:ip2> Specify IP endpoint rewriting
可选参数,指定端点的ip,即把发送报文的和接收的报文的ip都修改称对应的参数值中指定的ip,但是这样发送的出的报文不会区分client和server,还没有发现使用的地方。
-f <configfile> Specify configuration file
可选参数,指定配置文件,目前不会使用。
-F Fix IP, TCP, UDP and ICMP checksums
可选参数,在发送报文时,自动纠正错误的校验和。对测试DUT的校验和检验还是有用的。
-h Help
显示帮助文件。
-i <nic> Primary interface to send traffic out of
双网卡回放报文必选参数,指定主接口。
-I <mac> Rewrite dest MAC on primary interface
可选参数,重写主网卡发送出报文的目的MAC地址。
-j <nic> Secondary interface to send traffic out of
双网卡回放报文必选参数,指定从接口。
-J <mac> Rewrite dest MAC on secondary interface
可选参数,重写从网卡发送出报文的目的MAC地址。
-k <mac> Rewrite source MAC on primary interface
可选参数,重写主网卡发送报文的源MAC地址。
-K <mac> Rewrite source MAC on secondary interface
可选参数,重写从网卡发送报文的源MAC地址。
-l <loop> Specify number of times to loop
可选参数,指定循环的次数,测试过程发现不是那么好用,有待确认。
-L <limit> Specify the maximum number of packets to send
可选参数,指定最大的发包数量。可以在确认连接的调试时使用。
-m <multiple> Set replay speed to given multiple
可选参数,指定一个倍数值,就是必默认发送速率要快多少倍的速率发送报文。加大发送的速率后,对于DUT可能意味着有更多的并发连接和连接数,特别是对于BT报文的重放,因为连接的超时是固定的,如果速率增大的话,留在session表中的连接数量增大,还可以通过修改连接的超时时间来达到该目的。
-M Disable sending martian IP packets
可选参数,表示不发送“火星”的ip报文,man文件中的定义是0/8、172/8、255/8。
-n Not nosy mode (not promisc in sniff/bridge mode)
可选参数,在使用-S参数,不对混杂模式进行侦听。没有测试过。
-N <CIDR1:CIDR2,…> Rewrite IP’s via pseudo-NAT
可选参数,通过伪造的NAT,重写IP地址。这个参数应该有很重要的应用,目前没有测试使用。
-O One output mode
可选参数,没有测试使用
-p <packetrate> Set replay speed to given rate (packets/sec)
可选参数,指定每秒发送报文的个数,指定该参数,其它速率相关的参数被忽略,最后的打印信息不会有速率和每秒发送报文的统计。
-P Print PID
可选参数,表示在输出信息中打印PID的信息,用于单用户或单帐户模式下暂停和重启程序。
-r <rate> Set replay speed to given rate (Mbps)
可选参数,指定发送的速率。目前-m/-r/-p这3个参数的相互关系还需要确认。
-R Set replay speed to as fast as possible
可选参数,让报文线速发送。
-s <seed> Randomize src/dst IP addresses w/ given seed
可选参数,
-S <snaplen> Sniff interface(s) and set the snaplen length
可选参数,
-t <mtu> Override MTU (defaults to 1500)
可选参数,指定MTU,标准的10/100M网卡的默认值是1500。
-T Truncate packets > MTU so they can be sent
可选参数,截去报文中MTU大于标准值的部分再发送出去,默认是不发送,skip掉。目前还有疑问,为什么会产生MTU大于1500字节的包,在BT报文中,这种包比较常见。
-u pad|trunc Pad/Truncate packets which are larger than the snaplen
可选参数,后面的参数值二选一,snaplen是指保留数据包的长度,这里的trunc参数值和MTU没有任何关系,不要混淆。
-v Verbose: print packet decodes for each packet sent
可选参数,没发送一个报文都以tcpdump的风格打印出对应的信息。
-V Version
查看版本号。
-w <file> Write (primary) packets or data to file
可选参数,将主网卡发送的报文写入一个文件中,参数后紧跟文件名。
-W <file> Write secondary packets or data to file
可选参数,将从网卡发送的报文写入一个文件中,参数后紧跟文件名。
-x <match> Only send the packets specified
可选参数,发送匹配参数值的报文,这里各个参数具体的含义和tcpprep中的一样,
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,格式同上。
P:<list> – Must be one of the listed packets where the list corresponds to the packet number in the capture file.
Ex: -xP:1-5,9,15 would only send packets 1 through 5, 9 and 15.
根据参数后的参数值(报文编号)发送指定的报文。可以在ethereal中确认报文的编号,然后把需要的报文发送。可以用于排除ARP报文。
F:"<filter>" – BPF filter. See the tcpdump(8) man page for syntax.
未知,以后补充。
-X <match> Send all the packets except those specified
可选参数,-x的参数内容取反。参数内容一样。
-1 Send one packet per key press
可选参数,参数内容就是阿拉伯数字1,这个参数对于确定连接的建立,相当好用,根据按回车键发送报文,可以将报文一个一个发送,来判断连接的状态。也可以用于故障定位。
-2 <datafile> Layer 2 data
可选参数,在2层加入数据。
-4 <PORT1:PORT2,…> Rewrite port numbers
可选参数,重写端口号,对于测试特殊端口的应用比较实用。
<file1> <file2> … File list to replay
可选参数,没有实验过。
配置实例
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
Tcpprep和Tcprepaly的原理
对于原理部分,目前还没有看过代码,王海斌同学打算先看过源码后,再在windows上调试一个tcpreplay的程序供测试使用。具体的实现原理日后补充。
tcpprep是一个在tcpreplay和tcprewrite(3.0.beta11版本才有,这里不讨论)之前使用的pcap文件的处理程序。使用tcpprep的目的就是建立一个cache文件,用于分离通信流量中的两方(通常叫做 主要的/次要的 或者 客户端/服务器)。如果你正打算在两块网卡上使用tcpreplay的话,那么tcpprep就是用来决定每一个报文(packet)从哪一个接口发出。通过使用这样一个分离的程序来建立一个cache文件,tcpreplay就可以根据这个cache文件通过自身的计算来分离流量,高速率的发送报文。
目前王海斌看过代码后,对cache文件的作用解释,主要是加速报文的发送,cache文件中存放着pcap文件中每个帧的编号和时间戳等信息,以达到tcpreplay回放时可以更加快速的发送报文的目的。
其实我们要使用tcpreplay的功能的话,肯定就是它的重放功能,而重放的话肯定是一个客户端和服务器的交互过程,例如ftp、tftp、sqlnet、rtsp、mms等应用层协议的交互过程,我们只要有正确和足够的pcap文件,只需要制作cache文件,使用tcpreplay的命令,就不需要每次都搭建一个真实的测试环境来测试DUT对该协议的支持程度。所以在介绍tcpreplay之前先介绍tcpprep这个命令的使用。tcprewrite提供的功能暂时不做研究。
Tcpprep帮助文件说明
由于时间问题,这次不能对man文件一一做解释,这个说明文档主要是对-h打印出来的命令参数作一个说明,结合几个实际的例子来说明tcpprep的使用。强烈建议大家去官方网站去阅读他们提供的文档,http://tcpreplay.synfin.net/trac/,我这里有打印的内容,有兴趣的可以拿去看一下。
Usage: tcpprep [-a -n <mode> -N <type> | -c <cidr> | -p | -r <regex>]
-o <out> -i <in> <args>
-a <st1:city w:st="on"><st1:place w:st="on">Split</st1:place></st1:city> traffic in Auto Mode<o:p></o:p>
一般情况下都需要该参数,表示按模式自动分离的通讯流量生成cache文件,这个参数一半都和-n参数一起使用,表示自动分离采取的拓扑模式,来决定采取那种模式分离通讯流量的双方。
-c CIDR1,CIDR2,… Split traffic in CIDR Mode
可选参数,表示分离流量时采用CIDR(无类别域间路由选择)模式。格式:tcpprep -ac <st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">10.10.0</st1:chsdate>.0/24,表示把源地址匹配10.10.0.0/24网段的报文全部由主网卡发送,剩下的报文由从网卡发送出来,这里还有一点需要补充,就是tcpreplay在重放报文时对两个网卡的定义很明确,一个主网卡(primary interface),一个是从网卡(secondary interface),不同的模式,两块网卡的属性不一样。该参数不能和-r,-a一起使用。<o:p></o:p>
-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),目前<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">2.3.5</st1:chsdate>版本只支持这4种模式。模式的选择很关键,例如在客户端使用ftp软件下载文件,那么你在客户端抓到的报文生成的pcap文件,那么就选用client模式,在服务器端抓到的报文生成的pcap文件就选用server模式。只有模式选对了,才能正确的分离流量从正确的接口发出正确的报文。注意:Server端的报文由主网卡发送出去,Client端的报文由从网卡发送出去。怎么确定主从网卡由tcpreplay的命令(-i –j两个参数)来决定。
-N client|server Classify non-IP traffic as client/server
可选参数,表示非IP的流量(例如ARP报文)从哪个接口送出,因为很多的tcpprcp支持的模式中,都依赖于IP头部中的IP地址信息来决定报文是从client端还是从server端发送出去。但是并不是所有的报文都是IPv4结构的,所以这种情况下,tcpprep不能确定这些非IPv4类型的报文应该从哪个接口发送出去,所以,默认的配置就是从client的接口发送出去。如果你硬要正确的分离出非IPv4报文的话,可以使用MAC address模式(–mac)。3.0版本才支持。
-o <outputfile> Output cache file name
生成cache文件的必带参数,后面紧跟cache文件名,表示这个输出的cache文件以这个名字命名。
-p <st1:place w:st="on"><st1:city w:st="on">Split</st1:city></st1:place> traffic based on destination port
可选参数,基于目的端口来分离通讯流量,它区分的依据是认为0-1023端口都是服务器的端发出的报文,其它的端口都是客户端发出的报文,具体的端口对应的/etc/services文件里的的内容。使用的格式:-p /etc/services,可以根据自己的需要来制作一个文件也可以。
-P <file> Print comment in tcpprep file
可选参数,查看cache文件的内容。
-r <regex> <st1:place w:st="on"><st1:city w:st="on">Split</st1:city></st1:place> traffic in Regex Mode
可选参数,表示使用Regex模式分离通讯流量,有点类似于CIDR模式,但是它匹配的是服务器的源IP。man文件提示不能和-a、-c参数一起使用,但是我使用了也没有报错,格式:-r "(192)"或-r "(192|172)\…..*",具体应用还有待实验。
-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
-s <file> Specify service ports in /etc/services format
可选参数,在man文件中没有对该参数的解释,估计就是按/etc/services文件里的格式来定义服务的端口,没有太多的研究意义。
-x <match> Only send the packets specified
重要的可选参数,表示按照参数定义的需求来定义发送报文。后面还有具体的参数,因为在我们的抓包过程中,可能会由于网络环境原因,抓到了许多我们不需要回放的报文,我们就可以根据这个参数决定我们需要回放哪些报文内容。具体的参数意思如下:
S:<CIDR1>,… – Src IP must match specified CIDR(s)
在CIDR模式下必须匹配源IP,格式:-xS:100.1.1.0/24,<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">10.10.10</st1:chsdate>.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,格式同上。