作者博客:http://blog.csdn.net/wangbin579/article/details/8950282
配置参考:
http://quentinxxz.iteye.com/blog/2249799
http://blog.csdn.net/zhang_yanan/article/details/25708349
软件安装
下面演示的tcpcopy和intercepter都是1.0.0版本,直接从github下载即可。
https://github.com/session-replay-tools/tcpcopy
tcpcopy运行需要intercept的支持,tcpcopy负责抓包和发包工作,而intercept负责截获应答包
node1 192.168.2.11 online server 安装tcpcopy、libpcap-devel
node2 192.168.2.12 target server 添加路由
node3 192.168.2.130 assistant server 安装intercepter、libpcap-devel
另外找一个当前网段没有主机在用的IP,例如192.168.2.110
实验中的node1、node2上都跑了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
# 其中80是target 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
# 这样把本机80端口的10倍的数据流量就发到了192.168.2.12的80端口去,并且把发过去的数据包伪装成源地址是192.168.2.110这个虚假的IP。并且连接192.168.2.130,告诉intercept将响应数据包发给online server本机。
# 如果有多台online server,只要在每台online server上都执行上面的这个tcpcopy命令即可。
其中80是target 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
然后观察node1、node2上面的连接数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博客即可。