tcpcopy

来源:互联网 发布:监控矩阵键盘说明书 编辑:程序博客网 时间:2024/04/30 10:36
  • 概述
    • tcpcopy最初架构
    • 第二种架构
    • 第三种架构
  • v0.9.0版本使用安装教程

概述

网易公司于2011年推出的一款开源工具,tcpcopy架构已历经三代,基本原理都一样,本质是利用在线数据包信息,模拟tcp客户端协议栈,欺骗测试服务器的上层应用服务。由于tcp交互是相互的,一般情况下需要知道测试服务器的响应数据包信息,才能利用在线请求数据包,构造出适合测试服务器的请求数据包,因此只要基于数据包的方式,无论怎么实现(除非是tcp协议改的面目全非),都需要返回响应包的相关信息。
三种架构的差别就在于在什么地方截获响应包

tcpcopy最初架构


tcpcopy是从数据链路层(pcap接口)抓请求数据包,发包是从IP层发出去,测试服务器的TCP协议栈没有类似ip queue或者nfqueue的干扰,响应包会直接返回给在线机器(通过设置路由),tcpcopy可以在数据链路层捕获到这些响应包,这些响应包会到达IP层,一般最终被丢弃掉(除非是客户端IP地址就是这台在线机器的IP地址,会通过IP层,但会被TCP reset掉),这种架构一般只能工作在同一网段,而且对于外网应用,一般只能复制单台在线流量给测试服务器。

优点:
1)简单,粗暴.
2)适合冒烟测试.
3)测试结果比较真实.

缺点:
1)相对而言,会更加影响在线,因为响应包信息全部回给在线机器了(当然这种还是比应用层面的请求复制,影响更小).
2)同一网段限制.
3)对于外网应用,无法充分利用或者很难充分利用多台在线流量,从而无法为压力测试提供技术支持.
4)内网应用严重受限制,因请求的客户端IP地址不能是被复制的在线机器的IP地址.

第二种架构

从上面图中我们可以看出,tcpcopy默认从IP层抓包,从IP层发包,与第一种架构不同的是,我们在测试服务器进行响应包的截获,并通过intercept程序返回响应包的必要信息给tcpcopy。这种架构为分布式压力测试提供了可能性,相比第一种架构,大大推动了tcpcopy的进化。

我们先从响应包的截获来分析,理论上,可以在测试服务器的IP层或者数据链路层进行截获响应包,我们具体分析如下:
1)在数据链路层抓,正常情况下,其响应数据包会返回给真正发起请求的客户端,这会或多或少影响到客户端的TCP(频繁地reset)模块,而且在压力大的时候,会给交换机、路由器甚至整个网络,带来不必要的干扰。

2)在测试服务器的IP抓响应包,正好有netlink技术来解决上面的问题,netlink是一种用户态进程与内核进行交互的技术,具体地我们可以利用内核模块ip queue(内核3.5以下版本)或者nfqueue(内核3.5或者以上版本)来达到捕获响应包的目的。

我们采用了第二种方式,也即上图中的IP层来截获响应包,当响应包传递给intercept后,我们就能copy到响应包信息的必要信息(一般为TCP/IP头部信息),传递给tcpcopy,我们还可以通过verdict告诉内核,该如何处理这些响应包,如果没有设置白名单的话,就会在IP层丢弃掉这些响应包,这时候你是无法利用tcpudmp来抓到这些响应包的(tcpdump工作在数据链路层)。

这种设计的好处就是可以支持复制多台在线流量到一台测试服务器中去,我们在intercept保留路由信息,知道响应包的相关信息该如何返回给哪一个tcpcopy实例。然而这种架构,intercept会不同程度地占用测试服务器的资源,而且ip queue或者nfqueue,并不一定能够高效工作,因而给测试,特别是高压测试和短连接压力测试,带来了很大麻烦。

优点:
1)支持复制多台在线流量
2)影响在线机器更小,因为一般只需要返回TCP/IP头部信息

缺点:
1)较第一种更为复杂
2)性能极限往往在ip queue或者nfqueue
3)intercept扩展性不好,受制于ip queue和nfqueue无法支持多进程进行响应包的捕获操作
4)intercept影响测试服务器的最终测试结果,特别是压力大的时候
5)无法对测试服务器进行完整测试(没有覆盖到数据链路层的出口)
6)运维不方便

第三种架构

上述架构,也即最新架构,是为了极限测试的目的而设计的,把intercept的工作从测试服务器(test server)中offload出来,放到另外一台独立的辅助服务器(assistant server,原则上一定要用同网段的服务器来充当辅助服务器)上面进行截获响应包,而且把原先从IP层捕获响应数据包的工作转移到从数据链路层抓响应包,这些改变大大降低了对测试机器的各种干扰(除了路由设置,其它已经没有影响了),而且大大扩大了捕获响应包的能力。当然这种测试也更加真实。

具体如下:

在运行上层服务的测试服务器test server上面设置路由信息,把待测试应用的需要被捕获的响应数据包信息路由到辅助服务器assistant server 上面,在assistant server上面,我们在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的tcpcopy。

为了高效使用,这种架构推荐使用pcap进行抓包,这样就可以在内核态进行过滤,否则只能在用户态进行包的过滤,而且在intercept端或者tcpcopy端设置filter(通过-F参数,类似tcpdump的filter),达到多个实例来共同完成抓包的工作,这样可扩展性就更强,适合于超级高并发的场合。

这种架构需要的机器资源也更多,而且也变得更加难使用,需要了解tcp知识,route知识和pcap filter知识(类似于tcpdump过滤条件),因此推荐有条件的并且熟悉上述知识的人使用最新的架构。

需要注意的是,在某些场景,pcap抓包丢包率会远高于raw socket抓包,因此最好利用pf_ring来辅助或者采用raw socket来抓包

优点:
1)更加真实
2)可扩展性更强
3)适合高并发场合
4)无ip queue或者nfqueue的各种限制
5)对测试服务器几乎没有任何性能干扰的影响
6)在运行服务的测试服务器,运维更加方便
7)不会随运行服务的服务器崩溃而崩溃

缺点:
1)操作难度更大
2)需要的机器数量更多
3)需要的知识也更多
4)assistant server(运行intercept的机器)原则上必须要和测试服务器(test server)在同一个网段

tcpCopy1.0介绍

对于项目影响较大的发布,我们可以优先采用tcpCopy进行引流,灰度测试

tcpCopy官方文档:https://github.com/session-replay-tools/tcpcopy  

tcpCopy的系统结构


其中online server为在线机器(源机器) assistant server为中转机器 target server为目标机器
例如我们想从A机器将流量引入到B机器 A机器为online server B机器为target server 同时我们需要另外一个机器作为Assistant Server

安装过程如下:

中转机器

Getting intercept installed on the assistant server

  1. cd intercept
  2. ./configure
    • choose appropriate configure options if needed
  3. make
  4. make install

源机器
Getting tcpcopy installed on the online server

  1. cd tcpcopy
  2. ./configure
    • choose appropriate configure options if needed
  3. make
  4. make install

需要注意:安装intercept和tcpcopy之前需要安装libpcap-devel
sudo yum install -y gcc automake autoconf libtool make libpcap-devel

配置方法

当我们安装成功了 此时我们就可以配置引流了

第一步

我们需要在目标机器配置中转路由:

For example:

     Assume 61.135.233.161 is the IP address of the assistant server. We set the 

     following route command to route all responses to the 62.135.200.x's clients 

     to the assistant server.

       route add -net 62.135.200.0 netmask 255.255.255.0 gw 61.135.233.161

其中要注意一下 62.135.200.0 这个需要填写的是所有源机器请求来源的NG的ip

但是对于某些公司特殊的要求,不能使用ip地址,可能会出问题

配置应该为sudo route add -host l-ng9.com gw l-ng8.com

中转机器需要过滤只要这些请求来源的流量。

若请求来源有多个,则需要多次添加(NG有多个)。

第二步

官方文档描述

On the assistant server which runs intercept(root privilege or the CAP_NET_RAW capability is required):

   ./intercept -F <filter> -i <device,>

   Note that the filter format is the same as the pcap filter.

   For example:

      ./intercept -i eth0 -F 'tcp and src host 192.168.248.56 and src port 8080' -d

      intercept will capture response packets of the TCP based application which listens

on port 8080 from device eth0 

其中eth0指的是网卡 一般情况默认即可

“tcp and src host 192.168.248.56 and src port 8080”

其中src host指的是目标机的host

src port指的是目标机的端口号

第三步

官方文档描述

./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server,> [-c <ip range,>]

For example(assume 61.135.233.160 is the IP address of the target server):

./tcpcopy -x 80-61.135.233.160:8080 -s 61.135.233.161 -c 62.135.200.x

tcpcopy would capture port '80' packets on current server, change client IP address to one of 62.135.200.x series, send these packets to the target port '8080' of the target server '61.135.233.160', and connect 61.135.233.161 for asking intercept to pass response packets to it.

Although "-c" parameter is optional, it is set here in order to simplify route commands.

正式使用时没有使用这么多配置 For example:

./tcpcopy  -x 8080-192.168.248.56:8080 -s 192.168.248.57  -d

其中第一个ip192.168.248.56为目标机ip 第二个ip192.168.248.57为中转机ip

结尾和注意事项

target server和assistant server要同一网段


0 0
原创粉丝点击