zoukankan      html  css  js  c++  java
  • tcpcopy用法

    目标:

    将线上服务lighttpd(8000端口)的流量引流到线下测试机

    一、测试机:

    tcpcopy-server,接收流量

    modprobe ip_queue
    iptables -L
    iptables -I OUTPUT -p tcp --sport 8000 -j QUEUE
    ./intercept -d -l intercept.log
    -d:后台
    -l:指定log

    二、线上:

    tcpcopy-client,复制流量

    ./tcpcopy -x 8000-10.46.43.14:8000 -d -n 1 -l tcpcopy.log
    -d:后台
    -l:指定log
    -n:流量复制的份数

    三、关闭:

    killall intercept
    killall tcpcopy
    iptables -F
    注意:
    当测试机打开
    iptables -I OUTPUT -p tcp --sport 8000 -j QUEUE
    将无法直接访问测试机的该服务,只能通过日志观察
     
    tcpcopy-0.9.10tcpcopy.tar
     
     
    抓包发现有意思的地方
    A:发起请求的机器:cq02-map-wpng03.cq02
    B:线上机器:cq01-map-lbsop-hbase00.cq01
    C:测试机器:cq01-map-lbsop-hbase01.cq01
    一:正常copy流量,三个机器和测试机的抓包图
    A机器:无和C交互。因为测试机器iptables -I OUTPUT -p tcp --sport 8000 -j QUEUE 把出的流量屏蔽了(放入queue,intercept去捕获,发给B的tcpcopy进程)
     
    B机器:有自己和C的交互,也有假A机器和测试机的交互(伪装的,否则本机怎么会抓到来源和目的都不是自己的机器呢,说明肯定实际是过了本机网卡,不过把协议头里的ip改了);每个发给C的请求都有两份,两份的seq完全一样,但是所有包的ack不一样(ack不一样是因为ack需要响应C发的,在测试机发的seq上加1,否则如果照抄自己回复给真A的,会露馅)
     
    C机器:有假A发给我的包(伪装的,其实是B机器发的),但没有回复出任何的包(因为iptables封了)。
     
    二:去掉C机器iptables的封禁
    A机器:有C机器发给A的第二次握手,和A发给C的复位包(第二次握手莫名奇妙,A并没有发给C第一次握手)
    B机器:有真A发给B的所有正常包;有假A发给C的第一次握手包。第二次握手没有,因为刚才C收到假A第一次握手,回第二次握手给真A(C无法区分真假),真A莫名奇妙,把这次请求复位了。假A也就没法干活了。还有假A发给C的复位确认包(133s后)
    C机器:有假A发来的第一次握手,会给真A的第二次握手,真A发来的复位包,假A发来的复位响应包。
  • 相关阅读:
    String类中的常用方法(Java)
    Struts2的Lambda表达式的使用
    Struts2的环境搭建
    Servlet 3.0
    关于URLWriter的用法
    PrintStream与PrintWriter
    java中的System.nanoTime与System.currentTime
    java多线程之CyclicBarrier类
    多线程java IO之管道流
    消费者与生产者
  • 原文地址:https://www.cnblogs.com/zlingh/p/7753619.html
Copyright © 2011-2022 走看看