tcpcopy笔记-使用tcpcopy进行流量复制
参考资料:
https://www.jianshu.com/p/e34086c47493
https://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html
https://www.cnblogs.com/phennry/p/6382755.html?utm_source=itdadao&utm_medium=referral
在服务迭代的过程中经常会对部分逻辑进行修改。为了服务正确性,避免上线后才发现错误,需要用线上真实流量来对新的服务进行测试。因此需要一种对线上服务影响尽可能小的工具来对流量进行拷贝。
常用的几种流量拷贝工具:
goreplay: https://github.com/buger/goreplay
tcpreplay: https://github.com/appneta/tcpreplay
tcpcopy: https://github.com/session-replay-tools/tcpcopy
选择tcpcopy的原因:支持TCP包复制、免费(goreplay的pro版支持tcp,每年980刀)、开源项目维护好
tcpcopy架构图
tcpcopy拷贝一次流量访问的步骤如下:
- 一个客户请求到达线上机器;
- 拷贝IP层(或者数据链路层)的包到tcpcopy进程;
- tcpcopy修改包的目的及源地址,发给目标测试机;
- 拷贝的包到达目标测试机;
- 目标测试机的应用处理访问,并返回结果给辅助机;
- 返回结果在辅助机的数据链路层被截获,drop响应的body,copy返回的ip header;
- 辅助机将响应header发送给线上机器的tcpcopy进程。
eg:
测试服务器IP:10.1.2.3
辅助服务器IP:10.1.2.4
线上服务器IP:9.9.8.7
安装
1、线上服务器安装tcpcopy
在线上服务器上下载,然后编译安装tcpcopy的包,如下:
# wget https://github.com/session-replay-tools/tcpcopy/archive/1.0.0.tar.gz
# tar xvf 1.0.0.tar.gz
# cd tcpcopy-1.0.0
# ./configure --prefix=/opt/tcpcopy/
# make
# make install
2、辅助服务器安装intercept
安装intercept有一些额外的依赖需要安装上,然后和tcpcopy一样的套路源码编译安装。
# yum -y install libpcap-devel
# wget https://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gz
# tar xvf 1.0.0.tar.gz
# cd intercept-1.0.0
# ./configure --prefix=/opt/tcpcopy/
# make
# make install
注:也可以先编译,再把/opt/tcpcopy/传到指定服务器
实时复制流量
1、测试服务器(10.1.2.3)配置路由 ,将响应包路由到辅助机
route add -net 10.1.2.0 netmask 255.255.255.192 gw 10.1.2.4
gw对应辅助服务器ip
2、辅助服务器(10.1.2.4)捕获目标机器发来的响应包
./intercept -F
eg /opt/tcpcopy/sbin/intercept -i eth1 -F tcp and src port 18001 -d
捕获网卡 eth1 ,源端口18001 基于tcp的包
3、线上服务器(9.9.8.7)捕获包,并修改客户端地址,并把包发送给目标机器,等待辅助服务器发送响应包
./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server,> [-c <ip range,>]
例子:
/opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -n 2 -d -c 10.1.2.x
/opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -c 10.1.2.x -d #全流量复制
/opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -c 10.1.2.x -r 20 -d #复制20%的流量
/opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -c 10.1.2.x -n 2 -d #复制2倍流量
线上服务器和测试服务器启动服务:
python -m SimpleHTTPServer 18001
找台机器执行,假设ip为100.10.10.10:
curl 9.9.8.7:18001
后,线上服务器日志
100.10.10.10 - - [07/May/2020 19:37:27] "GET / HTTP/1.1" 200 -
测试服务器日志
10.1.2.1 - - [07/May/2020 19:37:18] "GET / HTTP/1.1" 200 -
可能存在的问题:
Q&A
Q: 测试机收不到请求,辅助服务器打印 [notice] fd is null after session is created
A: 在线上服务器启动时,-c参数用-c 192.18.1.x
即 /opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -n 2 -d -c 10.1.2.3.x