一、tcpcopy簡介
XCopy是由主要由網易的王斌開發的一套流量複製測試工具。XCopy系列包括 TCPCopy、UDPCopy、MysqlCopy 等開源軟件(這些軟件都集成在tcpcopy 開源項目內)。曾經應用於網易的廣告投放系統,urs系統,nginx hmux協議等系統,避免了上線帶來的很多問題。所以很多時候我們指的tcpcopy (廣義上的)就包括xcopy的全系統產品。
TCPCopy 包含兩部分:TCPCopy client(tcpcopy) 和 TCPCopy server(intercept) ,其中,TCPCopy client 運行在在線系統,用來捕獲在線請求數據包,而 TCPCopy server 運行在測試系統,用來做一系列輔助配合工作,如返回響應包頭信息、維護路由信息等。
二、tcpcopy新架構
目前tcpcopy的最新版本是0.9.9 ,而自v0.8版本以後tcpcopy就開始使用了新的架構方式。這裏就只看下其新的架構:
相對於0.8之前的老架構,新架構將 intercept 的工作從測試服務器(test server)offload 出來,放到另外一臺獨立的輔助服務器(assistant server,原則上一定要用同網段的一臺閒置的服務器來充當輔助服務器)上面截獲響應包, 而且把傳統架構從 IP 層捕獲響應數據包的工作轉移到從數據鏈路層抓響應包,這些改變大大降低了 TCPCopy 對測試機器的各種干擾(新架構下,除了路由設置,其它已經沒有影響了) ,大大增強了 intercept 捕獲響應包的能力,而且測試也更加真實。
新舊架構的對比,可以參看官方提供的中文手冊。
三、tcpcopy安裝及配置選項
安裝
tcpcopy託管在github上,其項目主頁爲:https://github.com/wangbin579/tcpcopy ,可以通過下面的方法安裝tcpcopy
- # git clone git://github.com/wangbin579/tcpcopy.git
- 此處也可以從github上下載zip包
- # cd tcpcopy-0.9.9
- # sh autogen.sh
- # ./configure --enable-選項
- # make && make install
編譯選項
其中--enable的可選選項有:
- --enable-debug compile TCPCopy with debug support (saved in a log file)
- --enable-mysqlsgt run TCPCopy at mysql skip-grant-tables mode(recommended)
- --enable-mysql run TCPCopy at mysql mode
- --enable-offline run TCPCopy at offline mode
- --enable-pcap run TCPCopy at pcap mode
- --enable-udp run TCPCopy at udp mode
- --enable-nfqueue run the TCPCopy server (intercept) at nfqueue mode
- --enable-advanced run TCPCopy at advanced mode (advanced archecture)
- --enable-dlinject send packets at the data link layer instead of the IP layer
- --enable-rlantency add more lantency control
具體也可以通過./configure --help查看 。
錯誤
安裝過程中可能遇到的報錯有如下幾個:
- autogen.sh: 1: autogen.sh: autoreconf: not found
解決方法:sudo apt-get install automake
編譯時,使用--enable-nfqueue 選項時,可能遇到的報錯:
- no need to check nfqueue or ip_queue
- checking for nfqueue directory... configure: error: nfqueue required. Install libnetfilter_queue(download it from http://www.netfilter.org/projects/libnetfilter_queue/index.html) or specify its path using --with-nfqueue=/dir/
解決方法:sudo apt-get install libnetfilter-queue-dev
編譯時,使用--enable-pcap 選項時,可能遇到的報錯:
- configure: error: pcap.h not found.
解決方法:sudo apt-get install libpcap-dev
四、tcpcopy在線複製
在tcpcopy 的新架構中,在線複製測試至少需要4臺主機。其中四者之間的關係我簡單畫了一個草圖,相對於架構圖可能更好理解一些:
上面四臺主機的角色關係如下:
A主機:作爲請求者,在應用場景中,可以理解其是前端nginx、loadrunner測試機
B主機:線上主機,在應用場景中,可以理解爲其是web架構中的tomcat、resin等應用(其可以通過nginx反向代理過來訪問,也可以是loadrunner直接通過http://IP:端口的形式訪問的對象)
C主機:測試主機,在應用場景中,其跑的應用是和B主機上的應用一致的。比如,新版本或新功能的應用布在C主機上,通過複製B主機的流量時行真實環境下的壓力測試,就可以得出其是否存在bug,性能如何等。這也是tcpcopy測試的目的。該機在測試環境中,需要配置route路由。
D主機:intercept主機,即架構圖中的輔助服務器。intercept通過和tcpcopy之間的通信,控制B、C間流量的複製。而最終在C主機上的模擬結果,就相當於A主機直接請求C主機一樣(這也就是圖中A、C之間灰色箭標的意思)。
注:以上只是我的個人理解。現實測試環境中,根據模擬壓力的不同,A、B、C、D 可以同時是 N 臺 。
現根據上面的架構,模擬進行復制,各主機的IP如下:
A主機:172.20.0.130
B主機:172.20.0.40
C主機:172.20.0.42
D主機:172.20.0.39
A主機:
不需要任何配置
C主機:
配置路由
- # route add -host 172.20.0.130 gw 172.20.0.39
D主機:
安裝tcpcopy
- # ./configure --enable-advanced --enable-pcap --enable-nfqueue
- # make
- # make install
運行intercept
如果D主要的內核版本小於3.5,編譯時就不需要後面的--enable-nfqueue參數,其使用uqeue模塊,按如下方式運行intercept
- # modprobe ip_queue # if not running
- # iptables -I OUTPUT -p tcp --sport port -j QUEUE # if not set
- # ./intercept
由於這裏我使用的ubuntu的內核版本大於3.5,按如下方式進行啓動
- # sudo iptables -I OUTPUT -p tcp --sport 8080 -j NFQUEUE
- # sudo intercept -i eth0 -F 'tcp and src host 172.20.0.42 and src port 8080' -d
注:在老的傳統架構中根據內核版本的不同,需要按上面的步驟進行啓動。在新架構中上面防火牆部分是不需要啓動的,這裏要感謝原作者王斌及時給予的觀念糾正 。
B主機
安裝tcpcopy
使用下面的方法的進行編譯安裝
- # ./configure --enable-advanced --enable-pcap
- # make
- # sudo make install
注:這裏的--enable-pcap參數可以不加,增加了的好處就是可以對包進行條件過濾。
啓動tcpcopy
- # sudo tcpcopy -x 172.20.0.40:8080-172.20.0.42:8080 -s 172.20.0.39 -i eth0 -d
驗證
默認tcpcopy安裝完生成後會在/usr/loca/bin目錄下生成tcpcopy和intercept執行文件 ,上面我們的啓動過程中也沒有使用 -l 參數指定日誌文件的位置,默認會在/usr/local/bin目錄下生成error_intercept.log 文件(B、D主機都有)。我們通過查看該日誌文件可以查看tcpcopy和intercept之間的信息交互。
驗證流量複製是否成功,可以通過查看B、C 兩臺主機的access日誌,可以查看下從A主機到B主機的訪問是否同樣在C主機上也有體現 ,如果有,就證明覆製成功。
注:根據內外網測試環境的複雜度不同,路由規則可能也有細微的差別。具體可以參看王斌在csdn上的博客。
五、離線測試
離線主機只需要兩臺主機:在線主機和測試主機 。
在線主機上通過下面的方式抓包:
- tcpdump -i any tcp and port <port> -s 0 -w online.pcap
測試服務器上安裝離線版tcpcopy
- # ./configure --enable-offline
- # make
- # sudo make install
在測試服務器上啓動intercept和tcpcopy
- # modprobe ip_queue (內核大於3.5時不需要該操作)
- # iptables -I OUTPUT -p tcp --sport <port> -j QUEUE
- # intercept
- 將在線抓取的包回放
- # tcpcopy -i <抓包文件地址> -x <port>-<本地ip>:<port>
注:
1、上面的iptables操作一定要有,沒有的話包無法進行回放。
2、tcpcopy回放過程中的 本地IP ,可以是本機的IP也可以是局域網中的其他主機的IP 。
上面的操作中是將tcpcopy包回放主機和測試主機放在了同一臺上。如果想將tcpcopy包回放的主機單獨用一臺,步驟則改爲如下:
A主機:172.20.0.39 (測試機)
B主機:172.20.0.21 (tcpcopy包回放機)
A主機上執行如下操作
- # iptables -I OUTPUT -p tcp --sport <port> -j QUEUE
- # intercept -d
B主機上執行如下操作
- # tcpcopy -i <抓包文件地址> -x <port>-<本地ip>:<port>
樣做的好處是將包回放主機和測試主機進行了分離,減小tcpcopy運行過程中對測試數據的影響。
http://www.361way.com/tcpcopy-online-offline/3510.html