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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM