tcpcopy-流量重放工具
- 2019 年 11 月 12 日
- 筆記
1、簡述:
tcpcopy是一種重放TCP流的工具,可使用真實環境的流量來測試互聯網伺服器上的應用程式。
2、描述:
大多數流量類產品的測試都無法做到全面性的請求模擬測試。尤其是在現在複雜的網路環境下,各種ddos,sql注入等網路攻擊的手段千奇百怪。所以流量類產品上線前的測試更需要慎重對待。由此,tcpcopy應運而生。tcpcopy是一種請求複製(所有基於tcp的packets)工具,可以把在線流量導入到測試系統中去,甚至可以放大在線流量,為流量類產品的測試多加一層保障。
3、情景:
- 分散式壓力測試:(利用tcpcopy複製或放大生產流量,以觸發驗證高並發大流量場景下的bug)
- 穩定性測試:(利用tcpcopy複製或放大生產流量,驗證系統服務穩定性)
- 回歸測試:(利用tcpcopy複製生產流量,復現bug問題)
- 性能比較:(利用tcpcopy複製或放大生產流量,驗證新版本性能是否達標)
(tcpcopy實現流程圖)

由上圖可知,tcpcopy由兩部分組成:tcpcopy和intercept。當tcpcopy在聯機伺服器上運行並捕獲聯機請求時,攔截在輔助伺服器上運行,並執行一些輔助工作,例如將響應資訊傳遞到tcpcopy。應該注意的是,測試應用程式在目標伺服器上運行。
tcpcopy默認情況下使用原始套接字輸入技術來捕獲網路層的聯機數據包並進行必要的處理(包括TCP交互模擬,網路等待時間控制和常見的上層交互模擬),並且默認情況下使用原始套接字輸出技術來將數據包發送到目標伺服器(圖中粉紅色箭頭所示)。
在目標伺服器上進行TCPCopy所需的唯一操作是設置適當的路由命令,以將響應數據包(圖中綠色箭頭所示)路由到輔助伺服器。
攔截負責將響應頭(默認情況下)傳遞給tcpcopy。通過捕獲響應數據包,攔截程式將提取響應頭資訊,並使用特殊通道將響應頭髮送到tcpcopy(圖中紫色箭頭所示)。當tcpcopy接收到響應標頭時,它將利用標頭資訊來修改聯機數據包的屬性,並繼續發送另一個數據包。應當注意,來自目標伺服器的響應被路由到輔助伺服器,該伺服器應充當黑洞。
4、安裝及使用tcpcopy
所需環境:線上機器平台—-輔助伺服器—-測試機器平台如機器資源有限,可將輔助伺服器和測試機器歸屬於同一台或同一組機器
1.線上環境安裝tcpcopy:
註:線上環境安裝之前也應該先在測試環境測試安裝,並且採用灰度安裝的方式。
wget https://github.com/session-replay-tools/tcpcopy/archive/1.0.0.tar.gztar xvf 1.0.0.tar.gzcd tcpcopy-1.0.0./configure --prefix=/opt/tcpcopy/makemake install
2.輔助機器安裝intercept
yum -y install libpcap-develhttps://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gztar xvf 1.0.0.tar.gzcd intercept-1.0.0./configure --prefix=/opt/tcpcopy/makemake install
3.使用tcpcopy
首先需要在輔助伺服器上啟動intercept。(8000為流量埠,需根據實際情況自己設置)
/opt/tcpcopy/sbin/intercept -i eth0 -F 'tcp and src port 8000' -d
參數詳解:
- -i, intercept會監聽埠,和tcpcopy進行通訊,-i就是指定監聽在哪個埠。tcpcopy啟動的時候會來連這個埠,如果連不上,就會啟動失敗。
- -F, 過濾規則,語法和pcap一樣。
- -d, 已守護進程方式運行
再啟動線上平台的tcpcopy
/opt/tcpcopy/sbin/tcpcopy -x 8000-測試伺服器ip:8000 -s 服務伺服器ip -c 數據包原地址 -n 2 -d
- -x, 是指本機8000埠的流量copy到測試伺服器的8000埠
- -s, 指定intercept機器的地址,tcpcopy要和intercept建立連接
- -c 偽裝地址,在把流量複製到測試伺服器的時候,修改數據包的源地址(建議為測試伺服器同網段地址),這樣方便指定路由。也可以寫成192.168.2.x,這樣源地址就是指定網段中的地址了。
- -n 流量放大倍數,如果不是壓測目的就不用指定這個參數。
- -d 以守護模式運行。
最後一步,在測試伺服器上開啟路由
註:輔助伺服器和測試伺服器需要在一個子網下
route add -net 測試伺服器子網網段 netmask 255.255.255.0 gw 輔助伺服器入口ip
此命令的意思是把發往整個子網地址的數據包全部轉給輔助伺服器(服務伺服器還充當黑洞伺服器的角色)
注意點:
- 為保證線上穩定,使用tcpcopy前最好在測試環境多模擬安裝使用幾次。
- 線上環境使用完tcpcopy後,建議灰度刪除,避免不必要的影響
- 輔助伺服器還需要扮演一個黑洞角色,所以不能開啟ip_forward
tcpcopy源碼及文章參考:https://github.com/session-replay-tools/tcpcopy