一、TCPCopy相關的嘗試
TCPCopy是用來做TCP重放的,常用的場景是把線上流量復制到測試環境,用來排查線下不容易重現的問題,或者對測試環境做壓力測試。
TCPCopy分為兩部分,tcpcopy和intercept,很多文檔都不會告訴你什么是intercept。以把線上服務器流量復制到線下的場景為例,tcpcopy運行在線上服務器,intercept並不是運行在用來測試的服務器上,而是運行在一台輔助的服務器上。后面會告訴你這台服務器的作用。到這里,你發現似乎沒有測試服務器的什么事,那是因為,測試服務器真的不需要做什么配置,只需要起一個測試程序,指一條路由就可以了。科普就到這里,后面是部署環節。
二、實戰TCPCopy
1、配置環境
-
TCPCopy --> TCPCopy V1.0.0
-
線上服務器 --> 192.168.2.92
-
測試服務器 --> 192.168.2.30
-
輔助服務器 --> 192.168.2.19
在我的這個配置環境有三台服務器,一台模擬線上服務器,一台作為測試服務器,還有一台作為輔助服務器。流程如下:
- 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的包,如下:
1 2 3 4 5 6 |
|
3、輔助機器安裝intercept
安裝intercept有一些額外的依賴需要安裝上,然后和tcpcopy一樣的套路源碼編譯安裝。
1 2 3 4 5 6 7 |
|
4、部署
為了簡單測試,我們在線上和測試服務器上各啟一個簡單的http服務器,最簡單的辦法,直接用python自帶的模塊。HTTP服務啟動命令如下:
1 |
|
2 |
|
在線上服務器和測試服務器同時運行這個命令,開啟一個監聽在8000端口的簡易HTTP服務器。
先在輔助服務器上開啟intercept,步驟不能錯,沒有intercept的話,tcpcopy啟動不起來:
1 |
|
- -i, intercept會監聽端口,和tcpcopy進行通信,-i就是指定監聽在哪個端口。tcpcopy啟動的時候會來連這個端口,如果連不上,就會啟動失敗。(erh0為網卡名)
- -F, 過濾規則,語法和pcap一樣。
- -d, 已守護進程方式運行
還有其它參數可以使用,-h便可以查看,不詳細解釋了。
然后,在線上服務器開啟tcpcopy:
1 |
|
- -x, 是指本機8000端口的流量copy到192.168.2.30的6001端口
- -s, 指定intercept機器的地址,tcpcopy要和intercept建立連接
- -c 偽裝地址,在把流量復制到測試服務器的時候,修改數據包的源地址為192.168.2.254,這樣方便指定路由。也可以寫成192.168.2.x,這樣源地址就是指定網段中的地址了。
- -n 流量放大倍數,如果不是壓測目的就不用指定這個參數。
-d 以守護模式運行。
最后,在測試服務器上開啟路由(切記輔助服務器要和測試服務器在一個子網里):
1 |
|
路由的意思是把發往192.168.2.0/24地址的數據包全部轉給輔助服務器。
測試效果
在另外一台機器上,向線上服務器發起請求,然后查看兩個HTTP服務器的實時日志,
線上服務器的結果:
發起了三次請求,再看測試服務器:
在測試服務器上,本次沒有加-n參數,流量是1:1重放。除此之外,還可以看到日志中的客戶端IP也不一樣,在原始的請求中,客戶端IP是192.168.20.10,是我本機ip,而在測試機器上,客戶端IP是192.168.2.254,就是我們捏造的IP,注意偽造IP的時候,一定要避免環境中存在的IP和常用的IP。
注意
- 輔助服務器要扮演成一個黑洞,所以不能開啟ip_forward
- 在請求會修改數據的地方,如發帖、刪帖、點贊等功能,放大多倍時,可能導致數據被重復修改多次。