tcp流量复制

常见的2种工具

tcpcopy是用c写的
gor用go写的

实现原理

原理和我之前blog的tcp流量监听器差不多

gor

goreplay提供了独特的阴影处理方法。后台goreplay不再是代理,而是侦听网络接口上的流量,无需更改生产基础结构,而是在与服务相同的计算机上运行goreplay守护程序。

tcpcopy

如图所示,TCPCopy由两部分组成: tcpcopy和intercept。当tcpcopy在联机服务器上运行并捕获联机请求时,拦截在辅助服务器上运行,并执行一些辅助工作,例如将响应信息传递到tcpcopy。应该注意的是,测试应用程序在目标服务器上运行。

tcpcopy默认情况下使用原始套接字输入技术来捕获网络层的联机数据包并进行必要的处理(包括TCP交互模拟,网络等待时间控制和通用上层交互模拟),并且默认情况下使用原始套接字输出技术来将数据包发送到目标服务器(图中粉红色箭头所示)。

在目标服务器上进行TCPCopy所需的唯一操作是设置适当的路由命令,以将响应数据包(图中绿色箭头所示)路由到辅助服务器。

拦截负责将响应头(默认情况下)传递给tcpcopy。通过捕获响应数据包,intercept将提取响应头信息,并使用特殊通道将响应头发送到tcpcopy(图中紫色箭头所示)。当tcpcopy接收到响应标头时,它将利用标头信息来修改联机数据包的属性,并继续发送另一个数据包。应当注意,来自目标服务器的响应被路由到辅助服务器,该服务器应充当blackhole(来什么接收什么,就是不转发到服务器或者目标,相当于要访问什么就阻止访问什么)。

tcpcopy配置比较麻烦,重点讲下gor的使用吧

gor功能

  • 捕获和重放流量
  • 重播HTTP流量
  • 重播二进制协议
  • 记录和重放保持活动的TCP会话
  • 从文件保存和重放
  • 限速
  • 请求过滤
  • 要求改写

要求

必须装有tcpdump

使用

实时引流

现在在终端中运行以下命令:

[root@xxx]# gor --input-raw :20000 --output-http 192.168.0.100:1111 

将本机的:20001的请求,同时打到192.168.0.100:1111

保存请求到文件并回放

[root@xxx]# gor --input-raw :20000 --output-file requests.gor

回放请求

gor --input-file requests.gor --output-http "192.168.0.100:1111"

重播二进制协议

Gor包含使用二进制格式(例如thrift或)的基本支持protocol-buffers。要开始设置--input-raw-protocol为“二进制”(默认为“ http”)。要重放,您应该使用--output-binary,例如:

gor --input-raw :80 --input-raw-protocol binary --output-binary staging:8081

在与--input-raw您一起工作时,您可能会注意到将消息发送到输出之前有2秒的延迟。因为对于一般的二进制协议,不可能知道TCP消息何时结束,所以这种现象是预期发生的,因此Gor必须设置不活动超时。每个协议都有自己的规则(例如,将消息长度写为第一个字节),并且需要单独处理才能知道消息长度。

请注意,您可以将所有负载测试功能用于二进制协议。例如,以下命令将循环播放并以10倍速重放记录的有效负载30秒:

gor --input-file './binary*.gor|1000%' --output-binary staging:9091 --input-file-loop --exit-after 30s
添加新评论