tcpcopy使用,看这一篇就够了!!!!(以0.9.10说明)

  • 目录

     

    准备工作

    服务启动(原则:先线下,后线上)

    服务退出(原则:先线上,后线下)

    tcpcopy原理解释

    tcpcopy工作流程(以访问nginx为例,访问其他服务程序同理)


  • 准备工作

  • 服务启动(原则:先线下,后线上)

    • 线下机器:

      • 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进程。


版权声明:本文为wenjun258120原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。