前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于TCPCopy的仿真压测方案

基于TCPCopy的仿真压测方案

作者头像
py3study
发布2020-02-25 12:25:48
1.2K0
发布2020-02-25 12:25:48
举报
文章被收录于专栏:python3python3

一、tcpcopy工具介绍

tcpcopy 是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信心。

tcpcopy 的优势在于其实时性及真实性,除了少量的丢包,完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。

二、tcpcopy原理

1.png
1.png

TCPCopy 分为三个角色:

  • Online Server(OS):上面要部署 TCPCopy,从数据链路层(pcap 接口)抓请求数据包,发包是从IP层发出去;
  • Test Server(TS):最新的架构调整把 intercept 的工作从 TS 中 offload 出来。TS 设置路由信息,把 被测应用 的需要被捕获的响应数据包信息路由到 AS;
  • Assistant Server(AS):这是一台独立的辅助服务器,原则上一定要用同网段的一台闲置服务器来充当辅助服务器。AS 在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的 OS 上的 tcpcopy 进程。

数据传输流程图

1.png
1.png

简单解释一下工作原理:

  1. TCPcopy 从数据链路层 copy 端口请求,然后更改目的 ip 和目的端口。
  2. 将修改过的数据包传送给数据链路层,并且保持 tcp 连接请求。
  3. 通过数据链路层从 online server 发送到 test server。
  4. 在数据链路层解封装后到达 nginx 响应的服务端口。
  5. 等用户请求的数据返回结果后,回包走数据链路层。
  6. 通过数据链路层将返回的结果从 test server 发送到 assistant server。注:test server 只有一条默认路由指向 assistant server。
  7. 数据到达 assistant server 后被 intercept 进程截获。
  8. 过滤相关信息将请求状态发送给 online server 的 tcpcopy,关闭 tcp 连接。

三、操作步骤

Online Server 上的发包:

OS 默认使用 raw socket output 接口发包,此时发包命令如下:

代码语言:javascript
复制
tcpcopy -x 应用端口-Test Server:Test Server应用端口 -s Assistant Server

例如:

代码语言:javascript
复制
tcpcopy -x 80-192.168.0.246:80 -s 192.168.0.247 -d

此外,新架构还支持通过 pcap_inject(编译时候增加--enable-dlinject)来发包。

Test Server 上的响应包路由:

需要在 Test Server 上添加静态路由,确保被测试应用程序的响应包路由到辅助测试服务器,而不是回包给 Online Server。

代码语言:javascript
复制
route add -net 服务器所在网段 gw Assistant Server

例如:

代码语言:javascript
复制
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.247

Assistant Server 上的捕获响应包:

辅助服务器要确保没有开启路由模式 cat /proc/sys/net/ipv4/ip_forward,为0表示没有开启。 辅助服务器上的 intercept 进程通过 pcap 抓取测试机应用程序的响应包,将头部抽取后发送给 Online Server 上的 tcpcopy 进程,从而完成一次请求的复制。

代码语言:javascript
复制
intercept -i 网卡名 -F 'tcp and src port 应用端口' -d

 例如:

代码语言:javascript
复制
intercept -i ens160 -F 'tcp and src port 80' -d

-i 参数,还可以为any,表示所有网卡

四、tcpcopy搭建

环境说明

角色

ip

端口

Assistant Server

192.168.0.247

Online Server

192.168.0.245

80

Test Server

192.168.0.246

80

拓扑图

1.png
1.png

运行流程

  • tcpcopy运行在线上服务器上,tcpcopy会把线上服务器收到的流量,重放给测试服务器,重放的时候tcpcopy修改了IP数据包的源IP地址(譬如修改源地址为192.168.2.254)。所以,线上服务器和测试服务器应该部署相同的服务。
  • tcpcopy把源IP伪造成192.168.2.254的包发给了测试服务器,如此,测试服务器在处理完tcpcopy发过来的数据以后,会把这些数据包返回给客户端,即伪造的192.168.2.254。
  • 由于没有192.168.2.254这个地址,我们在测试服务器添加一条专门的路由,把发往192.168.2.0/24的数据包,都全部转交给辅助服务器。
  • 为了保证辅助服务器会接受这些本不属于自己的,部署在辅助服务器上的intercept就发挥作用了。辅助服务器还可以用来把客户端的请求返回给tcpcopy,但是默认只返回响应头部给tcpcopy。辅助服务器应该类似于黑洞。

intercept安装

Assistant Server 上的操作:

下载并安装 intercept 服务端;

代码语言:javascript
复制
# 安装编译环境
apt-get install -y build-essential
 
# 安装pcap依赖包
apt-get install -y libpcap-dev
 
# 下载软件包
# github地址: http://github.com/session-replay-tools/intercept
wget https://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gz -o intercept-1.0.0.tar.gz
tar zxvf intercept-1.0.0.tar.gz -C /usr/src
cd /usr/src/intercept-1.0.0
./configure --prefix=/usr/local/intercept-1.0.0
make && make install
 
# 创建软连接
ln -s /usr/local/intercept-1.0.0/sbin/intercept /usr/bin/intercept
 
# 启动程序
intercept -i ens160 -F 'tcp and src port 80' -d

注意:必须先安装 intercept,否则会导致 tcpcopy 启动时,找不到 intercept

tcpcopy安装

Online Server 上的操作:

下载并安装 tcpcopy 客户端

代码语言:javascript
复制
# 安装编译环境
apt-get install -y build-essential
 
# 下载软件包
# github地址: http://github.com/session-replay-tools/tcpcopy
wget https://github.com/session-replay-tools/tcpcopy/archive/v1.1.0.tar.gz -o tcpcopy-1.1.0.tar.gz
tar zxvf tcpcopy-1.1.0.tar.gz -C /usr/src
cd /usr/src/tcpcopy-1.1.0
./configure --sbin-path=/usr/local/sbin
make && make install
 
# 创建软连接
ln -s /usr/local/tcpcopy-1.1.0/sbin/tcpcopy /usr/bin/tcpcopy
 
 
# 启动程序
tcpcopy -x 80-192.168.0.246:80 -s 192.168.0.247 -d

注意:192.168.0.246 是  Test Server IP地址,192.168.0.247 是 Assistant Server IP地址

Test Server 添加路由

Test Server 上的操作:

添加静态路由:

代码语言:javascript
复制
route add -net 192.168.0.0/24 gw 192.168.0.247

注意:192.168.2.0/24 是不存在的网络,是一条专门的路由,用于将数据包转发到Assistant Server 。

192.168.0.247 是 Assistant Server IP地址

测试效果

Online Server 和 Test Server 已经安装了nginx,如果没有,请使用以下命令安装:

代码语言:javascript
复制
apt-get install -y nginx

在客户端浏览器,打开 Online Server 的页面

http://192.168.0.245/

1.png
1.png

登录到 Online Server ,查看访问日志

代码语言:javascript
复制
tail -f /var/log/nginx/access.log
 
# 日志输出:
192.168.0.136 - - [27/Apr/2019:12:35:56 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"

登录到 Test Server ,查看访问日志

代码语言:javascript
复制
tail -f /var/log/nginx/access.log
 
 
# 日志输出:
192.168.2.254 - - [27/Apr/2019:12:35:56 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"

虽然访问的是  Online Server  ,但是 Test Server  能收到客户端的访问请求。说明 intercept 转发正常

本文参考链接:

https://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html

https://juejin.im/entry/5ac1922d6fb9a028bc2de3fb

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、tcpcopy工具介绍
  • 二、tcpcopy原理
    • TCPCopy 分为三个角色:
      • 数据传输流程图
      • 三、操作步骤
        • Online Server 上的发包:
          • Test Server 上的响应包路由:
            • Assistant Server 上的捕获响应包:
            • 四、tcpcopy搭建
              • 环境说明
                • 拓扑图
                  • 运行流程
                    • intercept安装
                      • tcpcopy安装
                        • Test Server 添加路由
                          • 测试效果
                          相关产品与服务
                          测试服务
                          测试服务 WeTest 包括标准兼容测试、专家兼容测试、手游安全测试、远程调试等多款产品,服务于海量腾讯精品游戏,涵盖兼容测试、压力测试、性能测试、安全测试、远程调试等多个方向,立体化安全防护体系,保卫您的信息安全。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档