四層反向代理和七層反向代理

人艰不拆_zmc發表於2024-06-07

1、概述

  代理也稱網路代理,是一種特殊的網路服務,允許一個網路終端(一般為客戶端)透過這個服務與另一個網路終端(一般為伺服器)進行非直接的連線。一些閘道器、路由器等網路裝置具備網路代理功能。一般認為代理服務有利於保障網路終端的隱私或安全,防止攻擊。

2、四層網路代理

  如果說網路層通訊的粒度是物理終端裝置的話,IP就是標記不同物理裝置的符號,那麼傳輸層通訊的粒度是程序,埠就是標記不同程序的符號。

  四層代理的四層就是OSI七層模型中的傳輸層;四層代理是基於IP+埠做的代理。四層透過虛擬IP+埠接收請求,然後再分配到真實的伺服器。

  以常見的TCP為例,從三次握手的第一次握手開始,代理裝置在接收到第一個來自客戶端的SYN 請求時,即按照一定的策略選擇一個被代理的後端伺服器,並對報文中目標IP地址進行修改(改為後端伺服器IP),直接轉發給該伺服器。只不過在後端機器上看到的都是與代理機的IP的established而已。

  TCP連線建立,即三次握手,實際上是客戶端和後端伺服器建立的,代理裝置只是起到一個類似路由器的轉發動作。在某些部署情況下,為保證伺服器回包可以正確返回給負載均衡裝置,在轉發報文的同時可能還會對報文原來的源地址進行修改。

  代表軟體:LVS、F5。

3、七層網路代理

  七層代理的七層就是OSI七層模型中的應用層;七層代理是基於內容資料做的代理(理解應用層中的應用資料),最終的轉發規則取決於內容的差異。鑑於七層應用協議非常廣泛,現在的七層代理主要是指HTTP代理。

  和四層代理不同的是,七層代理必須要先和代理裝置三次握手後,才能得到七層(HTTP層)的具體內容,然後再轉發。意思就是代理機必須要與客戶端和後端伺服器的機器都要建立連線。顯然,七層代理對代理裝置的效能要求要高於四層代理。

  我們常使用的Nginx,用作代理伺服器的時候,一般都是工作在第七層的。使用Nginx,我們可以代理靜態檔案、ajax後臺介面、CDN重定向等等,都是在傳輸層之上理解內容後做的工作。

  七層應用負載的好處,是使得整個網路更智慧化。例如訪問一個網站的使用者流量,可以透過七層的方式,將對圖片類的請求轉發到特定的圖片伺服器並可以使用快取技術;將對文字類的請求可以轉發到特定的文字伺服器並可以使用壓縮技術。當然這只是七層應用的一個小案例,從技術原理上,這種方式可以對客戶端的請求和伺服器的響應進行任意意義上的修改,極大的提升了應用系統在網路層的靈活性。很多在後臺,例如Nginx或者Apache上部署的功能可以前移到負載均衡裝置上,例如客戶請求中的Header重寫,伺服器響應中的關鍵字過濾或者內容插入等功能。

  另外一個常常被提到功能就是安全性。網路中最常見的SYN Flood攻擊,即駭客控制眾多源客戶端,使用虛假IP地址對同一目標傳送SYN攻擊,通常這種攻擊會大量傳送SYN報文,耗盡伺服器上的相關資源,以達到Denial of Service(DoS)的目的。從技術原理上也可以看出,四層模式下這些SYN攻擊都會被轉發到後端的伺服器上;而七層模式下這些SYN攻擊自然在負載均衡裝置上就截止,不會影響後臺伺服器的正常運營。另外負載均衡裝置可以在七層層面設定多種策略,過濾特定報文,例如SQL Injection等應用層面的特定攻擊手段,從應用層面進一步提高系統整體安全。

  現在的七層代理,主要還是著重於應用HTTP協議,所以其應用範圍主要是眾多的網站或者內部資訊平臺等基於B/S開發的系統。四層代理則對應其他TCP應用,例如基於C/S開發的系統。

  代表軟體:Nginx、Haproxy。

4、四層網路代理和七層網路代理區別

  根據上文對四層網路代理和七層網路代理介紹可以,它倆最直觀的區別是四層代理只進行了一次TCP請求,而七層代理進行了兩次TCP請求。

4.1 四層網路代理

  所謂四層網路代理,也就是主要透過報文中的目標地址和埠,再加上負載均衡裝置設定的伺服器選擇方式,決定最終選擇的內部伺服器。

  以常見的TCP為例,負載均衡裝置在接收到第一個來自客戶端的SYN 請求時,即透過上述方式選擇一個最佳的伺服器,並對報文中目標IP地址進行修改(改為後端伺服器IP),直接轉發給該伺服器。TCP的連線建立,即三次握手是客戶端和伺服器直接建立的,負載均衡裝置只是起到一個類似路由器的轉發動作。在某些部署情況下,為保證伺服器回包可以正確返回給負載均衡裝置,在轉發報文的同時可能還會對報文原來的源地址進行修改。

4.2 七層網路代理

  所謂七層網路代理,也稱為“內容交換”,也就是主要透過報文中的真正有意義的應用層內容,再加上負載均衡裝置設定的伺服器選擇方式,決定最終選擇的內部伺服器。

  以常見的TCP為例,負載均衡裝置如果要根據真正的應用層內容再選擇伺服器,只能先代理最終的伺服器和客戶端建立連線(三次握手)後,才可能接受到客戶端傳送的真正應用層內容的報文,然後再根據該報文中的特定欄位,再加上負載均衡裝置設定的伺服器選擇方式,決定最終選擇的內部伺服器。負載均衡裝置在這種情況下,更類似於一個代理伺服器。負載均衡和前端的客戶端以及後端的伺服器會分別建立TCP連線。所以從這個技術原理上來看,七層負載均衡明顯的對負載均衡裝置的要求更高,處理七層的能力也必然會低於四層模式的部署方式。

5、現在對網路代理的使用是隨著網站規模的提升根據不同的階段來使用不同的技術

  第一階段:利用Nginx或HAProxy進行單點的負載均衡,這一階段伺服器規模剛脫離開單伺服器、單資料庫的模式,需要一定的負載均衡,但是仍然規模較小沒有專業的維護團隊來進行維護,也沒有需要進行大規模的網站部署。這樣利用Nginx或HAproxy就是第一選擇,此時這些東西上手快, 配置容易,在七層之上利用HTTP協議就可以。這時是第一選擇。

  第二階段:隨著網路服務進一步擴大,這時單點的Nginx已經不能滿足,這時使用LVS或者商用Array就是首要選擇,Nginx此時就作為LVS或者Array的節點來使用,具體LVS或Array的是選擇是根據公司規模和預算來選擇,Array的應用交付功能非常強大,價效比也遠高於F5,商用首選,但是一般來說這階段相關人才跟不上業務的提升,所以購買商業負載均衡已經成為了必經之路。

  第三階段:這時網路服務已經成為主流產品,此時隨著公司知名度也進一步擴充套件,相關人才的能力以及數量也隨之提升,這時無論從開發適合自身產品的定製,以及降低成本來講開源的LVS,已經成為首選,這時LVS會成為主流。

  最終形成比較理想的基本架構為:Array/LVS — Nginx/Haproxy — Squid/Varnish — AppServer。

https://blog.csdn.net/vah101/article/details/121617249

https://www.cnblogs.com/buray/p/16294778.html

參考:跟位元組大佬聊了下四層代理和七層代理,我人傻掉了

參考:4層代理和7層代理的區別

相關文章