利用tcpburn进行长连接压测、现网流量压测

利用tcpburn进行长连接压测、现网流量压测

  1. 安装tcpcopy(主要是使用其intercept)或者是intercept
  2. 配置
    配置是成功的关键,注意所有用来部署intercept、tcpburn、目标服务都必须在同一个网段
    0)目标服务:待测试的服务部署 这里假定端口是16001 ip:a.b.c.234
    添加路由规则主要是将待测试服务的应答包正确的路由到intercept服务,由intercept服务转发到tcpburn,完整整个过程。

    add -net 62.135.0.0 netmask 255.255.0.0 gw a.b.c.123 ```
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
          注意这里的net 62.135.0.0 需要与intercept -F中配置的项对应(如果要配置的话)。  
    gw 这里填的是intercept 的ip。
    如果想要删除路由规则用下面的将上面的add 换成del 即可其他的不变
    ```route del -net 62.135.0.0 netmask 255.255.0.0 gw a.b.c.123 ```
    1)首先我们需要一台server a.b.c.123来部署intercept,启动端口默认是36524启动命令比简单:
    ```intercept -i eth1 -F "src port 16001 and net 62.135.250.0/24" -d```
    注意这里的-F 中的条件是用来过滤目标服务器回报那些需要转发给tcpburn。
    比如目标服务器待测试的端口是`16001`,那么`src port 16001 `就是从源端口是16001发出的数据包。
    net 表示网段是`62.135.250.0/24`的,这里需要跟tcpburn中`-c`参数中指定的相匹配。
    2)部署tcpburn:可以跟intercept部署在一台server上:a.b.c.123
    启动命令:
    ```./tcpburn -x 16001-a.b.c.234:16001 -f 16001_online_test.cap -s a.b.c.123 -p 36524 -u 100 -c 62.135.250.x ```
    `注意需要优先启动intercept,否则会链接失败`
    这里需要注意的几个地方:
    16001-a.b.c.234:16001 前面的16001是生成16001_online_test.cap 抓包使用的端口后面的ip端口是目标测试服务的ip和端口。
    -s 指定intercept 的ip
    -p指定intercept的端口
    -u是模拟多少客户端
    -c是客户端的网段,这里的网段必须与intercept中过滤条件、目标服务器上添加的net相对应。
    由于tcpburn是基于流量回放的模式所以需要事前抓一个数据包 16001_online_test.cap是通过tcpdump抓包的数据,用来发送到目标测试服务的。
    ```tcpdump -s 0 port 16001 -i any -w 16001_online_test.cap -c 20000 ```
    ``` shell
    ./tcpburn -x historyServerPort-targetServerIP:targetServerPort -f <pcapfile,> -s <intercept address> -u <user num> -c <ip range,>

    如果是想测试支持长连接的,那么编译tcpburn时configure带上参数--comet,再也不用担心编写接入层服务时200万长连接由于机器限制端口范围(1024-65535)而各种nat、虚拟网卡、虚拟ip、服务启动多个端口、客户端起多个进程等等这些繁琐的事情了

    附录:

    安装方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    sudo apt-get install libpcap libpcap-devel

    cd `pwd`/tcpcopy-0.9.9
    make clean
    sh autogen.sh
    ./configure --enable-single --enable-pcap --enable-advanced
    make
    make install

    cd `pwd`/tcpburn
    make clean
    #./configure --single #支持--single模式
    ./configure --single --comet #支持comet 模式即长连接模式
    make
    make install

简单的自动配置脚本生成工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#intercept server
intercept_server=a.b.c.123
intercept_port=36524
#our test service
target_server=a.b.c.234
target_port=16001
tcpdump_port=16001

#generate by tcpdump -s 0 port 80(your port) -i any -w 80.cap
cap_file=$tcpdump_port.cap
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:
# 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:
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

#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 10.110.10.161 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 10.110.10.161
# -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 100 -c $client_net_range
echo "tcpburn log on /usr/local/tcpburn/logs"

tcpburn
tcpburn案例

坚持原创技术分享,您的支持奖鼓励我继续创作!