zoukankan      html  css  js  c++  java
  • tcpcopy笔记-使用tcpcopy进行流量复制

    参考资料:
    https://www.jianshu.com/p/e34086c47493
    https://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html
    https://www.cnblogs.com/phennry/p/6382755.html?utm_source=itdadao&utm_medium=referral

    在服务迭代的过程中经常会对部分逻辑进行修改。为了服务正确性,避免上线后才发现错误,需要用线上真实流量来对新的服务进行测试。因此需要一种对线上服务影响尽可能小的工具来对流量进行拷贝。
    常用的几种流量拷贝工具:
    goreplay: https://github.com/buger/goreplay
    tcpreplay: https://github.com/appneta/tcpreplay
    tcpcopy: https://github.com/session-replay-tools/tcpcopy

    选择tcpcopy的原因:支持TCP包复制、免费(goreplay的pro版支持tcp,每年980刀)、开源项目维护好

    tcpcopy架构图
    架构

    tcpcopy拷贝一次流量访问的步骤如下:

    1. 一个客户请求到达线上机器;
    2. 拷贝IP层(或者数据链路层)的包到tcpcopy进程;
    3. tcpcopy修改包的目的及源地址,发给目标测试机;
    4. 拷贝的包到达目标测试机;
    5. 目标测试机的应用处理访问,并返回结果给辅助机;
    6. 返回结果在辅助机的数据链路层被截获,drop响应的body,copy返回的ip header;
    7. 辅助机将响应header发送给线上机器的tcpcopy进程。

    eg:
    测试服务器IP:10.1.2.3
    辅助服务器IP:10.1.2.4
    线上服务器IP:9.9.8.7

    安装

    1、线上服务器安装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
    

    2、辅助服务器安装intercept
    安装intercept有一些额外的依赖需要安装上,然后和tcpcopy一样的套路源码编译安装。

    # yum -y install libpcap-devel
    # wget 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
    

    注:也可以先编译,再把/opt/tcpcopy/传到指定服务器

    实时复制流量

    1、测试服务器(10.1.2.3)配置路由 ,将响应包路由到辅助机
    route add -net 10.1.2.0 netmask 255.255.255.192 gw 10.1.2.4
    gw对应辅助服务器ip

    2、辅助服务器(10.1.2.4)捕获目标机器发来的响应包
    ./intercept -F -i <device,>
    eg /opt/tcpcopy/sbin/intercept -i eth1 -F tcp and src port 18001 -d
    捕获网卡 eth1 ,源端口18001 基于tcp的包

    3、线上服务器(9.9.8.7)捕获包,并修改客户端地址,并把包发送给目标机器,等待辅助服务器发送响应包
    ./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server,> [-c <ip range,>]

    例子:
    /opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -n 2 -d -c 10.1.2.x

     /opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4  -c 10.1.2.x  -d        #全流量复制
     /opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4  -c 10.1.2.x -r 20 -d  #复制20%的流量
     /opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4  -c 10.1.2.x -n 2  -d  #复制2倍流量
    

    线上服务器和测试服务器启动服务:
    python -m SimpleHTTPServer 18001
    找台机器执行,假设ip为100.10.10.10:
    curl 9.9.8.7:18001
    后,线上服务器日志
    100.10.10.10 - - [07/May/2020 19:37:27] "GET / HTTP/1.1" 200 -
    测试服务器日志
    10.1.2.1 - - [07/May/2020 19:37:18] "GET / HTTP/1.1" 200 -

    可能存在的问题:
    Q&A
    Q: 测试机收不到请求,辅助服务器打印 [notice] fd is null after session is created
    A: 在线上服务器启动时,-c参数用-c 192.18.1.x
    /opt/tcpcopy/sbin/tcpcopy -x 18001-10.1.2.3:18001 -s 10.1.2.4 -n 2 -d -c 10.1.2.3.x

  • 相关阅读:
    MD文件利用标题等级进行分割代码实现
    IDEA插件-Git Commit Template
    IDEA插件-Translation
    IDEA使用-Debug回到上一步
    Java语法糖详解
    MySQL 事务的隔离级别初窥
    Java异常体系概述
    ssh-copy-id三步实现SSH免密登录
    深入理解ThreadLocal
    使用Guava RateLimiter限流入门到深入
  • 原文地址:https://www.cnblogs.com/gnivor/p/12845145.html
Copyright © 2011-2022 走看看