流量复制TCPCopy

基于TCPCopy的仿真压测方案
一、TCPCopy简介
TCPCopy 是一种请求复制(复制基于 tcp 的 packets)工具 ,通过复制在线数据包,修改 TCP/IP 头部信息,发送给测试服务器,达到欺骗测试服务器的TCP 程序的目的,从而为欺骗上层应用打下坚实基础。一般会与 TCPDump 共同使用。
tcpcopy 是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信心。
tcpcopy 的优势在于其实时性及真实性,除了少量的丢包,完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。
二、使用情景
- 分布式压力测试:利用tcpcopy复制或放大生产流量,以触发验证高并发大流量场景下的bug
- 稳定性测试:利用tcpcopy复制或放大生产流量,验证系统服务稳定性
- 回归测试:利用tcpcopy复制生产流量,复现bug问题
- 性能比较:利用tcpcopy复制或放大生产流量,验证新版本性能是否达标
三、原理

TCPCopy 分为三个角色:
- Online Server(OS):上面要部署 TCPCopy,从数据链路层(pcap 接口)抓请求数据包,发包是从IP层发出去;
- Test Server(TS):TS 设置路由信息,把被测应用的需要被捕获的响应数据包信息路由到 AS;
- Assistant Server(AS):这是一台独立的辅助服务器,原则上一定要用同网段的一台闲置服务器来充当辅助服务器。AS 在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的 OS 上的 tcpcopy 进程。
数据传输流程图

工作原理:
- TCPcopy 从数据链路层 copy 端口请求,然后更改目的 ip 和目的端口。
- 将修改过的数据包传送给数据链路层,并且保持 tcp 连接请求。
- 通过数据链路层从 online server 发送到 test server。
- 在数据链路层解封装后到达 nginx 响应的服务端口。
- 等用户请求的数据返回结果后,回包走数据链路层。
- 通过数据链路层将返回的结果从 test server 发送到 assistant server。注:test server 只有一条默认路由指向 assistant server。
- 数据到达 assistant server 后被 intercept 进程截获。
- 过滤相关信息将请求状态发送给 online server 的 tcpcopy,关闭 tcp 连接。
四、在线流量复制回放
所需环境:线上机器平台----辅助服务器----测试机器平台如机器资源有限,可将辅助服务器和测试机器归属于同一台或同一组机器
有3台机器:
线上服务器:192.168.240.134 辅助服务器:192.168.240.132 测试服务器:192.168.240.129
1. 安装
a. 线上环境安装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
b. 辅助机器安装intercept
Centos6安装libpcap-devel失败可以改成Centos7源。
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
2. 配置
a. 辅助服务器启动intercept
辅助服务器要确保没有开启路由模式 cat /proc/sys/net/ipv4/ip_forward,为0表示没有开启。
辅助服务器上的 intercept 进程通过 pcap 抓取测试机应用程序的响应包,将头部抽取后发送给 Online Server 上的 tcpcopy 进程,从而完成一次请求的复制
/opt/tcpcopy/sbin/intercept -i 网卡名 -F 'tcp and src port 应用端口' -d
/opt/tcpcopy/sbin/intercept -i ens160 -l /var/log/intercept.log -F 'tcp and src port 80' -d
参数详解:
-
- -i, intercept会监听端口,和tcpcopy进行通信,-i就是指定监听在哪个端口。tcpcopy启动的时候会来连这个端口,如果连不上,就会启动失败。-i 参数,还可以为any,表示所有网卡
- -F, 过滤规则,语法和pcap一样。
- -d, 已守护进程方式运行
/opt/tcpcopy/sbin/tcpcopy -x 应用端口-测试服务器ip:测试服务器应用端口 -s 辅助服务器ip -c 数据包原地址 -n 2 -d
/opt/tcpcopy/sbin/tcpcopy -x 80-192.168.0.246:80 -s 192.168.0.247 -d
/opt/tcpcopy/sbin/tcpcopy -x 80-192.168.0.246:80 -s 192.168.0.247 -c 192.168.100.254 -d -C 4 -l /var/log/tcpcopy.log
参数详解:
-
- -x, 是指本机80端口的流量copy到测试服务器的80端口
- -s, 指定intercept机器的地址,tcpcopy要和intercept建立连接
- -c 伪装地址,在把流量复制到测试服务器的时候,修改数据包的源地址(建议为测试服务器同网段地址),这样方便指定路由。也可以写成192.168.2.x,这样源地址就是指定网段中的地址了。
- -n 流量放大倍数,如果不是压测目的就不用指定这个参数。
- -d 以守护模式运行。
- -c 将复制过去的流量中的源地址统一更改为192.168.100.x,这样做的好处是我们在测试机上可以直接针对整个更改后的网段设置一条路由即可。
- -C 指定tcpcopy 和intercept 之间的连接数量,默认为2 条连接供响应包的返回和路由信息的传递,最高16条。在高压情况下,加大此参数,可以提高吞吐量,但整体性能会有一定程度的下降。
- -l 设置错误日志文件的路径
c. Test Server上的响应包路由
需要在 Test Server 上添加静态路由,确保被测试应用程序的响应包路由到辅助测试服务器,而不是回包给 Online Server。
注:辅助服务器和测试服务器需要在一个子网下
route add -net 测试服务器所在网段 gw Assistant Server
route add -net 192.168.100.0 netmask 255.255.255.0 gw 192.168.0.247
此命令的意思是把发往整个子网地址的数据包全部转给辅助服务器(辅助服务器还充当黑洞服务器的角色)
- 为保证线上稳定,使用tcpcopy前最好在测试环境多模拟安装使用几次。
- 线上环境使用完tcpcopy后,建议灰度删除,避免不必要的影响
- 辅助服务器还需要扮演一个黑洞角色,所以不能开启ip_forward
- 测试机器和intercept部署到一台机器
- tcpcopy端 -c参数采用tcpcopy所在的线上机器ip地址
- 在线上机器设置iptables黑洞来过滤掉测试服务器的响应包
iptables -I INPUT -p tcp --sport 测试服务的端口 -j DROP -s 测试服务所在机器的ip地址 - 千万要注意在测试服务器不要设置路由了,否则会受到干扰
说明:整体操作流程是与在线流量copy一样的,唯一的区别是不再是复制在线的即时流量,而是事先将在线流量录制为pcap离线文件然后进行回放。
注:因为线上不同时间段的用户量不一样,用户行为也是随时变化的,多次复制的线上流量肯定是会有所差异的,这样对服务器产生的压力也不一样。所以在做对比性的测试时推荐使用离线回放的方式,以确保每次测试时的请求及对服务器产生的压力是一致的。
1. 离线模式的tcpcopy
./configure --offline
make&make install
tcpdump -i ens33 -w online.pcap tcp and port 8888 #录制8888端口的tcp请求,保存到online.pcap文件
3. 配置
测试机(被测应用所部署的服务器):192.168.240.129 辅助机(三次握手回包):192.168.240.132 流量回放机(回放pcap离线文件):192.168.240.134
a. 辅助机执行intercept
捕获tcp连接中源端口为8888的所有数据
/opt/tcpcopy/sbin/intercept -i eth0 -l /var/log/intercept.log -F 'tcp and src port 8888' -d
b. 流量回放机执行tcpcopy
将流量复制到测试机的8888端口,指定事先录制好的online.pcap文件
/opt/tcpcopy/sbin/tcpcopy -l /var/log/tcpcopy.log -x 8888-192.168.240.129:8888 -s 192.168.240.132 -c 192.168.1.254 -i ./online.pcap
c. 测试机配置路由
将返回给192.168.1网段的所有客户端的请求通过辅助机路由出去,以便辅助机对回包截获处理
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.240.132
回放流量时可以通过 tcpdump -n port 8000的方式抓包测试(回放到了测试机上,所以在测试机抓包),亦可观察测试服务的日志确认是否有请求进来,至此流量回放完成。
它可以在各种操作系统上运行,包括Linux、macOS和Windows(通过WinPcap或Npcap)。Tcpdump通过监听网络接口,捕获经过的数据包,并将其显示在终端或保存到文件中,供后续分析使用。
Debian/Ubuntu: sudo apt-get install tcpdump CentOS/RHEL: sudo yum install tcpdump Fedora: sudo dnf install tcpdump
macOS上安装:
brew install tcpdump
windows上安装:
下载并安装WinPcap或Npcap,然后下载Tcpdump的Windows版本并解压到指定目录。
sudo tcpdump
捕获特定网络接口的流量:
sudo tcpdump -i eth0
抓取指定主机的流量:
tcpdump host 192.168.1.1
抓取指定端口的流量:
tcpdump port 80
tcpdump host 192.168.1.1 and port 80
tcpdump not port 80
抓取指定协议的流量:
tcpdump ip or tcp or udp
tcpdump tcp
tcpdump udp
tcpdump icmp
将捕获的数据保存到文件:
tcpdump -i eth0 -w output.pcap
从文件读取并解析数据:
sudo tcpdump -r output.pcap
-
- 源地址:
src或src host - 目标地址:
dst或dst host
- 源地址:
sudo tcpdump src 192.168.1.1 sudo tcpdump dst 192.168.1.1
捕获指定数量的数据包后停止:
tcpdump -c 100
捕获并统计特定协议的数据包:
tcpdump -c 100 tcp
tcpdump -eth0 -w test.pcap tcp and port 80 -c 100 sudo tcpdump -i eth0 tcp port 443 and host www.example.com-捕获eth0接口上与www.example.com有关的HTTPS流量
浙公网安备 33010602011771号