tcpcopy简单用法
这篇文章介绍下网易开源的流量重放(replay)工具TCPCopy,说是简单介绍,绝对不是谦虚,因为自己了解的确实也不多。为什么不甚了解呢,大家可以到TCPCopy的官方仓库看看,https://github.com/session-replay-tools/tcpcopy.git,这货的官方文档是全英文的,不知道为什么,读起来特别有难度。OK,吐槽到这里结束,接下来是实战时间。
由于TCPCopy改版,网上的很多资料都不适用于最新版的TCPCopy,当前的最新版是V1.0.0,本文档也是基于该版本。
一、TCPCopy相关的尝试
TCPCopy是基于网络栈,TCP协议的流量复制,常用的场景是把线上流量复制到测试环境,用来排查线下不容易重现的问题,或者对测试环境做压力测试。
TCPCopy分为两部分,tcpcopy和intercept,很多文档都不会告诉你什么是intercept。以把线上服务器流量复制到线下的场景为例,tcpcopy运行在线上服务器,intercept并不是运行在用来测试的服务器上,而是运行在一台辅助的服务器上。后面会告诉你这台服务器的作用。到这里,你发现似乎没有测试服务器的什么事,那是因为,测试服务器真的不需要做什么配置,只需要起一个测试程序,指一条路由就可以了。科普就到这里,后面是部署环节。
二、实战TCPCopy
1、配置环境
TCPCopy --> TCPCopy V1.0.0
线上服务器 --> 192.168.124.105
测试服务器 --> 192.168.124.68
辅助服务器 --> 192.168.124.180
在我的这个配置环境有三台服务器,一台模拟线上服务器,一台作为测试服务器,还有一台作为辅助服务器。流程如下:
- 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。辅助服务器应该类似于黑洞。
2、线上机器安装tcpcopy
在线上服务器上下载,然后编译安装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
3、辅助机器安装intercept
安装intercept有一些额外的依赖需要安装上,然后和tcpcopy一样的套路源码编译安装。
# yum -y install libpcap-devel
# 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
安装过程到此结束,很Easy吧!
4、部署
为了简单期间,我们在线上和测试服务器上各启一个简单的http服务器,最简单的办法,不用apache和nginx,直接用python自带的模块。HTTP服务启动命令如下:
# python -m SimpleHTTPServer
在线上服务器和测试服务器同时运行这个命令,开启一个监听在8000端口的简易HTTP服务器。
先在辅助服务器上开启intercept,步骤不能错,没有intercept的话,tcpcopy启动不起来:
# /opt/tcpcopy/sbin/intercept -i eth0 -F 'tcp and src port 8000' -d
- -i, intercept会监听端口,和tcpcopy进行通信,-i就是指定监听在哪个端口。tcpcopy启动的时候会来连这个端口,如果连不上,就会启动失败。
- -F, 过滤规则,语法和pcap一样。
- -d, 已守护进程方式运行
还有其它参数可以使用,-h便可以查看,不详细解释了。
然后,在线上服务器开启tcpcopy:
# /opt/tcpcopy/sbin/tcpcopy -x 8000-192.168.124.68:8000 -s 192.168.124.180 -c 192.168.2.254 -n 2 -d
- -x, 是指本机8000端口的流量copy到192.168.124.68的8000端口
- -s, 指定intercept机器的地址,tcpcopy要和intercept建立连接
- -c 伪装地址,在把流量复制到测试服务器的时候,修改数据包的源地址为192.168.2.254,这样方便指定路由。也可以写成192.168.2.x,这样源地址就是指定网段中的地址了。
- -n 流量放大倍数,如果不是压测目的就不用指定这个参数。
-d 以守护模式运行。
最后,在测试服务器上开启路由(切记辅助服务器要和测试服务器在一个子网里):
# route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.124.180
路由的意思是把发往192.168.2.0/24地址的数据包全部转给辅助服务器。
测试效果
在另外一台机器上,向线上服务器发起请求,然后查看两个HTTP服务器的实时日志,
线上服务器的结果:
发起了两次请求,由于url不存在,返回了404的HTTP Code。再看测试服务器:
在测试服务器上,请求变成了四次,明显看到流量被放大了1倍。效果正如预期。除此之外,还可以看到日志中的客户端IP也不一样。在原始的请求中,解析出来了主机名为Matrix3,而在测试机器上,客户端IP是192.168.2.254,就是我们捏造的IP,注意伪造IP的时候,一定要避免环境中存在的IP和常用的IP。
注意
- 辅助服务器要扮演成一个黑洞,所以不能开启ip_forward
- 在请求会修改数据的地方,譬如修改数据库,如果配置不当,可能导致数据被重复修改多次。
5、阿里云环境下的TCP Copy环境部署参考
云环境下,安全策略可能会干扰测试的进行。按物理机步骤部署会出现大量TCP SYN_RECV状态,需要采用如下步骤可以规避麻烦:
- 测试机器和intercept部署到一台机器
- tcpcopy端-c参数采用tcpcopy所在的线上机器ip地址
- 在线上机器设置iptables黑洞来过滤掉测试服务器的响应包
iptables -I INPUT -p tcp --sport 测试服务的端口 -j DROP -s 测试服务所在机器的ip地址 - 千万要注意在测试服务器不要设置路由了,否则会受到干扰
OK,TCPCopy就这些了!大家使用愉快。
tcpcopy简单用法的更多相关文章
- CATransition(os开发之画面切换) 的简单用法
CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...
- jquery.validate.js 表单验证简单用法
引入jquery.validate.js插件以及Jquery,在最后加上这个插件的方法名来引用.$('form').validate(); <!DOCTYPE html PUBLIC " ...
- NSCharacterSet 简单用法
NSCharacterSet 简单用法 NSCharacterSet其实是许多字符或者数字或者符号的组合,在网络处理的时候会用到 NSMutableCharacterSet *base = [NSMu ...
- [转]Valgrind简单用法
[转]Valgrind简单用法 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian S ...
- Oracle的substr函数简单用法
substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H' *从字符串第一个字符开始截取长度为1的字符串 subst ...
- Ext.Net学习笔记19:Ext.Net FormPanel 简单用法
Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...
- TransactionScope简单用法
记录TransactionScope简单用法,示例如下: void Test() { using (TransactionScope scope = new TransactionScope()) { ...
- WPF之Treeview控件简单用法
TreeView:表示显示在树结构中分层数据具有项目可展开和折叠的控件 TreeView 的内容是可以包含丰富内容的 TreeViewItem 控件,如 Button 和 Image 控件.TreeV ...
- listActivity和ExpandableListActivity的简单用法
http://www.cnblogs.com/limingblogs/archive/2011/10/09/2204866.html 今天自己简单的总结了listActivity和Expandable ...
随机推荐
- the little schemer 笔记(7)
第七章 Friends and Relations 这是一个set集合吗 (apple peaches apple plum) 不是,apple出现了不止一次 (set? lat) 是真还是假,其中l ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- GDI双缓冲绘图
一.简介 在进行复杂图形绘制时,若直接在屏幕DC上进行绘制,则会出现明显的闪烁.闪烁产生的原因是当绘制的图形较为 复杂时,图形绘制过程中就被刷新到屏幕上,导致结果断断续续地显示出来.双缓冲绘图的原理是 ...
- Netbeans自定义折叠代码
只需要在模块开始注释以//<editor-fold>开始, 在模块结束行以 //</editor-fold>结束即可 Can I Create Custom Code Fold ...
- Backbone学习记录(1)
去年买的<基于MVC的javascript Web富应用开发>,拖到现在还没看完,作者介绍了三个MVC框架,Spine ,backbone和javascriptMVC.1和2在国内的流行度 ...
- LVS集群-DR模式
同上个实验一样,还是准备三台机器 分发器(sishen_63):eth0 192.168.1.63 RealServer1sishen_64) RealServer2sishen_65) 首先配置网卡 ...
- spring中junit 提示Failed to load ApplicationContext
错误提示: 1:java.lang.IllegalStateException: Failed to load ApplicationContext 2:Error creating bean wit ...
- C# 图片打印杂谈
日常开头水一下,看了下上次博客,一年零八天了,啧啧,奢侈. 最近这个工作挺满意的,是我想要的发展方向,后续要做机器学习,现在得先把公司之前堆积的问题解决了. 谈人生到此结束,还是说正题吧.(感觉这标题 ...
- QTableWidget表头样式
转载请注明出处:http://www.cnblogs.com/dachen408/p/7742680.html QTableView { background-color: rgba(255, 255 ...
- COGS 2685. 迷妹
★ 输入文件:fans.in 输出文件:fans.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 小钟.小皓和小曦都是著名偶像派OI选手,他们都有很多迷妹. 现 ...