Tcpreplay3.x的安裝、使用和源碼分析

 

整理記錄

版本

時間

內容

整理人

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 –xzvf tcpreplay-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系列工具的指令風格一致,都比較簡潔。你可以鍵入“man tcpreplay”或“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.cache http_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 窗口,可以讓它後臺運行 */

-w tcpdump.pcap是指將抓取到的包存到tcpdump.pcap這個文件中,-s 0是指儘可能大的抓取每個包(儘量不截斷),最後面的單引號裏的內容是過濾規則。

4.5.2.  選包

又如你只想把test.pcap文件中端口號爲80tcp包(http包)提取出來,再轉交給tcpreplay去發送,可以這樣做。

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

-r test.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的實現;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章