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

你好,我是悟空。

本文主要內容如下:

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

如何理解正向代理

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

大白話聊聊正向代理

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

正向代理的作用

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

企業中如何使用正向代理

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

項目中如何使用正向代理

以下是一個 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; 這兩行配置。

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

  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  www.passjava.cn;

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

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

解釋下這些配置項含義:

  1. server { ... }:這是一個 server 塊,用於定義一個虛擬主機。每個 server 塊通常用於配置一個不同的虛擬主機,以處理特定域名或 IP 地址的請求。

  2. listen 80;:這一行指定了監聽的端口號,這裏是 80,表示該虛擬主機將處理來自客戶端的 HTTP 請求,這是 HTTP 的標準端口號。

  3. server_name www.passjava.cn;:這一行定義了虛擬主機所處理的域名。在這個例子中,虛擬主機將處理來自 www.passjava.cn 域名的請求。當客戶端發送請求到這個域名時,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 文件,它將作爲默認文檔提供給客戶端。

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/v_do73K91_CXQZTIRlPZeA