1.簡介
在App開發的過程當中,抓包是一個很常見的需求,而有些app的請求不會在網路設定代理時被抓到資料包,這裡若是需要抓包就需要搭建反向代理。
2.什麼是代理?
什麼是代理,來一張圖瞭解一下。
代理又分為正向代理和反向代理。
3.什麼是正向代理?
先來看張圖~
【再舉個例子】
某同學喜歡面向搜尋引擎程式設計,想透過 百度 搜尋引擎查詢一些學習資料,但是有些網站直接訪問可能不太安全,會暴露自己的IP,同學比較苦惱,想著怎樣才能使用百度 搜尋自己想要的學習資料,又不會暴露自己的IP在網站上呢?
這時我告訴該同學,我呢手上剛好有一臺代理伺服器,這臺代理伺服器透過nginx配置了正向代理轉發http和https請求,你呢,只需要在自己的Windows本地電腦的閘道器配置一下這臺代理伺服器的IP和埠號,就能正常透過代理伺服器訪問到百度 並搜尋相關的學習資料了,還不會暴露自己真實的IP~
4.什麼是反向代理?
先來一張圖瞭解下~
和正向代理相應的,正向代理代理客戶端,反向代理代理服務端。
反向代理(reverse proxy):是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。
我們在租房子的過程中,除了有些房源需要透過中介以外,還有一些是可以直接透過房東來租的。使用者直接找到房東租房的這種情況就是我們不使用代理直接訪問國內的網站的情況。
還有一種情況,就是我們以為我們接觸的是房東,其實有時候也有可能並非房主本人,有可能是他的親戚、朋友,甚至是二房東。但是我們並不知道和我們溝通的並不是真正的房東。這種幫助真正的房主租房的二房東其實就是反向代理伺服器。這個過程就是反向代理。
對於常用的場景,就是我們在Web開發中用到的負載均衡伺服器(二房東),客戶端(租客)傳送請求到負載均衡伺服器(二房東)上,負載均衡伺服器(二房東)再把請求轉發給一臺真正的伺服器(房東)來執行,再把執行結果返回給客戶端(租客)。
反向代理,其實是"代理伺服器"代理了"目標伺服器",去和"客戶端"進行互動。
透過反向代理伺服器訪問目標伺服器時,客戶端是不知道真正的目標伺服器是誰的,甚至不知道自己訪問的是一個代理。
5.正向代理和反向代理的區別
雖然正向代理伺服器和反向代理伺服器所處的位置都是客戶端和真實伺服器之間,所做的事情也都是把客戶端的請求轉發給伺服器,再把伺服器的響應轉發給客戶端,但是二者之間還是有一定的差異的。
1、正向代理其實是客戶端的代理,幫助客戶端訪問其無法訪問的伺服器資源。反向代理則是伺服器的代理,幫助伺服器做負載均衡,安全防護等。
2、正向代理一般是客戶端假設的,比如在自己的機器上安裝一個代理軟體。而反向代理一般是伺服器假設的,比如在自己的機器叢集中部署一個反向代理伺服器。
3、正向代理中,伺服器不知道真正的客戶端到底是誰,以為訪問自己的就是真實的客戶端。而在反向代理中,客戶端不知道真正的伺服器是誰,以為自己訪問的就是真實的伺服器。
4、正向代理和反向代理的作用和目的不同。正向代理主要是用來解決訪問限制問題。而反向代理則是提供負載均衡、安全防護等作用。二者均能提高訪問速度。
6.須要準備的工做
- 在本身電腦上面搭建一個可用的Charles
- 須要抓包的遠端服務的埠號和Host地址
- 在本身電腦上面搭建一個本地DNS解析服務
7.具體步驟 (Windows下的操作,Mac也同理)
1.確保手機可以連線上Charles,本身電腦上面可以看到正常請求出來的資料包(具體抓包可以看宏哥前邊的教程)
2.開啟Charles,勾選Proxy --> Reverse proxise...,進入反向代理設定介面。如下圖所示:
3.進入Reverse Proxies Settings(反向代理設定)頁面,勾選 Enable Reverse Proxies 。如下圖所示:
4.在【Add】新增。如下圖所示:
Edit Reverse Proxy 檢視中的選項含義:
local port:本地埠
本地主機上的埠建立反向代理。該欄位可能會自動填充一個可用的埠。如果有另一個應用程式使用該埠,則在反向代理啟動時將收到一條警告訊息
Remote host:遠端主機
作為反向代理的目的地的遠端主機的主機名或IP地址
Remote port:遠端埠
遠端埠預設為80,這是HTTP的預設埠。
Rewrite redirects:重寫重定向
重定向遠端伺服器的響應將被重寫與反向代理源地址相匹配,預設為開
遠端伺服器的重定向響應是完全限定的URL,即使它們在同一網站內
如果重定向到遠端伺服器地址,則需要將其重寫為反向代理本地地址,否則客戶端將使用重定向URL到遠端主機,因此不再透過反向代理連線
Preserve host in header fields:保留主機頭
Host HTTP標頭從傳入請求不變地傳遞,而不是正常重寫主機頭以匹配反向代理遠端主機,預設為關閉
僅當您具有特定要求時,才需要保留主機頭;普通使用的時候沒有必要使用的
Listen on a specific address:監聽特定地址
指定本地地址以偵聽反向代理,可以啟用此選項並在此處輸入IP地址
8.Charles反向代理實戰
Charles反向代理是提供一個埠轉發的功能,用於除IE外發出的HTTP請求,例如需要跟蹤Smartbi伺服器與XMLA伺服器之間的通訊、Smartbi SDK與伺服器之間通訊等。
宏哥在Apache伺服器安裝在A計算機上,IP地址為:10.11.53.180,並開啟服務,埠號為:80(預設)。然後宏哥簡單部署一個HTML頁面,在瀏覽器中訪問服務。如下圖所示:
現移動端訪問A伺服器部署的HTML頁面出現錯誤,但是需要錄製移動端的HTTP請求。這時候就需要Charles的反向代理幫助我們解決這個問題。具體操作步驟如下:
1.找一臺其他計算機,如計算機B,其IP地址為10.11.53.193,宏哥這裡演示的就是宏哥的本地計算機,如下圖所示:
2.在計算機B上安裝Charles,並啟動,這裡宏哥已經安裝就不做演示了。
3.選中charles上的"Proxy"-》"Reverse Proxies",進入反向代理設定介面,如下圖所示:
其中 Local Port是指計算機B的一個空閒埠,如本例中使用8080;
Remote Host是指HTML頁面服務的IP,即計算機A的IP: 10.11.55.182;
Remote Port是指HTML頁面服務的埠號,在本例中訪問HTML頁面的埠號為80(Apache預設埠)
點選OK儲存反向代理設定,如下圖所示:
6.
7.在任意一臺計算機或者移動端上,透過http://計算機B的IP:反向代理中設定的Loal Port埠/inde.html,可以訪問到HTML頁面服務。本例中透過在瀏覽器或者移動端的伺服器設定上輸入http://10.11.53.193:8080/index.html訪問,如下圖所示:
注:訪問是需要寫IP,不能寫localhost。
8.在charles中會監測到反向代理訪問,首次會彈出是否允許訪問,選擇'Allow'按鈕,允許訪問。沒有設定代理之前是訪問不到的,如下圖所示:
9.在計算機B上的charles就可以錄製到HTTP請求,如下圖所示:
9.小結
反向代理位於使用者和應用伺服器之間,是連線使用者和伺服器的中介。
於是我們可以
1.快取,將伺服器的響應快取在自己的記憶體中,減少伺服器的壓力。
2.負載均衡,將使用者請求分配給多個伺服器。
3.訪問控制
4.加上一些特殊的東西做特殊的事情(如IPS—入侵防禦系統、web應用防火牆等)