【转】流量拷贝工具-goreplay原理
官方文档: https://github.com/buger/goreplay/wiki
GOREPLAY源码解析之概况: https://blog.csdn.net/melgibsonsolider/article/details/84909872
GOREPLAY源码解析之命令行参数: https://blog.csdn.net/melgibsonsolider/article/details/84909877
GOREPLAY是一个网络流量转发的应用,之前的名字叫GOR,GITHUB上的作者有介绍,更准确说应该是HTTP流量转发,作者的目标应该是WEB型应用在内网的转发,因为HTTP是一个应用广泛的协议,并且是标准的,因此从这个角度出发编写出来的转发应用能够在绝大多数的场景使用。这也会带来一定的问题,假设我们要转发其他的协议类型,这个时候需要自行编码识别协议的边界再做转发。
GOREPLAY使用GO语言编写,使用了一系列GO的工具,如操作pcap、kafka等。运行goreplay的前提也需要安装pcap等工具,并且需要在root权限下才能打开网卡的混杂模式,监听指定端口的所有tcp报文。
GOREPLAY的工作流程:
1.使用pcap的go接口,使用bpf(伯克利包过滤)设置指定端口的过滤表达式,bpf可以参考tcpdump工具的表达式,tcpdump命令背后也是使用了bpf。
2.截取到tcp报文之后,根据网络五元组(又一个名词,<源IP,源端口,目标IP,目标端口,协议>,实际程序中没有使用协议这个字段)作为key露拼装message,因为HTTP基于TCP协议,根据TCP协议中的ACK以及SEQ识别一次调用包的完整性。想读懂代码需要对TCP协议报文格式,HTTP协议格式有一定的了解,除了普通HTTP协议报文,还需要了解CHUNKED等比较少见的报文。
3.把一次HTTP调用的一个或多个TCP报文拼装后,如果识别到HTTP协议报文已经结束,可以进入转发阶段,转发即把这些报文中的数据段拼装后,直接对命令行上指定的端口发送TCP报文,从而完成转发。
如何使用
查看支持的命令参数: goreplay --help
例: goreplay --input-raw :8080 --output-tcp 10.1.2.3 :8080
支持的input参数:
--input-raw - 抓取HTTP流量, 您应该指定IP地址或接口和应用程序端口
--input-file - 接受以前使用--output-file记录的文件。
--input-tcp - 如果需要将流量从多个转发器Gor实例转发到该实例,则由Gor aggregation实例使用
支持的output参数:
--output-http - 重放http流量到指定端口,支持url
--output-file - 记录流量到文件
--output-tcp - 与--input-tcp一起使用,将传入的数据转发到另一个Gor实例。
--output-stdout - debug用,输出所有数据到 stdout.