-
目录
tcpcopy工作流程(以访问nginx为例,访问其他服务程序同理)
-
准备工作
- 引流源(线上)机器和引流目标(线下)机器的root权限
- 工具(tcpcopy、intercept)部署到线上、线下机器/home/work/opbin/tcpcopy-0.9.10(任意)目录
- 0.9.10版本github:https://github.com/wangbin579/tcpcopy/releases/tag/0.9.10
-
服务启动(原则:先线下,后线上)
-
线下机器:
- cd /home/work/opbin/tcpcopy-0.9.10
- modprobe ip_queue
- 载入ip_queue模块,用于处理线下服务的响应包,内核大于3.5时不需要该操作
- iptables -L
- 查看当前的iptables规则
- iptables -I OUTPUT -p tcp —sport $port -j QUEUE
- sport后需要填写需被导入线上流量程序的port(就是线下服务监听的端口)
- 命令含义解释:添加一项iptables的规则,将端口$port的tcp响应包跳转到队列中
- iptables的相关基础知识请查看:https://www.cnblogs.com/ilinuxer/p/6364064.html
- nohup ./intercept -x 127.0.0.1&
- -x后面表示允许回包 (如果机器上已有启动的intercept服务可以不用再启动intercept,再启动的服务会出错退出。)
- 线上机器:
- cd /home/work/opbin/tcpcopy-0.9.10
- chmod +x *
- nohup ./tcpcopy -x $port1-$ip:$port2 &
- port1为需要copy的本机端口,port2为需要发往的机器ip和端口
- 其他可选参数:-r 20 流量减少 -n 2 流量扩大
- port1与后面的信息用『-』分隔
- 多个机器之间用『,』分隔
-
-
服务退出(原则:先线上,后线下)
-
线上机器:
- killall -9 tcpcopy
- 线下机器:
- killall -9 intercept
- iptables -D OUTPUT 1
- iptables -L
-
-
tcpcopy原理解释
-
tcpcopy可以从线上服务器的IP层抓取在线请求的数据包,修改相关属性,利用raw socket output技术(packet injection 技术之一)将其发送给测试服务器进行测试。
-
发送到测试服务器的数据包会在TCP/IP协议栈被识别,其中带有payload(tcp data)的数据包最终进入到测试服务器的上层应用(如nginx),上层应用在处理完请求之后,将响应传递给测试服务器的TCP/IP协议栈。
-
在测试服务器上启用ip_queue模块,并使用iptables在IP层将响应结果数据包发往QUEUE(ip_queue)。
-
测试服务器上运行在用户空间的拦截程序(intercept进程),通过打开netlink的socket接受内核通过ip_queue所传递来的网络数据包(即上层应用的响应内容)进行裁定,将结果返回内核,进行出队列的操作。intercept进程默认会丢弃上层应用的响应内容,返回ip header,以释放tcp连接。
-
-
tcpcopy工作流程(以访问nginx为例,访问其他服务程序同理)
-
① 一个访问到达线上前端机;
-
② socket数据包在ip层被拷贝了一份传给tcpcopy进程;
-
③ tcpcopy修改包的目的及源地址,发给目标测试机;
-
④ 拷贝的包到达目标测试机;
-
⑤ 目标测试机的nginx处理访问,并返回结果;
-
⑥ 返回结果在ip层被截获、丢弃,由intercpet进程拷贝返回结果的ip header并返回;
-
⑦ ip header被发送给线上前端机的tcpcopy进程。
-