- TCPCopy使用簡介
一域那、 TCPCopy使用簡介
1 概述
tcpcopy是一種請(qǐng)求復(fù)制(所有基于tcp的packets)工具,可以把在線流量導(dǎo)入到測(cè)試系統(tǒng)中去(也可以在測(cè)試系統(tǒng)內(nèi)部放大流量),從而模擬真實(shí)運(yùn)行環(huán)境魁巩,以便排查測(cè)試系統(tǒng)的性能問題和風(fēng)險(xiǎn)卷仑。TCPCopy的優(yōu)勢(shì)在于其實(shí)時(shí)性及真實(shí)性于游,除了少量的丟包,可以完全拷貝線上流量到測(cè)試機(jī)器忧勿,真實(shí)的模擬線上流量的變化規(guī)律杉女。
在tcpcopy 1.0版本中對(duì)整個(gè)架構(gòu)進(jìn)行了改進(jìn),將原本低版本tcpcopy需要運(yùn)行在測(cè)試機(jī)上的intercept移除放到一個(gè)獨(dú)立的輔助機(jī)上來鸳吸,使得測(cè)試機(jī)需要做的操作少到僅僅是添加一條路由而已熏挎,對(duì)整個(gè)測(cè)試機(jī)的性能損耗可以忽略,排除了intercept運(yùn)行在測(cè)試機(jī)上時(shí)產(chǎn)生的性能影響层释,使得測(cè)試數(shù)據(jù)更加接近真實(shí)水平婆瓜。
2 下載工具
下載tcpcopy及intercept:
https://github.com/wangbin579/tcpcopy
https://github.com/session-replay-tools/intercept
3 在線流量復(fù)制配置方法
說明:
假定我們現(xiàn)在有3臺(tái)機(jī)器:
線上服務(wù)器:172.16.1.23
輔助服務(wù)器:172.16.1.24
測(cè)試服務(wù)器:172.16.1.25
若我們現(xiàn)在想將線上服務(wù)器172.16.1.23 80端口的流量導(dǎo)入到測(cè)試服務(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í)行下述命令若能顯示版本號(hào)則表示安裝成功:
#/usr/local/tcpcopy/sbin/tcpcopy -v
tcpcopy version:1.0.0
啟動(dòng)腳本范例:
#/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ù)制到測(cè)試機(jī)ip 172.16.1.25的80端口廉白,并設(shè)置輔助機(jī)的ip地址為172.16.1.24,且將復(fù)制過去的流量中的源地址統(tǒng)一更改為172.16.100.x乖寒,這樣做的好處是我們?cè)跍y(cè)試機(jī)上可以直接針對(duì)整個(gè)更改后的網(wǎng)段設(shè)置一條路由即可猴蹂。
3.2 輔助服務(wù)器(截獲返回?cái)?shù)據(jù))部署intercept
解壓并安裝:
> tar xf intercept-1.0.0.tar.gz
> cd intercept
>./configure
> make && make install
執(zhí)行下述命令若能顯示版本號(hào)則表示安裝成功:
> /usr/local/intercept/sbin/intercept -v
> intercept version:1.0.0
啟動(dòng)腳本范例:
> /usr/local/intercept/sbin/intercept -i em2 -l /var/log/intercept.log -F 'tcp and src port 80' -d
說明:
輔助機(jī)的 intercept 通過-F 參數(shù)制定捕獲規(guī)則疏尿,捕獲tcp連接中源端口為80的所有數(shù)據(jù)切端,也即是測(cè)試機(jī)的回應(yīng)數(shù)據(jù)。其作用是將測(cè)試機(jī)路由過來的響應(yīng)數(shù)據(jù)捕獲下來吵取,完成整個(gè)請(qǐng)求回應(yīng)的流程且保證測(cè)試機(jī)產(chǎn)生的回應(yīng)數(shù)據(jù)不會(huì)流向線上環(huán)境逐虚。
intercept 會(huì)監(jiān)聽 tcp 36524 端口聋溜,并和線上機(jī)172.16.1.23的 tcpcopy 之間建立通信,我們通過ss命令可以觀察到叭爱。
需要注意的是輔助機(jī)和測(cè)試機(jī)一定要是同一網(wǎng)段
3.3 測(cè)試服務(wù)器(需要導(dǎo)流的目標(biāo)機(jī)器)配置路由
添加路由配置范例:
> route add -net 172.16.100.0 netmask 255.255.255.0 gw 172.16.1.24
說明:
線上機(jī)tcpcopy復(fù)制流量時(shí)將源地址改寫為172.16.100網(wǎng)段的地址撮躁,那么在測(cè)試機(jī)上看到的流量中源地址全部是來源于這個(gè)網(wǎng)段,
我們僅僅需要將返回給這個(gè)網(wǎng)段的所有客戶端的請(qǐng)求全部通過輔助機(jī) 172.16.1.24 路由出去买雾,這樣在輔助機(jī)上就可以對(duì)全部的回應(yīng)包進(jìn)行截獲處理了把曼。
4 離線回放部署及配置方法
說明
整體操作流程也是與在線流量copy一樣的,唯一的區(qū)別是不再是復(fù)制在線的即時(shí)流量漓穿,而是事先將在線流量錄制為pcap離線文件然后進(jìn)行回放嗤军。
注:因?yàn)榫€上不同時(shí)間段的用戶量不一樣,用戶行為也是隨時(shí)變化的晃危,多次復(fù)制的線上流量肯定是會(huì)有所差異的叙赚,這樣對(duì)服務(wù)器產(chǎn)生的壓力也不一樣。所以在做對(duì)比性的測(cè)試時(shí)推薦使用離線回放的方式,以確保每次測(cè)試時(shí)的請(qǐng)求及對(duì)服務(wù)器產(chǎn)生的壓力是一致的纠俭。
4.1 安裝并配置支持離線模式的tcpcopy
網(wǎng)上介紹0.98版本以上的tcpcopy才支持離線回放模式沿量,保險(xiǎn)起見推薦下載1.0.0最新版的tcpcopytcpcopy。
需要在configure時(shí)加上--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請(qǐng)求冤荆,保存到online.pcap文件
參數(shù)說明:
-i eth0:eth0為網(wǎng)卡,獲取方式可在liunx系統(tǒng)下執(zhí)行ifconfig查看所有的網(wǎng)卡权纤,選取需要的那個(gè)钓简。
-w online.pcap:保存所錄制請(qǐng)求的pcap文件,以便后續(xù)進(jìn)行回放汹想⊥獾耍可設(shè)置路徑,e.g.-w /home/user/test.pcaptcp and port 80:截獲端口為80的tcp請(qǐng)求古掏,也可添加udp請(qǐng)求损话,和更改服務(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則回放時(shí)會(huì)出現(xiàn)錯(cuò)誤钝计×挡可不使用該參數(shù)
4.3tcpcopy、intercept私恬、路由配置
假設(shè)有3臺(tái)機(jī)器:
測(cè)試機(jī)(被測(cè)應(yīng)用所部署的服務(wù)器):10.1.2.196 172.16.1.25
輔助機(jī)(三次握手回包):10.1.2.203 172.16.1.24
流量回放機(jī)(回放pcap離線文件):10.1.2.195 172.16.1.23
輔助機(jī)執(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
流量回放機(jī)執(zhí)行tcpcopy(將流量復(fù)制到測(cè)試機(jī)的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
測(cè)試機(jī)配置路由(將返回給172.16.1網(wǎng)段的所有客戶端的請(qǐng)求通過輔助機(jī)路由出去,以便輔助機(jī)對(duì)回包截獲處理):
> route add -net 172.16.1.0 netmask 255.255.255.0 gw 172.16.1.24
回放流量時(shí)可以通過 tcpdump -n port 54322的方式抓包測(cè)試本鸣,亦可觀察測(cè)試服務(wù)的日志確認(rèn)是否有請(qǐng)求進(jìn)來疫衩,至此流量回放完成。
4.4簡化配置及操作方法
以上操作使用的是傳統(tǒng)的部署模式永高,需要占用3臺(tái)機(jī)器隧土。若測(cè)試機(jī)不足時(shí),也可以簡化部署命爬,將intercept直接部署在測(cè)試機(jī)上(可以省去配置route的操作)曹傀,如:
測(cè)試機(jī)執(zhí)行intercept:
> /usr/local/intercept/sbin/intercept -i eth1 -l /var/log/intercept.log -F 'tcp and src port 54322' -d
流量回放機(jī)執(zhí)行tcpcopy(需要通過-c參數(shù)將訪問測(cè)試機(jī)的客戶端ip地址改寫為不存在或無法訪問的地址,總之不能讓響應(yīng)包回到真正的客戶端饲宛,否則會(huì)干擾測(cè)試的進(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
補(bǔ)充說明
開啟tcpcopy或intercept后最好ps一下相關(guān)進(jìn)程皆愉,以便確認(rèn)啟動(dòng)成功。若未啟動(dòng)成功可以查看/var/log/tcpcopy.log(通過啟動(dòng)參數(shù)l自行指定)中的報(bào)錯(cuò)詳情。
若要關(guān)閉服務(wù)幕庐,則直接kill掉tcpcopy或intercept中的一個(gè)進(jìn)程即可久锥,kill掉其中一個(gè)進(jìn)程另一個(gè)進(jìn)程會(huì)自動(dòng)終止。
常見錯(cuò)誤解決
1.執(zhí)行./configure時(shí)報(bào)錯(cuò):checking for pcap.h … not found
解決辦法:yum install libpcap libpcap-devel(需要用到pcap庫頭文件)
2.運(yùn)行TCPCopy命令時(shí)日志報(bào)錯(cuò):[error] Can not connect to remote server(10.16.6.62:36524) (Connection refused)
解決辦法:首先看看intercept是否已啟動(dòng)异剥。如果已啟動(dòng)成功瑟由,看看是否輔助服務(wù)器的36524端口不能訪問到,沒有開通這個(gè)端口的權(quán)限冤寿。在iptable中加上對(duì)這個(gè)端口的訪問(在運(yùn)行TCPCOPY程序時(shí)歹苦,會(huì)去連輔助機(jī)的這個(gè)端口,這個(gè)端口是由intercept程序監(jiān)聽)
參考資料
https://github.com/wangbin579/tcpcopy
https://mfcheer.github.io/2017/02/28/tcpcopy工具分享/
http://ju.outofmemory.cn/entry/106907