基於Tcpburn 引流現網流量到測試環境進行測試

使用場景

我們開發完程序之後有時候,單單靠測試用例是無法模擬現網用戶的真實場景的請求,或者數據量、用例不夠完備。那麼我們可以通過引流現網用戶真實的流量過來進行測試驗證。為了不影響真實用戶,我們可以藉助tcpburn 工具,通過在現網機器上使用tcpdump抓包得到一個cap包,然後使用tcpburn工具將cap包中的請求進行重放這個也是有別於tcpcopy 的地方,tcpcopy是現網流量的實時copy。各有優缺點大家看各自的需求選擇即可。

原理

基於Tcpburn 引流現網流量到測試環境進行測試

Fig 摘自 TcpBurn github 項目

安裝

yum install libpcap libpcap-devel
cd tcpcopy-0.9.9
make clean
sh autogen.sh
./configure --enable-single --enable-pcap --enable-advanced
make
make install
cd ../tcpburn
make clean
#./configure --single
./configure --single --comet
make
make install

配置:

tcpburn 按照如下配置intercept 服務可以和tcpburn部署在同一臺機器上,另外需要注意的是目標服務與tcpburn、intercept必須在同一個網段。

start.sh 只需要將對應的端口、cap文件名修改成自己的即可

killall intercept
killall intercept
rm ./logs/*.log*
sleep 2
#intercept server
#----------------------用戶需要修改部分-------------------
#回包轉發服務ip地址,根據自身情況設定即可
intercept_server=11.aa.xx.80
intercept_port=36524
#我們待測試的服務ip,test service
target_server=11.aa.xx.79 #根據自身情況修改成自己的服務即可
target_port=14000 #目標測試程序端口,根據自身情況改成自己的

tcpdump_port=14000 #tcpdump 抓包是現網業務的端口,根據自身情況設定即可
#generate by tcpdump -s 0 port 80(your port) -i any -w 80.cap
cap_file=client_access_2.0.cap #tcpdump 抓包的文件,根據自身情況設定即可
client_num=100
#------------------------------------------------------
client_net_range=62.135.250.x
route_net=`echo $client_net_range|awk -F'.' '{print $1"."$2".0.0"}'`
intercept_filter_net=`echo $client_net_range|awk -F'.' '{print $1"."$2"."$3".0"}'`
echo "###################################################################################"
echo "#intercept install on $intercept_server"
echo "#target_server install on $intercept_server ,such as(client_access\\setlogic)"
echo "#run this command on $target_server"
echo "# route add -net $route_net netmask 255.255.0.0 gw $intercept_server"
echo "# for delete runing:"
echo "# route del -net $route_net netmask 255.255.0.0 gw $intercept_server"
echo "#use tcpdump to capture packet on realserver,eg:"
echo "# tcpdump -s 0 port $tcpdump_port -i any -w $cap_file"
echo "#"
echo "# use this command to run tcpburn:"
echo "#./tcpburn/objs/tcpburn -x $tcpdump_port-$target_server:$target_port -f $cap_file -s $intercept_server -p $intercept_port -u 100 -c $client_net_range"
echo "###################################################################################"
#1. set route on target server
#eg:
#Assume 65.135.233.161 is the IP address of the assistant server. We set the following
# route commands to route all responses to the 62.135.200.x's clients to the assistant
# server.
#add:
# route add -net 62.135.200.0 netmask 255.255.255.0 gw 65.135.233.161
#delete:
# route -net 62.135.200.0 netmask 255.255.255.0 gw 65.135.233.161
#run this on targe sever:such as on execute:
# add route to intercept server(11.aa.xx.79)
# net 62.135.0.0 must match the client ips at tcpburn option -c here is "62.135.250.x"
# route add -net `echo $client_net_range|awk -F'.' '{print $1"."$2".0.0"}' netmask 255.255.0.0 gw $intercept_server
#2.start intercept
#"src port 80" is match with tcpdump capture
#eg:
#intercept -i eth1 -F "src port 80 and net 62.135.250.0/24" -b 11.aa.xx.79 -d
#intercept -i eth1 -F "src port 80 " -b 11.aa.xx.79 -d
echo intercept -i eth1 -F \\"src port $target_port and net $intercept_filter_net/24\\" -d
#intercept -i eth1 -F "src port $target_port and net $intercept_filter_net/24" -d
intercept -i eth1 -F "src port $target_port and net $intercept_filter_net/24" -d
#3. start tcpburn to send request to target server throught intercept
#eg:
#Assume 65.135.233.160 is the IP address of the target server and 11.aa.xx.79 is the
#internal IP address of the assistant server and 65.135.233.161 is the external IP
#address of the assistant server.

# ./tcpburn -x 80-65.135.233.160:80 -f /path/to/80.pcap -s 11.aa.xx.79
# -u 10000 -c 62.135.200.x
sleep 5
netstat -anp|grep $intercept_port
#file $cap_file is tcpdump: tcpdump -s 0 dst port $tcpdump_port -i any -c 1000000 -w $cap_file
echo ./tcpburn/objs/tcpburn -x $tcpdump_port-$target_server:$target_port -f $cap_file -s $intercept_server -p $intercept_port -u $client_num -c $client_net_range
echo "tcpburn log on /usr/local/tcpburn/logs"
./tcpburn/objs/tcpburn -x $tcpdump_port-$target_server:$target_port -f $cap_file -s $intercept_server -p $intercept_port -u $client_num -c $client_net_range


分享到:


相關文章: