今天,我想演示 OpenResty Edge 的另一個功能:如何在請求經過第三方代理時,從 OpenResty Edge 獲取真實的客戶端 IP 地址。

在大多數情況下,如果請求經過第三方代理,OpenResty Edge 接收到的客戶端地址將是代理伺服器的地址。

Embeded image

有時,我們需要獲取真實的客戶端 IP 地址,用於條件判斷、請求頻率限制或日誌記錄等場景。

Embeded image

在全域性配置中設定 “真實來源 IP 信任地址” 和 “真實 IP 來源”

讓我們進入 OpenResty Edge 的 Admin Web 控制檯。這是我們的控制檯的樣例部署。每個使用者都有自己的本地部署。

Screenshot

首先,進入 “Global Config” 頁面。

Screenshot

這裡需要進行多項配置。

Screenshot

首先我們要設定 Trusted hosts to set real IP

Screenshot

Trusted hosts to set real IP 是允許設定 Real IP header 的 IP 地址列表。如果請求來自不受信任的主機,Real IP header 將被忽略。

輸入 IP 地址 52.53.251.226

Screenshot

接下來,我們需要指定帶有代理真實 IP 的請求頭。一般情況下,是 X_Forwarded_For

Screenshot

在請求頭中如果存在多個 IP 地址,系統將採用列表中最後一個 IP 地址。

Embeded image

儲存。

Screenshot

我們需要釋出來推送這個新改動。

Screenshot

點選這個按鈕。

Screenshot

釋出!

Screenshot

改動現在已經同步到所有的閘道器伺服器。現在,剛才的改動已經被推送到所有的閘道器叢集和伺服器。

Embeded video

Embeded video

Embeded video

我們的配置變化不需要伺服器過載、重啟或二進位制升級。所以它是非常高效和可擴充套件的。

Embeded image

配置應用使其輸出客戶端地址

現在我們來設定應用,使其能夠輸出客戶端地址。

Screenshot

我們可以繼續使用之前的示例應用,test-edge.com。

Screenshot

進入該應用。

Screenshot

轉到 “Page Rules” 頁面。

Screenshot

我們已經定義了一個頁面規則。這個頁面規則設定了一個反向代理到某個上游。

Screenshot

我們將使用 EdgeLang 建立一個頁面規則,來輸出客戶端地址。我們已經在一個專門的影片中對 EdgeLang 進行了介紹。

Screenshot

點選 “Edit” 按鈕。

Screenshot

條件設定為真,表示接下來的部分將在任何情況下都會執行。

Screenshot

輸出客戶端地址。

Screenshot

儲存。

Screenshot

像往常一樣,我們需要釋出來推送這個新改動。

Screenshot

點選這個按鈕。

Screenshot

釋出!

Screenshot

改動現在已經同步到所有的閘道器伺服器。

Screenshot

驗證在 OpenResty Edge 中接收到的客戶端地址

我們將對閘道器伺服器發出請求,並驗證在 OpenResty Edge 上接收到的客戶端地址。

我們透過終端登入到位於美國的遠端伺服器,將其作為代理使用。

Screenshot

使用 curl 命令列工具傳送 HTTP 請求。

curl http://test-edge.com/

Screenshot

可以看到,輸出的客戶端地址是代理的地址。

Screenshot

接下來,我們將傳送一個帶有 X-Forwarded-For 頭部的 HTTP 請求,其中包含了真實的客戶端地址。

curl http://test-edge.com/ -H "X-Forwarded-For: 104.28.243.40"

Screenshot

可以看到,輸出的客戶端地址是真實的地址:104.28.243.40。

Screenshot

現在來看一下 X-Forwarded-For 頭包含多個 IP 地址的情況。

curl http://test-edge.com/ -H "X-Forwarded-For: 104.28.243.40, 105.56.18.52"

Screenshot

可以看到輸出的是頭部的最後一個 IP 地址。

Screenshot

退出該伺服器。

Screenshot

我們登入到另一個伺服器,該伺服器不在受信任的主機列表中。

Screenshot

同樣傳送帶有 X-Forwarded-For 頭的請求。

curl http://test-edge.com/ -H "X-Forwarded-For: 104.28.243.40"

Screenshot

可以看到,輸出的客戶端地址是代理的地址。

Screenshot

真實 IP 會影響所有與客戶端 IP 相關的事務。

來看一些例子。Client cityClient address 將會受到影響。

Screenshot

Screenshot

Limit request rate 動作也會受到影響。

Screenshot

然而,限制 HTTPS 請求的 SSL 或 TLS 握手速率的功能不會受影響,因為在握手過程中沒有重寫客戶端地址。

Screenshot

關於 OpenResty Edge

OpenResty Edge 是我們自主研發的一款最適合微服務和分散式流量的全能型閘道器軟體。它提供了諸如頁面規則、Web 應用防火牆(WAF)、負載均衡等各種功能。

如果你喜歡這個教程,請訂閱這個部落格網站和我們的 YouTube 頻道B 站頻道。謝謝!

關於作者

章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。

章亦春(Github ID: agentzh),生於中國江蘇,現定居美國灣區。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、雅虎、阿里巴巴, 是 “邊緣計算“、”動態追蹤 “和 “機器程式設計 “的先驅,擁有超過 22 年的程式設計及 16 年的開源經驗。作為擁有超過 4000 萬全球域名使用者的開源專案的領導者。他基於其 OpenResty® 開源專案打造的高科技企業 OpenResty Inc. 位於美國矽谷中心。其主打的兩個產品 OpenResty XRay(利用動態追蹤技術的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最適合微服務和分散式流量的全能型閘道器軟體),廣受全球眾多上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源專案貢獻了累計超過百萬行程式碼,其中包括,Linux 核心、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,並編寫過 60 多個開源軟體庫。

關注我們

如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號

翻譯

我們提供了英文版原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!