做者博客:http://blog.csdn.net/wangbin579/article/details/8950282php
配置參考:node
http://quentinxxz.iteye.com/blog/2249799nginx
http://blog.csdn.net/zhang_yanan/article/details/25708349git
下面演示的tcpcopy和intercepter都是1.0.0版本,直接從github下載便可。github
https://github.com/session-replay-tools/tcpcopy服務器
tcpcopy運行須要intercept的支持,tcpcopy負責抓包和發包工做,而intercept負責截獲應答包網絡
node1 192.168.2.11 online server 安裝tcpcopy、libpcap-develsession
node2 192.168.2.12 target server 添加路由socket
node3 192.168.2.130 assistant server 安裝intercepter、libpcap-develtcp
另外找一個當前網段沒有主機在用的IP,例如192.168.2.110
實驗中的node1、node2上都跑了nginx,監聽在80端口。node1爲線上服務器,node2爲測試服務器。
node2上:
route add -host 192.168.2.110 gw 192.168.2.130
# 說明:
# 192.168.2.110 是經複製後測試數據包上填入的源地址。
# 192.168.2.130 爲assistant server,上面將會運行intercept服務。
# 這條命令做用是 target server對於複製而來的請求(根據源地址判斷)的響應,不會返回給請求客戶端,而是發往assistant server, assistant server最終丟棄這個數據包(由於assisant server上並無相關的路由)。
node3上:
echo 0 > /proc/sys/net/ipv4/ip_forward # 關閉內核轉發功能
tar xf intercept-1.0.0.tar.gz
cd intercept-1.0.0
./configure
make -j 4 && make install
cd /usr/local/intercept/sbin
./intercept -i eth0 -F 'tcp and src port 80' -d
# 其中80是target server的端口號。intercept捕獲基於TCP應用的響應
# 關閉內核轉發,這樣的話,target server的那個route過來的數據包就過來了會匹配不到路由,直接被丟棄了。
ps aux|grep intercept 能夠看到進程啓動了
node1上:
tar xf tcpcopy-1.0.0.tar.gz && cd tcpcopy-1.0.0
./configure
tcpcopy的安裝,有以下2種方式:
./configure (默認raw socket方式抓包)
或者./configure --pcap-capture (pcap方式抓包,在某些場景下,丟包率會高於raw socket方式抓包,這時候須要相似pf_ring的支持)
make -j 4 && make install
cd /usr/local/tcpcopy/sbin
./tcpcopy -x 80-192.168.2.12:80 -s 192.168.2.130 -c 192.168.2.110 -n 10
# 格式:tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server,> [-c <ip range,>]
# 這樣把本機80端口的10倍的數據流量就發到了192.168.2.12的80端口去,而且把發過去的數據包假裝成源地址是192.168.2.110這個虛假的IP。而且鏈接192.168.2.130,告訴intercept將響應數據包發給online server本機。
# 若是有多臺online server,只要在每臺online server上都執行上面的這個tcpcopy命令便可。
其中80是target server的端口號。
-x 80-192.168.2.12:80 是將從80端口的請求發往 target server。
-s 192.168.2.130 爲指定assistant server。
-c 192.168.2.110 是指將全部複製請求的數據包的源地址全改成 192.168.2.110 。
-n參數指定複流量的倍數。
驗證效果:
另找一臺主機node4,執行ab -c 100 -n 100000 http://192.168.2.11/index.php
而後觀察node1、node2上面的鏈接數ss -tan,及系統負載uptime、網絡流量dstat。
ss -tan|awk 'NR>1 {++s[$1]} END {for (k in s) print k,s[k]}'
另外,能夠在node1或者node2上抓包:
tcpdump -i eth0 -nn port 80 and host 192.168.2.110
在node3上抓包:
tcpdump -i eth0 -nn host 192.168.2.130
這些方式均可以很直觀的看到數據包的流向。
中止流量複製
在assistant server 中kill intercept進程,在online server 中kill tcpcopy進程,在target server上刪除相應的route。
其餘注意點:參照做者的CSDN博客便可。