部分文章内容为网上转载整合,并在博客中记录,以便查阅,部分原文出处未进行标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

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拷贝一次流量访问的步骤如下:

  1. 一个客户请求到达线上机器;
  2. 拷贝IP层(或者数据链路层)的包到tcpcopy进程;
  3. tcpcopy修改包的目的及源地址,发给目标测试机;
  4. 拷贝的包到达目标测试机;
  5. 目标测试机的应用处理访问,并返回结果给辅助机;
  6. 返回结果在辅助机的数据链路层被截获,drop响应的body,copy返回的ip header;
  7. 辅助机将响应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 -i <device,>
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

posted @ 2020-05-07 19:45  流了个火  阅读(727)  评论(0编辑  收藏  举报
►►►需要气球么?请点击我吧!►►►