tcpcopy簡單用法


    這篇文章介紹下網易開源的流量重放(replay)工具TCPCopy,說是簡單介紹,絕對不是謙虛,因為自己了解的確實也不多。為什么不甚了解呢,大家可以到TCPCopy的官方倉庫看看,https://github.com/session-replay-tools/tcpcopy.git,這貨的官方文檔是全英文的,不知道為什么,讀起來特別有難度。OK,吐槽到這里結束,接下來是實戰時間。

由於TCPCopy改版,網上的很多資料都不適用於最新版的TCPCopy,當前的最新版是V1.0.0,本文檔也是基於該版本。

一、TCPCopy相關的嘗試

    TCPCopy是基於網絡棧,TCP協議的流量復制,常用的場景是把線上流量復制到測試環境,用來排查線下不容易重現的問題,或者對測試環境做壓力測試。
    TCPCopy分為兩部分,tcpcopyintercept,很多文檔都不會告訴你什么是intercept。以把線上服務器流量復制到線下的場景為例,tcpcopy運行在線上服務器,intercept並不是運行在用來測試的服務器上,而是運行在一台輔助的服務器上。后面會告訴你這台服務器的作用。到這里,你發現似乎沒有測試服務器的什么事,那是因為,測試服務器真的不需要做什么配置,只需要起一個測試程序,指一條路由就可以了。科普就到這里,后面是部署環節。

二、實戰TCPCopy

1、配置環境

TCPCopy --> TCPCopy V1.0.0
線上服務器 --> 192.168.124.105
測試服務器 --> 192.168.124.68
輔助服務器 --> 192.168.124.180

在我的這個配置環境有三台服務器,一台模擬線上服務器,一台作為測試服務器,還有一台作為輔助服務器。流程如下:

  • tcpcopy運行在線上服務器上,tcpcopy會把線上服務器收到的流量,重放給測試服務器,重放的時候tcpcopy修改了IP數據包的源IP地址(譬如修改源地址為192.168.2.254)。所以,線上服務器和測試服務器應該部署相同的服務。
  • tcpcopy把源IP偽造成192.168.2.254的包發給了測試服務器,如此,測試服務器在處理完tcpcopy發過來的數據以后,會把這些數據包返回給客戶端,即偽造的192.168.2.254。
  • 由於沒有192.168.2.254這個地址,我們在測試服務器添加一條專門的路由,把發往192.168.2.0/24的數據包,都全部轉交給輔助服務器。
  • 為了保證輔助服務器會接受這些本不屬於自己的,部署在輔助服務器上的intercept就發揮作用了。輔助服務器還可以用來把客戶端的請求返回給tcpcopy,但是默認只返回響應頭部給tcpcopy。輔助服務器應該類似於黑洞。

2、線上機器安裝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

3、輔助機器安裝intercept

安裝intercept有一些額外的依賴需要安裝上,然后和tcpcopy一樣的套路源碼編譯安裝。

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

安裝過程到此結束,很Easy吧!

4、部署

為了簡單期間,我們在線上和測試服務器上各啟一個簡單的http服務器,最簡單的辦法,不用apache和nginx,直接用python自帶的模塊。HTTP服務啟動命令如下:

# python -m SimpleHTTPServer

在線上服務器和測試服務器同時運行這個命令,開啟一個監聽在8000端口的簡易HTTP服務器。

先在輔助服務器上開啟intercept,步驟不能錯,沒有intercept的話,tcpcopy啟動不起來:

# /opt/tcpcopy/sbin/intercept -i eth0 -F 'tcp and src port 8000' -d
  • -i, intercept會監聽端口,和tcpcopy進行通信,-i就是指定監聽在哪個端口。tcpcopy啟動的時候會來連這個端口,如果連不上,就會啟動失敗。
  • -F, 過濾規則,語法和pcap一樣。
  • -d, 已守護進程方式運行

還有其它參數可以使用,-h便可以查看,不詳細解釋了。

然后,在線上服務器開啟tcpcopy:

# /opt/tcpcopy/sbin/tcpcopy -x 8000-192.168.124.68:8000 -s 192.168.124.180 -c 192.168.2.254 -n 2 -d
  • -x, 是指本機8000端口的流量copy到192.168.124.68的8000端口
  • -s, 指定intercept機器的地址,tcpcopy要和intercept建立連接
  • -c 偽裝地址,在把流量復制到測試服務器的時候,修改數據包的源地址為192.168.2.254,這樣方便指定路由。也可以寫成192.168.2.x,這樣源地址就是指定網段中的地址了。
  • -n 流量放大倍數,如果不是壓測目的就不用指定這個參數。
    -d 以守護模式運行。

最后,在測試服務器上開啟路由(切記輔助服務器要和測試服務器在一個子網里):

# route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.124.180

路由的意思是把發往192.168.2.0/24地址的數據包全部轉給輔助服務器。

測試效果
在另外一台機器上,向線上服務器發起請求,然后查看兩個HTTP服務器的實時日志,
線上服務器的結果:

tcpcopy-onlineserver.png

發起了兩次請求,由於url不存在,返回了404的HTTP Code。再看測試服務器:

tcpcopy-testserver.png

在測試服務器上,請求變成了四次,明顯看到流量被放大了1倍。效果正如預期。除此之外,還可以看到日志中的客戶端IP也不一樣。在原始的請求中,解析出來了主機名為Matrix3,而在測試機器上,客戶端IP是192.168.2.254,就是我們捏造的IP,注意偽造IP的時候,一定要避免環境中存在的IP和常用的IP。
注意

  • 輔助服務器要扮演成一個黑洞,所以不能開啟ip_forward
  • 在請求會修改數據的地方,譬如修改數據庫,如果配置不當,可能導致數據被重復修改多次。

5、阿里雲環境下的TCP Copy環境部署參考

    雲環境下,安全策略可能會干擾測試的進行。按物理機步驟部署會出現大量TCP  SYN_RECV狀態,需要采用如下步驟可以規避麻煩:

  • 測試機器和intercept部署到一台機器
  • tcpcopy端-c參數采用tcpcopy所在的線上機器ip地址
  • 在線上機器設置iptables黑洞來過濾掉測試服務器的響應包
    iptables -I INPUT -p tcp --sport 測試服務的端口 -j DROP -s 測試服務所在機器的ip地址
  • 千萬要注意在測試服務器不要設置路由了,否則會受到干擾

OK,TCPCopy就這些了!大家使用愉快。


免責聲明!

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



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