1. 程式人生 > >計算機網路--正向代理、反向代理、透明代理

計算機網路--正向代理、反向代理、透明代理

引言

我們在之前的Web快取機制一文中提到,快取伺服器就可以作為一種代理伺服器。

代理分為正向代理、反向代理、透明代理等等。今天我們著重介紹這三種代理方式。

什麼是代理?什麼是代理伺服器?

在正式開始前,我們先對標題中的概念進行定義,以下摘自維基百科:

  • 代理(英語:Proxy):也稱網路代理,是一種特殊的網路服務,允許一個網路終端(一般為客戶端)通過這個服務與另一個網路終端(一般為伺服器)進行非直接的連線。一些閘道器、路由器等網路裝置具備網路代理功能。一般認為代理服務有利於保障網路終端的隱私或安全,防止攻擊。
  • 代理伺服器(英文:Proxy Server):提供代理服務的計算機系統或其它型別的網路終端。

正向代理(Forward Proxy)

一般情況下,如果沒有特別說明,代理技術預設說的是正向代理技術。關於正向代理的概念如下:

正向代理是一個位於客戶端【使用者A】和原始伺服器(origin server)【伺服器B】之間的伺服器【代理伺服器Z】,為了從原始伺服器取得內容,使用者A向代理伺服器Z傳送一個請求並指定目標(伺服器B),然後代理伺服器Z向伺服器B轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。如下圖:

此處輸入圖片的描述

從上面的概念中,我們看出,文中所謂的正向代理就是代理伺服器替代訪問方【使用者A】去訪問目標伺服器【伺服器B】。這就是正向代理的意義所在。而為什麼要用代理伺服器去代替訪問方【使用者A】去訪問【伺服器B】呢?這就要從代理伺服器使用的意義說起。

1. 訪問本無法訪問的伺服器B

如下圖:

此處輸入圖片的描述

我們拋除複雜的網路路由情節來看圖,假設圖中路由器從左到右命名為R1,R2。假設最初使用者A要訪問伺服器B需要經過R1和R2路由器這樣一個路由節點,如果路由器R1或者路由器R2發生故障,那麼就無法訪問伺服器B了。但是如果使用者A讓代理伺服器Z去代替自己訪問伺服器B,由於代理伺服器Z沒有在路由器R1或R2節點中,而是通過其它的路由節點訪問伺服器B,那麼使用者A就可以得到伺服器B的資料了。

現實中的例子就是“翻牆”。不過自從VPN技術被廣泛應用外,“翻牆”不但使用了傳統的正向代理技術,有的還使用了VPN技術。

2. 加速訪問伺服器B

這種說法目前不像以前那麼流行了,主要是頻寬流量的飛速發展。早期的正向代理中,很多人使用正向代理就是提速。還是如圖,假設使用者A到伺服器B,經過R1路由器和R2路由器,而R1到R2路由器的鏈路是一個低頻寬鏈路。而使用者A到代理伺服器Z,從代理伺服器Z到伺服器B都是高頻寬鏈路。那麼很顯然就可以加速訪問伺服器B了。

3. Cache作用

Cache(快取)技術和代理服務技術是緊密聯絡的(不光是正向代理,反向代理也使用了Cache(快取)技術。還如上圖所示,如果在使用者A訪問伺服器B某資料J之前,已經有人通過代理伺服器Z訪問過伺服器B上得資料J,那麼代理伺服器Z會把資料J儲存一段時間,如果有人正好取該資料J,那麼代理伺服器Z不再訪問伺服器B,而把快取的資料J直接發給使用者A。這一技術在Cache術語中就叫Cache命中。如果有更多的像使用者A的使用者來訪問代理伺服器Z,那麼這些使用者都可以直接從代理伺服器Z中取得資料J,而不用千里迢迢的去伺服器B下載資料了。

4. 客戶端訪問授權

這方面的內容現今使用的還是比較多的,例如一些公司採用ISA SERVER做為正向代理伺服器來授權使用者是否有許可權訪問網際網路,如下圖:

此處輸入圖片的描述

上圖中防火牆作為閘道器,用來過濾外網對其的訪問。假設使用者A和使用者B都設定了代理伺服器,使用者A允許訪問網際網路,而使用者B不允許訪問網際網路(這個在代理伺服器Z上做限制)這樣使用者A因為授權,可以通過代理伺服器訪問到伺服器B,而使用者B因為沒有被代理伺服器Z授權,所以訪問伺服器B時,資料包會被直接丟棄。

5、隱藏訪問者的行蹤

如下圖,我們可以看出伺服器B並不知道訪問自己的實際是使用者A,因為代理伺服器Z代替使用者A去直接與伺服器B進行互動。如果代理伺服器Z被使用者A完全控制(或不完全控制),會慣以“肉雞”術語稱呼。

此處輸入圖片的描述

我們簡單的總結一下,正向代理是一個位於客戶端和原始伺服器之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端必須設定正向代理伺服器,當然前提是要知道正向代理伺服器的IP地址,還有代理程式的埠。

反向代理(reverse proxy)

反向代理正好與正向代理相反,對於客戶端而言代理伺服器就像是原始伺服器,並且客戶端不需要進行任何特別的設定。客戶端向反向代理的名稱空間(name-space)中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端。

使用反向代理伺服器的作用如下:

1、保護和隱藏原始資源伺服器

如下圖:

此處輸入圖片的描述

使用者A始終認為它訪問的是原始伺服器B而不是代理伺服器Z,但實用際上反向代理伺服器接受使用者A的應答,從原始資源伺服器B中取得使用者A的需求資源,然後傳送給使用者A。由於防火牆的作用,只允許代理伺服器Z訪問原始資源伺服器B。儘管在這個虛擬的環境下,防火牆和反向代理的共同作用保護了原始資源伺服器B,但使用者A並不知情。

2、負載均衡

如下圖:

此處輸入圖片的描述

當反向代理伺服器不止一個的時候,我們甚至可以把它們做成叢集,當更多的使用者訪問資源伺服器B的時候,讓不同的代理伺服器Z(x)去應答不同的使用者,然後傳送不同使用者需要的資源。

當然反向代理伺服器像正向代理伺服器一樣擁有Cache的作用,它可以快取原始資源伺服器B的資源,而不是每次都要向原始資源伺服器B請求資料,特別是一些靜態的資料,比如圖片和檔案,如果這些反向代理伺服器能夠做到和使用者X來自同一個網路,那麼使用者X訪問反向代理伺服器X,就會得到很高質量的速度。這正是CDN技術的核心。如下圖:

此處輸入圖片的描述

我們並不是講解CDN,所以去掉了CDN最關鍵的核心技術智慧DNS。只是展示CDN技術實際上利用的正是反向代理原理這塊。

基本上,網上做正反向代理的程式很多,能做正向代理的軟體大部分也可以做反向代理。開源軟體中最流行的就是squid,既可以做正向代理,也有很多人用來做反向代理的前端伺服器。另外MS ISA也可以用來在Windows平臺下做正向代理。反向代理中最主要的實踐就是Web服務,近些年來最火的就是Nginx了。網上有人說Nginx不能做正向代理,其實是不對的。Nginx也可以做正向代理,不過用的人比較少了。

透明代理

透明代理的意思是客戶端根本不需要知道有代理伺服器的存在,它改編你的request fields(報文),並會傳送真實IP。注意,加密的透明代理則是屬於匿名代理,意思是不用設定使用代理了。

透明代理實踐的例子就是時下很多公司使用的行為管理軟體。如下圖:

此處輸入圖片的描述

使用者A和使用者B並不知道行為管理裝置充當透明代理行為,當用戶A或使用者B向伺服器A或伺服器B提交請求的時候,透明代理裝置根據自身策略攔截並修改使用者A或B的報文,並作為實際的請求方,向伺服器A或B傳送請求,當接收資訊回傳,透明代理再根據自身的設定把允許的報文發回至使用者A或B,如上圖,如果透明代理設定不允許訪問伺服器B,那麼使用者A或者使用者B就不會得到伺服器B的資料。

除了本文提到的這幾種代理之外,還有匿名代理、高匿代理等,它們也都屬於正向代理。對於本文中沒有提到的一些代理,如果大家有興趣,可以自行查閱,就不在這裡進行贅述了。

總結

  1. 熟悉正向代理所提供的意義;
  2. 熟悉反向代理所提供的意義;
  3. 瞭解透明代理與匿名代理。