Tcpreplay3.x的安装、使用和源码分析

来源:互联网 发布:linux 对外ddos攻击 编辑:程序博客网 时间:2024/05/16 10:00
 

整理记录

版本

时间

内容

整理人

V1.0

2008-05-21

Tcpreplay的安装、使用和源码分析

彭令鹏

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Tcpreplay3.x的安装、使用和源码分析

第1章.    说明

本文档只适用于Tcpreplay3.x

第2章.    Tcpreplay系列工具

2.1.  概述

首先推荐一个网站:http://tcpreplay.synfin.net/,上面有Tcpreplay的安装包和很多文档,包括手册、man页和FAQ等。本文也是在参考这个网站的基础上,通过一些实验而得出的。

Tcpreplay是一系列工具的总称,包括tcpreplaytcprewritetcpprep等工具,这也是Tcpreplay的第一个字母大写的原因。它用来在Unix系统或类Unix系统上重放网络包。这些包是由tcpdumpetherealwireshark等软件抓取到的,即pcap格式的数据包。

正因为Tcpreplay有重放数据包的功能,所以它常被用来模拟IDS攻击等测试环境,被广泛地用来测试防火墙和IDS工具的安全性。

2.2.  功能

安装Tcpreplay包时,默认情况下是安装了如表1所示的这些工具的。 1还给出了各个工具的功能。

工具

功能

tcpreplay

重发pcap文件中的数据包。

tcprewrite

改写pcap数据包的2-4层的头部信息,即MAC地址、IP地址和PORT等。

tcpprep

区分pcap数据包的流向,即区分出客户端和服务器。

1 Tcpreplay系列工具的功能

2.3.  各工具的组合

从表1可以看出tcpreplay负责发送数据包,tcprewrite用来改写数据包,tcpprep用来区分客户端和服务器。

1)       因为数据包中的内容都是双向的(客户端->服务器,服务器->客户端),tcprewrite改写数据,tcpreplay发送数据包时都应该区分方向(即区分客户端和服务器),因此这两个工具一般是工作在tcpprep的基础上的。

2)       tcpreplay可以发送任意pcap数据包,如果它想改变发送内容,就必须先用tcprewrite来改写数据包,然后再发送改写后的数据包。

2.4.  补充说明

Tcpreplay2.x中的tcpreplay将区分客户端和服务器、改写数据包,发送数据包等功能都集成在一起。Tcpreplay3.x为了设计的简单和使用的方便性而做了上述的改进。

第3章.    Tcpreplay的安装、配置

3.1.  相关的准备

Tcpreplay要实现它的功能要用到其它一些库。

1)       libpcap库。libpcap库是推荐而且几乎是必须的。Tcpreplay用它来发送数据包。请下载安装libpcap0.7.2及以上版本。

2)       tcpdump。强烈推荐但不是必需的一个工具。Tcpreplay用它来解码数据包,而且我们也可以用它的抓包功能来配合Tcpreplay的使用。当然,ethereal等软件也可以实现这样的功能,但tcpdump无疑是性价比最高的。

3)       libnet库。不推荐的一个库。Tcpreplay也可用它来发送数据包,但由于libnet自身的bug比较多且已不再有人维护,Tcpreplay未来版本有可能取消对它的支持。

更详细的说明请参看http://tcpreplay.synfin.net/上的相关内容

3.2.  安装步骤

首先,下载安装包。Tcpreplay的源码安装包可以在http://tcpreplay.synfin.net/上下载到。

然后解压安装包。假设安装包名字为tcpreplay-3.3.0.tar.gz,所在的目录为/urs/local/src,所用的操作系统为redhat9,解压安装包可以直接输入“tar –xzvftcpreplay-3.3.0.tar.gz”。

进入解压后的文件夹。输入指令“cd tcpreplay-3.3.0”。

遵循一般的软件安装步骤,如下所示。

$./configure /* 检查系统的配置,自动生成Makefile*/

$make      /* 编译、连接并安装Tcpreplay*/

$make install /* 安装Tcpreplay手册等 */

上面是最简化的安装。如果你还有其它安装和配置需求,请查看安装包中的INSTALLREADME文档。

第4章.    Tcpreplay的使用

本部分将结合一个实例来讲解。先说明一下这个实例的运行环境和测试思路。本实例采用的是tcpreplay-3.3.0,运行在远程linux服务器上,用来发送http.pcap中的内容,同时在服务器上我用tcpdump来抓取tcpreplay发出的包;在本地windows中我用wiresharkethereal的增强版本)来观察从服务器上下载过来的各种数据包(即tcpdump抓取到的包、tcprewrite修改后的包,这些包是通过ftpssh下载过来的)。

4.1.  指令风格简介

Tcpreplay系列工具的指令风格一致,都比较简洁。你可以键入“mantcpreplay”或“tcpreplay-h”类似指令来查得相关帮助。下面的讲述以tcpreplay为例。

指令的选项分简短的和完整两种形式。如查询版本的简短选项是“-V”,完整形式则是“--version”。

有的选项带有参数,而且两种选项的输入参数的形式不同。如以缓存文件选项为例,对于简短选项,形式是“-c pathname”;对于完整选项,形式是“--cachefile=pathname”。pathname是缓存文件的路径。

4.2.  区分客户端和服务器

输入如下指令。

$tcpprep –-port –cachefile=cache_test.cache  --pcap=http.pcap

tcpprep的详细使用请参看相关手册(如man手册)。

--port是指tcpprepport-split模式来区分客户端和服务器。在这种模式下,所有目的端口<1024的,将被视作客户端->服务器的包,否则视为服务器->客户端的包。tcppgrepautocidrregexportmac等多种模式,各种模式的详细情况请查看相关手册(如man手册)。

--pcap=http.pcap是指tcpprep处理的是http.pcap这个文件。

--cachefile=cache_test_cache是指tcpgrep处理后的信息存放在cache_test_cahe这个文件中。这个文件在tcprewritetcpreplay中将用到。

整个指令的意思就是采用port-spllit模式来处理http.pcap文件(区分http.pcap中的客户端和服务器),然后将处理结果存到cache_test_cache文件中。

4.3.  改写数据包的的内容

输入如下指令。

$tcprewrite --endpoints=192.168.0.1:192.168.0.2  --cachefile=cache_test.cache /

--infile=http.pcap --outfile=http_rewrite.pcap

tcprewrite的详细使用请参看相关手册(如man手册)。

--endpoints=192.168.0.1:192.168.0.2是指将客户端ip修改为192.168.0.1,将服务器ip修改为192.168.88.0.2,注意3.x版本的Tcpreplay自动地将IP的校验和修改好。用wireshark查看http_rewrite.pcap可以得到这个修改结果。

--cachefile=cache_test_cache是指tcprewritetcpprep 上步的处理结果——cache_test.cache来区分方向。

--infile=http.pcap是指要处理的pcap文件是http.pcap

--outfile=http_rewrite_pcap是指处理结果存在http_rewrite_pcap文件中。这个文件将是tcpreplay发送数据包的来源。

4.4.  发送数据包

输入如下指令。

$tcpreplay –intf1=eth0 –intf2=eth0 –t –cachefile=cache_test.cachehttp_rewrite_pcap

tcpreplay的详细使用请参看相关手册(如man手册)。

--intf1=eth0是指主接口是eth0,客户端->服务器的数据包通过这个接口发送。服务器和客户端的区分是从tcpprep的处理结果cache_test.cache中得到的。

--intf2=eth0是指从接口是eth0,服务器->客户端的数据包通过这个接口发送。

--cachefile=cache_test_cache是指tcpreplaytcpprep 上步的处理结果——cache_test.cache来区分方向。

http_rewrite.pcap是指tcpreplay发送的是来自http_rewrite.pcap这个文件中的数据包。

4.5.  合理使用tcpdump

我们可以合理地使用tcpdump来配合tcpreplay的使用。举两个例子。

4.5.1. 抓包

tcpdump 抓取tcpreplayeth0端口发出的tcp包,并要求这些包的目的地址是192.168.0.2,可输入如下的指令。

tcpdump –i eth0 –w tcpdump.pcap –s 0  '(tcp and (dst host 192.168.0.2) ) '  /* 如果不能同时开多个shell 窗口,可以让它后台运行 */

-wtcpdump.pcap是指将抓取到的包存到tcpdump.pcap这个文件中,-s 0是指尽可能大的抓取每个包(尽量不截断),最后面的单引号里的内容是过滤规则。

4.5.2. 选包

又如你只想把test.pcap文件中端口号为80tcp包(http包)提取出来,再转交给tcpreplay去发送,可以这样做。

$ tcpdump -r test.pcap -whttp_only.pcap –s 0 tcp port 80

-rtest.pcap是指从test.pcap中读包。这个指令的意思是从test.pcap中读包后,根据“tcp port 80这个过滤规则筛选出满足要求的包,将这些包存到http_only.pcap这个文件中去。

此后我们就可以用tcpreplay来发送http_only.pcap中的http包了。

第5章.    Tcpreplay的源码分析

由于时间和精力有限,源码分析是以后的任务。tcpreplay-3.3.0的源码,稍微瞄了下,发现很大,大概有1M多。它的源码分析的资料少,如果真要分析它的源码的话,还是要费很大功夫的。我的分析思路大致是先抓住Tcpreplay.ctcprewrite.cTcpprep.c等文件,然后从这些文件顺藤摸瓜,分析它的具体实现。另外,可以通过阅读Tcpreplay的最初版本(代码量应该是小多了),来帮助我们理解Tcpreplay的实现;

原创粉丝点击