如何使用tcpcopy离线回放TCP流量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用tcpcopy离线回放TCP流量相关的知识,希望对你有一定的参考价值。

参考技术A 网络方面常常有很多奇特的bug,总是上线后才会触发,线下的各种压力工具都没办法模拟出来。如果能把线上的流量复制到线下测试环境里使用,测试时可以覆盖更多潜在问题点,追查问题时又能完全不影响线上服务,该多好……tcpcopy来做这个事情正好,而且新版的tcpcopy使用起来更简单~~

总体来说,是把线上流量或保存的离线pcap包里的报文,变换源/目标地址后发给被测试机,被测试机上的服务回复这些报文,默认路由或者匹配修改后源地址的包的路由,全部指向辅助机,辅助机根据报文类型和TCP协议规范,回复相应的报文给被测试机;这样,从被测试机看,自己收到了网络请求并正常回复,完成了C/S的交互处理。
以下是官网原理图:

使用tcpdump工具,可以很方便的抓取和保存流量到pcap文件,如下:

(1)在回放机上,安装tcpcopy

(2)在辅助机上,安装intercept

(0)环境说明
注意:辅助机和测试机要在同一个网段哦~~以便测试机默认网关指向辅助机
测试机:12.21.219.22
测试机上的服务地址:12.21.219.22:8080
辅助机:12.21.219.24
回放机:12.21.219.23

(1)在辅助机上,启动intercept

(2)在回放机上,启动tcpcopy

(3)在测试机上,配置默认路由为辅助机,以保证所有回复回放流量的报文都打到辅助机上,例如:

(4)如果服务器上带iptables过滤规则,记得打开哦,比如辅助机上,我要允许回放机连接36524端口,可以如下配置

(1)优点

tcpcopy git地址: https://github.com/session-replay-tools/tcpcopy
intercept git地址: https://github.com/session-replay-tools/intercept

tcpcopy复制线上流量

简介

TCPCOPY 是一个 tcp 流量的实时复制工具,其1.0版本由网易工程师 @tcpcopy 开发和维护。一般用来将生产环境的线上流量实时复制到测试环境进行测试。例如新系统上线前,如果我们希望进行一些基本的压力测试,那么我们可以直接利用 tcpcopy 来复制线上的流量过来对系统进行测试,这样的好处是测试数据接近真实水平,且实施起来相对简单。下面我们将通过一个真实的使用案例,来简单介绍 tcpcopy 的基本使用方法。我们假定读者对 tcp 以及路由相关基本知识有一定了解。

 

搭建流程

接下来我们将尝试先叙述完整个实验步骤,然后才是对实验步骤中涉及到的点进行阐述。测试中用到的3台服务器信息如下:

线上服务器 online server     ip地址  182.118.7.40

测试服务器 test server        ip地址  182.118.7.56

辅助服务器 auxiliary server   ip地址  182.118.7.63

我们的目的是把online server上的流量复制到test server,大体结构如下:

 

 

 

 



从整个操作过程可以看出,基本的 tcpcopy 使用方法只需简单的三步:在线上机器运行 tcpcopy 复制流量,在辅助机上运行 intercept 捕获响应数据,最后仅需要在测试机上设置一条路由即可。


第一步

在 online server 182.118.7.40 上安装并运行 tcpcopy daemon :

我们从github上下载1.0版本的源码包;

wget https://github.com/session-replay-tools/tcpcopy/archive/1.0.0.tar.gz -O tcpcopy-1.0.0.tar.gz

安装依赖包;

yum -y install libpcap-devel

解压编译和安装;

tar xf tcpcopy-1.0.0.tar.gz

cd tcpcopy-1.0.0

./configure  --pcap-capture          默认是raw_socket抓包方式,可以根据实际情况修改

make && make install

最后运行 tcpcopy;

tcpcopy -x 80-182.118.7.56:80 -s 182.118.7.63 -c 192.168.1.100 -d  -l tcpcopy.log  -P /var/run/tcpcopy.pid

注意:日志和pid路径可选,配置成功后建议关掉日志,以免写满磁盘导致程序阻塞

 

命令概述

将线上80端口收到的流量复制到测试机ip 182.118.7.56 的80端口,并设置辅助机的ip地址为182.118.7.63,且将复制过去的流量中的源地址统一更改为192.168.1.100,这样做的好处是我们在测试机上可以直接针对整个更改后的网段设置一条路由即可。

 

 

注意

请求线上服务器的客户端IP来自不同的网段,为了不把回应包再返回给客户端,所以在这里要把源IP修改为 192.168.1.100,好让 tcpcopy 来捕获辅助机的回应


第二步

在 auxiliary server 182.118.7.63 上安装并运行 intercept daemon :

从github上下载1.0版本的源码包;

wget https://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gz -O intercept-1.0.0.tar.gz

安装依赖包;

yum -y install libpcap-devel

解压编译和安装;

tar xf intercept-1.0.0.tar.gz

cd intercept-1.0.0

./configure --pcap-capture           默认是raw_socket抓包方式,可以根据实际情况修改

make && make install

最后运行 intercept;

intercept -i eth0 -l intercept.log -P /var/run/intercept.pid -F ‘tcp and src port 80‘ -d

注意:日志和pid路径可选,配置成功后建议关掉日志,以免写满磁盘导致程序阻塞

 

成功运行后可以观察到的网路连接状态:

[[email protected] ~]# route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref            Use Iface

0.0.0.0         192.168.1.1     0.0.0.0             UG    100    0        0            enp0s3

192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0            enp0s3

192.168.8.0     0.0.0.0         255.255.255.0   U     100    0        0            enp0s3

命令概述

辅助机的 intercept 通过-F 参数制定捕获规则,捕获tcp连接中源端口为80的所有数据,也即是测试机的回应数据。其作用是将测试机路由过来的响应包捕获下来,完成整个请求回应的流程且保证测试机产生的回应数据不会流向线上环境。intercept 会监听 tcp 36524 端口,并和线上机182.118.7.40 的 tcpcopy 之间建立通信,我们通过netstat命令可以观察到。

注意

辅助机和测试机一定要是同一网段


 第三步

在 test server 182.118.7.56 上设置一条路由 :

route add -host 192.168.1.100 netmask 255.255.255.255 gw 182.118.7.63

成功运行测试时可以观察到的网络连接状态:

[[email protected] ~]# route -n

Kernel IP routing table

Destination          Gateway              Genmask                Flags     Metric   Ref    Use Iface

192.168.1.100     182.118.7.63       255.255.255.255    UG       100        0          enp0s3

0.0.0.0         192.168.1.1     0.0.0.0             UG    100    0        0            enp0s3

192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0            enp0s3

192.168.8.0     0.0.0.0         255.255.255.0   U     100    0        0            enp0s3

 

 

命令概述

线上机tcpcopy复制流量时将源地址改写为192.168.1.100网段的地址,那么在测试机上看到的流量中源地址全部是来源于这个地址,我们需要将返回给192.168.1.100这个地址的所有回应包通过这个IP 182.118.7.63 路由出去,这样在辅助机上就可以对回应包进行截获处理了。值得一提的是这种模式是在tcpcopy 1.0版本中对整个架构的一个改进,将原本需要运行在测试机上的intercept移除放到一个独立的辅助机上来,使得测试机需要做的操作少到仅仅是添加一条路由而已,对整个测试机的性能损耗可以忽略,排除了intercept运行在测试机上时产生的性能影响,使得测试数据更加接近真实水平。

注意

Gateway 对应的IP必须是可以访问的,否则路由记录会添加失败

 


 

总结:

     由于不同的主机网络设定不一样,或自身有误操作却没有发现等问题导致测试环境无法正常运行,那么请使用 tcpdump -i any tcp host 192.168.1.100 这个命令来检查请求包、回应包的流向来确认是哪里出了问题。

 

 

以上是关于如何使用tcpcopy离线回放TCP流量的主要内容,如果未能解决你的问题,请参考以下文章

数据包回放工具-tomahawk

(转)真刀真枪压测:基于TCPCopy的仿真压测方案

使用tcpcopy复制线上流量进行测试

使用tcpcopy导入线上流量进行功能和压力测试

原创MySQL Replay线上流量压测工具

tcpcopy 流量复制