使用tcpcopy进行线上流量导流测试

导流流程

简单理解,通过tcpcopy工具,截取线上服务收到的数据,转发一份数据给测试服务。
参与导流的服务有线上服务、测试服务、tcpcopy、intercept。线上服务和测试服务一般是同个应用程序,或者具备处理导流请求的能力。

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

自建机房的用法

1. 配置环境

以下是机器列表

TCPCopy --> TCPCopy
线上服务器:192.168.1.105
测试服务器:192.168.1.122 
辅助服务器:192.168.1.180

在我的这个配置环境有三台服务器,一台模拟线上服务器,一台作为测试服务器,还有一台作为辅助服务器。流程如下:

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 list libpcap-devel*查到到对应的lib包名称 
yum install libpcap-devel.x86_64
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

4. 部署

先在辅助服务器上开启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.1.122:8000 -s 172.16.1.112 -c 192.168.2.144 -n 2 -d
-x, 是指本机8000端口的流量copy到192.168.1.122的8000端口
-s, 指定intercept机器的地址,tcpcopy要和intercept建立连接
-c 伪装地址,在把流量复制到测试服务器的时候,修改数据包的源地址为192.168.2.144,这样方便指定路由。也可以写成192.168.2.x,这样源地址就是指定网段中的地址了。
-n 流量放大倍数,如果不是压测目的就不用指定这个参数。
-d 以守护模式运行。

5. 添加路由

最后,在测试服务器上开启路由(切记辅助服务器要和测试服务器在一个子网里):

记得关闭防火墙,否则会收不到

route add -net 192.168.2.0 netmask 255.255.255.0 gw 172.16.1.112

最后这一步不做,会抓不到包

阿里云机房的用法

参考:https://github.com/session-replay-tools/tcpcopy/issues/336

云环境下,安全策略会干扰tcpcopy测试的进行。
采用如下步骤可以规避麻烦:

1. 测试机器和intercept部署到一台机器
2. tcpcopy端-c参数采用tcpcopy所在的线上机器ip地址
3. 在线上机器设置iptables黑洞来过滤掉测试服务器的响应包
iptables -I INPUT -p tcp --sport 测试服务的端口 -j DROP -s 测试服务所在机器的ip地址
4. 千万要注意在测试服务器不要设置路由了,否则会受到干扰

部署案例如下:

# 测试机器+辅助机器:test045,内网ip为10.10.1.15。测试服务的端口为8000
/opt/tcpcopy/sbin/intercept -i eth0 -F 'tcp and src port 8000' -d

# 线上机器:test020,内网ip为10.10.1.18. 线上服务的监听端口为8000.
/opt/tcpcopy/sbin/tcpcopy -x 8000-10.10.1.15:8000 -s 10.10.1.15 -c 10.10.1.18 -n 1 -d

# 线上机器丢弃辅助机器的响应包
iptables -I INPUT -p tcp --sport 8000 -j DROP -s 10.10.1.15

防火墙操作需跟运维沟通确认,由运维操作,避免造成事故。

由于线上机器还需要复制流量,会占用系统资源,需确认线上服务是否会受到影响。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值