使用场景
我们开发完程序之后有时候,单单靠测试用例是无法模拟现网用户的真实场景的请求,或者数据量、用例不够完备。那么我们可以通过引流现网用户真实的流量过来进行测试验证。为了不影响真实用户,我们可以借助tcpburn 工具,通过在现网机器上使用tcpdump抓包得到一个cap包,然后使用tcpburn工具将cap包中的请求进行重放这个也是有别于tcpcopy 的地方,tcpcopy是现网流量的实时copy。各有优缺点大家看各自的需求选择即可。
原理
安装
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
本文暂时没有评论,来添加一个吧(●'◡'●)