圖解「正向代理」的原理 + 實踐應用

ITPUB社群發表於2023-09-20

來源:悟空聊架構

本文主要內容如下:

圖解「正向代理」的原理 + 實踐應用

在工作中經常和正向代理和反向代理打交道,有必要總結下正向代理的原理和實踐應用了。(反向代理安排在下篇吧)

如何理解正向代理

代理(Proxy)服務通常被我們稱為正向代理服務,如下圖所示:

圖解「正向代理」的原理 + 實踐應用
  • 客戶端:圖中的客戶端我用電腦和手機作為示意,客戶端指在計算機網路中與伺服器進行通訊的一種計算機程式或裝置。客戶端通常請求伺服器提供某種服務,如獲取網頁、傳送電子郵件、下載檔案等。客戶端與伺服器之間的通訊通常遵循客戶端-伺服器模型,其中客戶端發出請求,而伺服器響應這些請求。
  • 站點:可以理解為網路中的目標伺服器,當客戶端想要訪問目標伺服器的資源時,需要透過網路通訊才能獲取到資源。
  • 正向代理伺服器:在客戶端和站點之間,起到了一個轉發請求的作用。正向代理伺服器不支援外部對內部網路的訪問請求。正向代理伺服器和客戶端是緊密聯絡的,我們工作中用到的 VPN(虛擬專用網路) 就是一種正向代理的方式。
  • 箭頭:箭頭的方向代表訪問的方向。

大白話聊聊正向代理

一位企業老總,他有一位助理小李,當老總想要訂火車票時,就會委託小李幫忙訂票,當老總想要訂酒店時,小李就會負責查詢合適的酒店並安排老總入住。助理小李幫老總辦了很多事情,也就是代理了一些事情,而助理小李就充當了一個代理伺服器的角色。如下圖所示:

圖解「正向代理」的原理 + 實踐應用

正向代理的作用

企業可以使用正向代理來增強網路安全、訪問控制、效能最佳化和隱私保護等方面的功能。以下是企業中如何使用正向代理的一些常見場景和方法:

  • 遠端辦公: 在遠端辦公環境中,企業可以使用正向代理來幫助員工安全地連線到公司內部網路,訪問內部資源,而不必暴露公司的內部網路直接在網際網路上。

  • 訪問控制和安全性: 企業可以在其網路中部署正向代理伺服器,以實施訪問控制策略。透過正向代理,可以限制員工訪問特定網站或網際網路資源,從而減少潛在的網路威脅。這有助於保護企業免受惡意軟體、惡意網站和網路攻擊的影響。

  • 內容過濾和快取: 正向代理可以用於過濾和快取網路內容,以提高效能並減少頻寬消耗。代理伺服器可以快取常用的資源,例如網頁、影像和影片,從而減少對外部伺服器的請求,提高使用者體驗。

  • 安全審計和監控: 企業可以使用正向代理來監視員工的網路活動,以確保合規性和安全性。代理伺服器可以記錄訪問日誌,以便後續的安全審計和監控。

  • 反病毒和惡意軟體保護: 正向代理可以用於檢測和攔截網路流量中的惡意軟體、病毒和惡意連結。這有助於保護企業內部網路免受惡意軟體的傳播和感染。

  • 隱私保護: 企業可以使用正向代理來保護員工的隱私。代理伺服器可以隱藏員工的真實IP地址,從而提高員工的線上隱私。

  • 訪問受限資源: 有些企業需要訪問特定地理位置或IP受限的網際網路資源。正向代理可以用於繞過這些限制,以訪問需要的資源。

  • 負載均衡: 企業可以使用正向代理來實現負載均衡,將客戶端請求分發到多個伺服器,以提高效能和可用性。這對於高流量的企業應用程式和網站非常有用。

企業中如何使用正向代理

在企業中,正向代理工具用於多種場景,以增強網路安全性、訪問控制、效能最佳化和隱私保護。以下是一些常見的正向代理工具和它們在不同場景中的用途:

  • Nginx: Nginx 是一款高效能的反向代理伺服器,但也可以配置為正向代理。它通常被用於負載均衡、訪問控制和內容快取。
  • 自建VPN: 一些企業和個人選擇自行搭建虛擬私人網路(VPN)來實現正向代理功能。這可以透過使用開源VPN軟體如OpenVPN或商業VPN服務來實現。
  • CDN服務: 一些CDN(內容分發網路)服務提供商也提供正向代理功能,以加速訪問、快取內容和提供安全性。
  • Squid: Squid 是一個開源的代理伺服器軟體,被廣泛用於企業和學校網路中。它提供了強大的訪問控制、快取和效能最佳化功能,常用於網路管理和內容過濾。
  • CCProxy(若快代理伺服器): CCProxy 是一款商業代理伺服器軟體,又稱為"若快",它提供了訪問控制、頻寬控制和網路加速功能。
  • TinyProxy: TinyProxy 是一個輕量級的代理伺服器軟體,適用於小型網路環境。它的配置相對簡單,適合快速搭建正向代理。
  • Glype: Glype 是一個基於Web的代理指令碼,可以讓使用者透過瀏覽器訪問被封鎖的網站。它常被用於構建Web代理服務,以繞過網際網路審查。

專案中如何使用正向代理

以下是一個 Nginx 的正向代理的配置,

http {
   server {
       listen       80;
       server_name  

       location / {
           proxy_pass
           proxy_set_header Host $host;
       }
   }
}

上述配置表明當客戶端透過瀏覽器或其他方式傳送請求到 這個域名時,Nginx 將監聽 HTTP 請求的埠 80,並將這些請求代理到 target_server 指定的目標伺服器。這是一個典型的正向代理配置,用於隱藏客戶端的真實 IP 地址,同時將請求轉發到其他伺服器上。這在一些網路安全和訪問控制方面非常有用。

真實場景的一個應用

我們專案中大量使用 Nginx 作為正向代理和反向代理,這裡舉一個我用 Nginx 作為正向代理的真實案例。

背景

公司生產一些硬體裝置,而這些裝置在生產的過程中,需要呼叫我們後臺系統的介面,我們後臺系統所在的網路和裝置的網路並不在同一個網段內,想要實現網路互通,我們在裝置和系統之間加了一層正向代理伺服器,裝置先將請求傳送給代理伺服器,由代理伺服器將請求轉發給後臺系統。

解決方案

如下圖所示:

圖解「正向代理」的原理 + 實踐應用

裝置 1 和裝置 2 的 IP 在 192.168.1.0/24 IP 地址段內,HTTP 請求先發到代理伺服器,然後轉發到後臺伺服器叢集的閘道器地址(192.168.52.123)。

代理伺服器上有兩個網路卡,和裝置之間的網路是通的,和伺服器叢集之間的網路也是通的。這樣就能保證裝置的請求能夠正常傳送到系統了。

疑問:為啥不把後臺系統的伺服器 IP 改成和裝置同一網段?

答:問題出在不能保證裝置和後臺系統在同一區域網內。有的裝置是在其他區域網內生產的,即使在同一個網段內,但是是跨區域網的,裝置和後臺系統也是無法連通的。

完整的 NGINX 配置如下:

圖解「正向代理」的原理 + 實踐應用

正向代理後如何獲取真實 IP

另外我們的系統還需要獲取裝置的真實 IP,這就需要在 Nginx 加上配置:

# location 模組中加入以下配置:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

上述配置可以暴露客戶端的真實 IP 地址給目標伺服器,特別是 proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 這兩行配置。

讓我解釋一下這三行配置的含義:

  1. proxy_set_header Host $host;:這一行配置將客戶端請求中的 Host 頭部資訊傳遞給目標伺服器。這是正常的 HTTP 頭部資訊傳遞,不涉及客戶端 IP 地址。
  2. proxy_set_header X-Real-IP $remote_addr;:這一行配置將客戶端的真實 IP 地址作為 X-Real-IP 頭部資訊傳遞給目標伺服器。這意味著目標伺服器可以訪問到客戶端的真實 IP 地址。
  3. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:這一行配置將客戶端的 IP 地址新增到 X-Forwarded-For 頭部資訊中,並傳遞給目標伺服器。這是為了記錄代理請求的前幾個客戶端的 IP 地址,通常包括客戶端的真實 IP 地址。

當目標伺服器收到這些頭部資訊時,它可以透過 X-Real-IPX-Forwarded-For 頭部來獲取客戶端的真實 IP 地址。

容易誤以為的正向代理

比如我的網站專案 passjava.cn,專案是純靜態頁面,部署在了一臺伺服器上。如下圖所示,當我在瀏覽器訪問這個域名時,請求會先經過 DNS 域名解析,拿到域名繫結的 IP 地址,而這個 IP 地址又是我購買的雲伺服器地址,在這個伺服器上有網站的靜態頁面。

圖解「正向代理」的原理 + 實踐應用

以下是 Nginx 的配置:

server {
   listen       80;
   server_name  

   location / {
       root   /home/ubuntu/docs;
       index  index.html;
   }
}

我開始以為這是一個正向代理的配置,其實並不是,這個配置只是一個簡單的虛擬主機配置,用於託管靜態網站。這個配置定義了一個 Nginx 虛擬主機,用於處理來自 域名的 HTTP 請求,並提供靜態網頁。

解釋下這些配置項含義:

  1. server { ... }:這是一個 server 塊,用於定義一個虛擬主機。每個 server 塊通常用於配置一個不同的虛擬主機,以處理特定域名或 IP 地址的請求。
  2. listen 80;:這一行指定了監聽的埠號,這裡是 80,表示該虛擬主機將處理來自客戶端的 HTTP 請求,這是 HTTP 的標準埠號。
  3. server_name :這一行定義了虛擬主機所處理的域名。在這個例子中,虛擬主機將處理來自 域名的請求。當客戶端傳送請求到這個域名時,Nginx 將使用這個 server 塊中的配置來響應請求。
  4. location / { ... }:這是一個 location 塊,它定義瞭如何處理特定 URI(統一資源識別符號)路徑的請求。在這裡,location / 匹配所有請求的根路徑。
  5. root /home/ubuntu/docs;:這一行指定了 Nginx 伺服器上要提供的檔案的根目錄。當客戶端請求根路徑時,Nginx 將在 /home/ubuntu/docs 目錄中查詢檔案來提供給客戶端。
  6. index index.html;:這一行指定了預設的索引檔案,當客戶端請求的路徑是一個目錄時,Nginx 將嘗試提供 index.html 檔案作為預設文件。如果 /home/ubuntu/docs 目錄中存在 index.html 檔案,它將作為預設文件提供給客戶端。

注意:正向代理配置通常涉及將客戶端的請求代理到其他伺服器,而不是提供自己的網頁內容。正向代理的配置會包括一些額外的代理設定,用於將請求轉發到目標伺服器,而不是提供本地靜態檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2984631/,如需轉載,請註明出處,否則將追究法律責任。

相關文章