TCPCopy使用簡介

1?概述

? ? ? tcpcopy是一種請求復(fù)制(所有基于tcp的packets)工具,可以把在線流量導(dǎo)入到測試系統(tǒng)中去(也可以在測試系統(tǒng)內(nèi)部放大流量),從而模擬真實運行環(huán)境,以便排查測試系統(tǒng)的性能問題和風(fēng)險。TCPCopy的優(yōu)勢在于其實時性及真實性,除了少量的丟包,可以完全拷貝線上流量到測試機器,真實的模擬線上流量的變化規(guī)律。

? ? ? 在tcpcopy 1.0版本中對整個架構(gòu)進(jìn)行了改進(jìn),將原本低版本tcpcopy需要運行在測試機上的intercept移除放到一個獨立的輔助機上來,使得測試機需要做的操作少到僅僅是添加一條路由而已,對整個測試機的性能損耗可以忽略,排除了intercept運行在測試機上時產(chǎn)生的性能影響,使得測試數(shù)據(jù)更加接近真實水平。

tcpcopy1.0架構(gòu)圖

2?下載

下載tcpcopy及intercept:

https://github.com/wangbin579/tcpcopy

https://github.com/session-replay-tools/intercept


3?在線流量復(fù)制配置方法

說明:

假定我們現(xiàn)在有3臺機器:

線上服務(wù)器:172.16.1.23

輔助服務(wù)器:172.16.1.24

測試服務(wù)器:172.16.1.25

若我們現(xiàn)在想將線上服務(wù)器172.16.1.23 80端口的流量導(dǎo)入到測試服務(wù)器172.16.1.25,我們需要按照下述流程進(jìn)行操作。


3.1?線上服務(wù)器(流量源)部署tcpcopy

解壓并安裝:

#tar xf tcpcopy-1.0.0.tar.gz

#cd tcpcopy

#./configure

#make && make install

執(zhí)行下述命令若能顯示版本號則表示安裝成功:

#/usr/local/tcpcopy/sbin/tcpcopy -v

tcpcopy version:1.0.0

啟動腳本范例:

#/usr/local/tcpcopy/sbin/tcpcopy -x 80-172.16.1.25:80 -s 172.16.1.24 -c 172.16.100.x -d -C 4 -l /var/log/tcpcopy.log

說明:

將80端口收到的流量復(fù)制到測試機ip 172.16.1.25的80端口,并設(shè)置輔助機的ip地址為172.16.1.24,且將復(fù)制過去的流量中的源地址統(tǒng)一更改為172.16.100.x,這樣做的好處是我們在測試機上可以直接針對整個更改后的網(wǎng)段設(shè)置一條路由即可。


3.2?輔助服務(wù)器(截獲返回數(shù)據(jù))部署intercept

解壓并安裝:

#tar xf intercept-1.0.0.tar.gz

#cd intercept

#./configure

#make && make install

執(zhí)行下述命令若能顯示版本號則表示安裝成功:

#/usr/local/intercept/sbin/intercept -v

intercept version:1.0.0

啟動腳本范例:

#/usr/local/intercept/sbin/intercept -i em2 -l /var/log/intercept.log -F 'tcp and src port 80' -d

說明:

輔助機的 intercept 通過-F 參數(shù)制定捕獲規(guī)則,捕獲tcp連接中源端口為80的所有數(shù)據(jù),也即是測試機的回應(yīng)數(shù)據(jù)。其作用是將測試機路由過來的響應(yīng)數(shù)據(jù)捕獲下來,完成整個請求回應(yīng)的流程且保證測試機產(chǎn)生的回應(yīng)數(shù)據(jù)不會流向線上環(huán)境。

intercept 會監(jiān)聽 tcp 36524 端口,并和線上機172.16.1.23的 tcpcopy 之間建立通信,我們通過ss命令可以觀察到。

需要注意的是輔助機和測試機一定要是同一網(wǎng)段


3.3?測試服務(wù)器(需要導(dǎo)流的目標(biāo)機器)配置路由

添加路由配置范例:

route add -net 172.16.100.0 netmask 255.255.255.0 gw 172.16.1.24

說明:

線上機tcpcopy復(fù)制流量時將源地址改寫為172.16.100網(wǎng)段的地址,那么在測試機上看到的流量中源地址全部是來源于這個網(wǎng)段,

我們僅僅需要將返回給這個網(wǎng)段的所有客戶端的請求全部通過輔助機 172.16.1.24 路由出去,這樣在輔助機上就可以對全部的回應(yīng)包進(jìn)行截獲處理了。


4?離線回放部署及配置方法

說明:

整體操作流程也是與在線流量copy一樣的,唯一的區(qū)別是不再是復(fù)制在線的即時流量,而是事先將在線流量錄制為pcap離線文件然后進(jìn)行回放。

注:因為線上不同時間段的用戶量不一樣,用戶行為也是隨時變化的,多次復(fù)制的線上流量肯定是會有所差異的,這樣對服務(wù)器產(chǎn)生的壓力也不一樣。所以在做對比性的測試時推薦使用離線回放的方式,以確保每次測試時的請求及對服務(wù)器產(chǎn)生的壓力是一致的。


4.1?安裝并配置支持離線模式的tcpcopy

網(wǎng)上介紹0.98版本以上的tcpcopy才支持離線回放模式,保險起見推薦下載1.0.0最新版的tcpcopytcpcopy。

需要在configure時加上--offline參數(shù)才能支持離線回放(可執(zhí)行configure --help查看幫助信息)

依次執(zhí)行:

./configure --offline

make&make install


4.2?使用tcpdump錄制pcap離線文件

tcpdump -i eth0 -w online.pcap tcp and port 54322 ???#錄制54322端口的tcp請求,保存到online.pcap文件

參數(shù)說明:

-i eth0:eth0為網(wǎng)卡,獲取方式可在liunx系統(tǒng)下執(zhí)行ifconfig查看所有的網(wǎng)卡,選取需要的那個。

-w online.pcap:保存所錄制請求的pcap文件,以便后續(xù)進(jìn)行回放??稍O(shè)置路徑,e.g.-w /home/user/test.pcaptcp and port 80:截獲端口為80的tcp請求,也可添加udp請求,和更改服務(wù)端口80,e.g. tcp and port 16001

-s 0:默認(rèn)的話,tcpdump只顯示部分?jǐn)?shù)據(jù)包,-s snaplen是控制包長度的,默認(rèn)是68字節(jié),-s 0 則為全部字節(jié),在使用過程中,如果添加-s則回放時會出現(xiàn)錯誤??刹皇褂迷搮?shù)


4.3tcpcopy、intercept、路由配置

假設(shè)有3臺機器:

測試機(被測應(yīng)用所部署的服務(wù)器):10.1.2.196 172.16.1.25

輔助機(三次握手回包):10.1.2.203? 172.16.1.24

流量回放機(回放pcap離線文件):10.1.2.195? 172.16.1.23

輔助機執(zhí)行intercept(捕獲tcp連接中源端口為54322的所有數(shù)據(jù))

/usr/local/intercept/sbin/intercept -i em2 -l /var/log/intercept.log -F 'tcp and src port 54322' -d

流量回放機執(zhí)行tcpcopy(將流量復(fù)制到測試機的54322端口,指定事先錄制好的online.pcap文件):

/usr/local/tcpcopy/sbin/tcpcopy -l /var/log/tcpcopy.log -x 54322-172.16.1.25:54322 -s 172.16.1.24 -c 172.16.1.x -i ./online.pcap

測試機配置路由(將返回給172.16.1網(wǎng)段的所有客戶端的請求通過輔助機路由出去,以便輔助機對回包截獲處理):

route add -net 172.16.1.0 netmask 255.255.255.0 gw 172.16.1.24

回放流量時可以通過 tcpdump -n port 54322的方式抓包測試,亦可觀察測試服務(wù)的日志確認(rèn)是否有請求進(jìn)來,至此流量回放完成。


4.4簡化配置及操作方法

以上操作使用的是傳統(tǒng)的部署模式,需要占用3臺機器。若測試機不足時,也可以簡化部署,將intercept直接部署在測試機上(可以省去配置route的操作),如:

測試機執(zhí)行intercept

/usr/local/intercept/sbin/intercept -i eth1 -l /var/log/intercept.log -F 'tcp and src port 54322' -d

流量回放機執(zhí)行tcpcopy(需要通過-c參數(shù)將訪問測試機的客戶端ip地址改寫為不存在或無法訪問的地址,總之不能讓響應(yīng)包回到真正的客戶端,否則會干擾測試的進(jìn)行):

/usr/local/tcpcopy/sbin/tcpcopy -l /var/log/tcpcopy.log -x 54322-172.16.1.25:54322 -s 172.16.1.25 -c 172.16.88.88 -i ./online.pcap


補充說明

開啟tcpcopy或intercept后最好ps一下相關(guān)進(jìn)程,以便確認(rèn)啟動成功。若未啟動成功可以查看/var/log/tcpcopy.log(通過啟動參數(shù)l自行指定)中的報錯詳情。

若要關(guān)閉服務(wù),則直接kill掉tcpcopy或intercept中的一個進(jìn)程即可,kill掉其中一個進(jìn)程另一個進(jìn)程會自動終止。


常見錯誤解決

1.執(zhí)行./configure時報錯:checking for pcap.h … not found

解決辦法:yum install libpcap libpcap-devel(需要用到pcap庫頭文件)

2.運行TCPCopy命令時日志報錯:[error] Can not connect to remote server(10.16.6.62:36524) (Connection refused)

解決辦法:首先看看intercept是否已啟動。如果已啟動成功,看看是否輔助服務(wù)器的36524端口不能訪問到,沒有開通這個端口的權(quán)限。在iptable中加上對這個端口的訪問(在運行TCPCOPY程序時,會去連輔助機的這個端口,這個端口是由intercept程序監(jiān)聽)

參考資料

https://github.com/wangbin579/tcpcopy

https://mfcheer.github.io/2017/02/28/tcpcopy工具分享/

http://ju.outofmemory.cn/entry/106907

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容