作者博客:http://blog.csdn.net/wangbin579/article/details/8950282

配置参考:

http://quentinxxz.iteye.com/blog/2249799

http://blog.csdn.net/zhang_yanan/article/details/25708349

 

软件安装

下面演示的tcpcopyintercepter都是1.0.0版本,直接从github下载即可。

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

 

tcpcopy运行需要intercept的支持,tcpcopy负责抓包和发包工作,而intercept负责截获应答包


tcpcopy压测配置笔记_第1张图片


node1  192.168.2.11      online server    安装tcpcopylibpcap-devel

node2  192.168.2.12      target server 添加路由

node3  192.168.2.130    assistant server 安装intercepterlibpcap-devel

另外找一个当前网段没有主机在用的IP,例如192.168.2.110

 

实验中的node1node2上都跑了nginx,监听在80端口。node1为线上服务器,node2为测试服务器。

 

node2上:

route add -host 192.168.2.110 gw 192.168.2.130

 

# 说明:

# 192.168.2.110 是经复制后测试数据包上填入的源地址。

# 192.168.2.130 assistant server,上面将会运行intercept服务。

# 这条命令作用是 target server对于复制而来的请求(根据源地址判断)的响应,不会返回给请求客户端,而是发往assistant server, assistant server最终丢弃这个数据包(因为assisant server上并没有相关的路由)。

 

 

node3上:

echo 0 > /proc/sys/net/ipv4/ip_forward    # 关闭内核转发功能

 

tar xf intercept-1.0.0.tar.gz

cd intercept-1.0.0

./configure

make -j 4 && make install

cd /usr/local/intercept/sbin

 

./intercept -i eth0 -F 'tcp and src port 80' -d

 

# 其中80target server的端口号。intercept捕获基于TCP应用的响应

# 关闭内核转发,这样的话,target server的那个route过来的数据包就过来了会匹配不到路由,直接被丢弃了。

 

ps aux|grep intercept     可以看到进程启动了

 

 

node1上:

tar xf tcpcopy-1.0.0.tar.gz && cd tcpcopy-1.0.0

./configure

tcpcopy的安装,有如下2种方式:

./configure (默认raw socket方式抓包)

或者./configure --pcap-capture  pcap方式抓包,在某些场景下,丢包率会高于raw socket方式抓包,这时候需要类似pf_ring的支持)

 

make -j 4 && make install

cd /usr/local/tcpcopy/sbin

 

./tcpcopy -x 80-192.168.2.12:80 -s 192.168.2.130  -c 192.168.2.110 -n 10

# 格式:tcpcopy -x localServerPort-targetServerIP:targetServerPort -s [-c ]

# 这样把本机80端口的10倍的数据流量就发到了192.168.2.1280端口去,并且把发过去的数据包伪装成源地址是192.168.2.110这个虚假的IP。并且连接192.168.2.130,告诉intercept将响应数据包发给online server本机

# 如果有多台online server,只要在每台online server上都执行上面的这个tcpcopy命令即可。

 

其中80target server的端口号。

-x 80-192.168.2.12:80 是将从80端口的请求发往 target server

-s 192.168.2.130 为指定assistant server

-c 192.168.2.110 是指将所有复制请求的数据包的源地址全改为 192.168.2.110

-n参数指定复流量的倍数。

 

验证效果:

另找一台主机node4,执行ab -c 100 -n 100000 http://192.168.2.11/index.php

 

然后观察node1node2上面的连接数ss -tan,及系统负载uptime、网络流量dstat

ss -tan|awk 'NR>1 {++s[$1]} END {for (k in s) print k,s[k]}'

 

另外,可以在node1或者node2上抓包:

tcpdump -i eth0 -nn port 80 and host 192.168.2.110

 

node3上抓包:

tcpdump -i eth0 -nn host 192.168.2.130

这些方式都可以很直观的看到数据包的流向。

 

 

停止流量复制

assistant server kill intercept进程,在online server kill tcpcopy进程,在target server上删除相应的route

 

其他注意点:参照作者的CSDN博客即可。