TCPCopy的官方仓库https://github.com/session-replay-tools/tcpcopy.git,这货的官方文档是全英文的,不知道为什么,读起来特别有难度。
由于TCPCopy改版,网上的很多资料都不适用于最新版的TCPCopy,当前的最新版是V1.0.0,本文档也是基于该版本。
TCPCopy是用来做TCP重放的,常用的场景是把线上流量复制到测试环境,用来排查线下不容易重现的问题,或者对测试环境做压力测试。
TCPCopy分为两部分,tcpcopy和intercept,很多文档都不会告诉你什么是intercept。以把线上服务器流量复制到线下的场景为例,tcpcopy运行在线上服务器,intercept并不是运行在用来测试的服务器上,而是运行在一台辅助的服务器上。后面会告诉你这台服务器的作用。到这里,你发现似乎没有测试服务器的什么事,那是因为,测试服务器真的不需要做什么配置,只需要起一个测试程序,指一条路由就可以了。科普就到这里,后面是部署环节。
在我的这个配置环境有三台服务器,一台模拟线上服务器,一台作为测试服务器,还有一台作为辅助服务器。流程如下:
在线上服务器上下载,然后编译安装tcpcopy的包,如下:
1 2 3 4 5 6 | 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 |
安装intercept有一些额外的依赖需要安装上,然后和tcpcopy一样的套路源码编译安装。
1 2 3 4 5 6 7 | # yum -y install libpcap-devel # 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 |
安装过程到此结束,很Easy吧!
为了简单期间,我们在线上和测试服务器上各启一个简单的http服务器,最简单的办法,不用apache和nginx,直接用python自带的模块。HTTP服务启动命令如下:
1 | # python -m SimpleHTTPServer |
在线上服务器和测试服务器同时运行这个命令,开启一个监听在8000端口的简易HTTP服务器。
先在辅助服务器上开启intercept,步骤不能错,没有intercept的话,tcpcopy启动不起来:
1 | # /opt/tcpcopy/sbin/intercept -i eth0 -F 'tcp and src port 8000' -d |
还有其它参数可以使用,-h便可以查看,不详细解释了。
然后,在线上服务器开启tcpcopy:
1 | # /opt/tcpcopy/sbin/tcpcopy -x 8000-192.168.124.68:8000 -s 192.168.124.180 -c 192.168.2.254 -n 2 -d |
最后,在测试服务器上开启路由(切记辅助服务器要和测试服务器在一个子网里):
1 | # route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.124.180 |
路由的意思是把发往192.168.2.0/24地址的数据包全部转给辅助服务器。
测试效果
在另外一台机器上,向线上服务器发起请求,然后查看两个HTTP服务器的实时日志,
线上服务器的结果:
发起了两次请求,由于url不存在,返回了404的HTTP Code。再看测试服务器:
在测试服务器上,请求变成了四次,明显看到流量被放大了1倍。效果正如预期。除此之外,还可以看到日志中的客户端IP也不一样。在原始的请求中,解析出来了主机名为Matrix3,而在测试机器上,客户端IP是192.168.2.254,就是我们捏造的IP,注意伪造IP的时候,一定要避免环境中存在的IP和常用的IP。
注意
10 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!