简介
TCPCopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中。
Architecture
如上图所示,tcpcopy由以下三个部分组成
online server
online server上运行tcpcopy,在网络层复制raw packets,tcpcopy修改包的目地址,发给测试机target server
target server
被测应用处理tcpcopy转发的请求,通过路由转发将结果传给assistant server
assistant server
运行intercept,接收从target server得到的response packets,从中抽取header,并将header发给运行在online server上的tcpcopy进程
安装
tcpcopy安装, online server
git clone http://github.com/session-replay-tools/tcpcopy
./configure --prefix=PATH --with-debug
make
make install
可选config参数:
--offline replay TCP streams from the pcap file
--pcap-capture capture packets at the data link
--pcap-send send packets at the data link layer instead of the IP layer
--with-pfring=PATH set path to PF_RING library sources
--set-protocol-module=PATH set tcpcopy to work for an external protocol module
--single if intercept and tcpcopy are both configured with "--single" option,
only one tcpcopy works together with intercept,
and better performance is achieved.
--with-debug compile tcpcopy with debug support (saved in a log file)
如果想要在Data Link层复制数据包,同时通过制定PF_RING库路径可以降低丢包率
如果想在Data Link层发送包,可以在config时添加–pcap-send来提高性能
intercept安装,assistant server
//Install GUN M4
wget http://ftp.gnu.org/gnu/m4/m4-1.4.17.tar.gz
tar xvf m4-1.4.17.tar.gz
make
make install
//Install flex
wget http://downloads.sourceforge.net/project/flex/flex-2.5.39.tar.xz
tar xvf wget flex-2.5.39.tar.xz
./configure
make
make install
//Install Bison
wget http://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.gz
tar vxf bison-3.0.4.tar.gz
./configure
make
make install
//install libpcap
wget http://www.tcpdump.org/release/libpcap-1.0.0.tar.gz
tar xvf ibpcap-1.0.0.tar.gz
cd ibpcap-1.0.0
./configure
make
make install
git clone http://github.com/session-replay-tools/intercept
./configure --prefix=PATH --with-debug
make
make install
配置运行
共三台测试docker 容器:
online server: 172.17.0.5
assistant server: 172.17.0.4
target server: 172.17.0.13
Online server, 启动tcpcopy
以root权限运行
./tcpcopy -x 80-172.17.0.13:80 -s 172.17.0.4 -d
-x,指定将80端口数据转发给172.17.0.13:80
-s,指定intercept所在的机器ip
Target server, 设置route
需要关闭ip_forward
route add -host 172.17.0.5 gw 172.17.0.4
表示对客户ip为172.17.0.5的响应走网关172.17.0.4
assistant server,启动intercept
以root权限运行intercept服务器
./intercept -i eth0 -F 'tcp and src port 80' -d
注意事项
tcpcopy复制请求包,默认只更改包的目标地址,而源地址依然是客户端,所以复制过来的包在传输过程中可能会因为安全策略被当作无效或伪造的包被丢掉。要检测是否处于这一情况,可以通过让target server处于和online server同一网段和不同网段进行测试,若同一网段可到达而不同网段不可到达,那么存在上述的问题。
解决这一问题可以让online, assistant, target处于同一网段,不位于同一网段可以通过设置porxy,将tcpcopy路由到和assistant和target同一网段的ip上。