圖解「正向代理」的原理 - 實踐應用
你好,我是悟空。
本文主要內容如下:
在工作中經常和正向代理和反向代理打交道,有必要總結下正向代理的原理和實踐應用了。(反向代理安排在下篇吧)
如何理解正向代理
代理(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 www.passjava.cn;
location / {
proxy_pass http://target_server;
proxy_set_header Host $host;
}
}
}
上述配置表明當客戶端通過瀏覽器或其他方式發送請求到 www.passjava.cn
這個域名時,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;
這兩行配置。
讓我解釋一下這三行配置的含義:
-
proxy_set_header Host $host;
:這一行配置將客戶端請求中的Host
頭部信息傳遞給目標服務器。這是正常的 HTTP 頭部信息傳遞,不涉及客戶端 IP 地址。 -
proxy_set_header X-Real-IP $remote_addr;
:這一行配置將客戶端的真實 IP 地址作爲X-Real-IP
頭部信息傳遞給目標服務器。這意味着目標服務器可以訪問到客戶端的真實 IP 地址。 -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
:這一行配置將客戶端的 IP 地址添加到X-Forwarded-For
頭部信息中,並傳遞給目標服務器。這是爲了記錄代理請求的前幾個客戶端的 IP 地址,通常包括客戶端的真實 IP 地址。
當目標服務器收到這些頭部信息時,它可以通過 X-Real-IP
或 X-Forwarded-For
頭部來獲取客戶端的真實 IP 地址。
容易誤以爲的正向代理
比如我的網站項目 passjava.cn,項目是純靜態頁面,部署在了一臺服務器上。如下圖所示,當我在瀏覽器訪問這個域名時,請求會先經過 DNS 域名解析,拿到域名綁定的 IP 地址,而這個 IP 地址又是我購買的雲服務器地址,在這個服務器上有網站的靜態頁面。
以下是 Nginx 的配置:
server {
listen 80;
server_name www.passjava.cn;
location / {
root /home/ubuntu/docs;
index index.html;
}
}
我開始以爲這是一個正向代理的配置,其實並不是,這個配置只是一個簡單的虛擬主機配置,用於託管靜態網站。這個配置定義了一個 Nginx 虛擬主機,用於處理來自 www.passjava.cn 域名的 HTTP 請求,並提供靜態網頁。
解釋下這些配置項含義:
-
server { ... }
:這是一個 server 塊,用於定義一個虛擬主機。每個 server 塊通常用於配置一個不同的虛擬主機,以處理特定域名或 IP 地址的請求。 -
listen 80;
:這一行指定了監聽的端口號,這裏是 80,表示該虛擬主機將處理來自客戶端的 HTTP 請求,這是 HTTP 的標準端口號。 -
server_name www.passjava.cn;
:這一行定義了虛擬主機所處理的域名。在這個例子中,虛擬主機將處理來自 www.passjava.cn 域名的請求。當客戶端發送請求到這個域名時,Nginx 將使用這個 server 塊中的配置來響應請求。 -
location / { ... }
:這是一個 location 塊,它定義瞭如何處理特定 URI(統一資源標識符)路徑的請求。在這裏,location /
匹配所有請求的根路徑。 -
root /home/ubuntu/docs;
:這一行指定了 Nginx 服務器上要提供的文件的根目錄。當客戶端請求根路徑時,Nginx 將在/home/ubuntu/docs
目錄中查找文件來提供給客戶端。 -
index index.html;
:這一行指定了默認的索引文件,當客戶端請求的路徑是一個目錄時,Nginx 將嘗試提供index.html
文件作爲默認文檔。如果/home/ubuntu/docs
目錄中存在index.html
文件,它將作爲默認文檔提供給客戶端。
注意:正向代理配置通常涉及將客戶端的請求代理到其他服務器,而不是提供自己的網頁內容。正向代理的配置會包括一些額外的代理設置,用於將請求轉發到目標服務器,而不是提供本地靜態文件。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/v_do73K91_CXQZTIRlPZeA