從轉送的連線讀取“來源IP”

從轉送的連線讀取“來源IP”

我的防火牆工作正常:來自互聯網的連接被轉發到 NGINX 伺服器,然後相應地進行分發,並且應用程式伺服器除了內部日誌之外都可以正常工作。

我面臨的問題是關於我們的應用程式伺服器接收的 IP:它們不是“客戶端 IP”,而是當前的 NGINX IP。

考慮這個網路:客戶端 IP 1、防火牆 IP 2、NGINX IP 3、網路伺服器 IP 4。

在防火牆上,我們看到封包被轉送到 NGINX,但在 NGINX 上,tcpdump我們看到來自自己的 NGINX IP 3 而不是原始來源 IP 1 的傳入連線。

關鍵是,在網頁伺服器日誌中,我們看到輸入連線為 IP 3,預期為 IP 1。

是否是防火牆或 NGINX 設定錯誤?關於如何解決這個問題有什麼想法嗎?

當前配置(/etc/nginx/sites-enabled/app.domain.com):

...
location ^~ / {
proxy_pass      http://10.0.0.11;
proxy_set_header        Host                    $host;
proxy_set_header        X-Real-IP               $remote_addr;
proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;
proxy_set_header        X-Forwarded-Proto       $scheme;
}
...

答案1

這是正常操作。當 nginx 是反向代理時,它會打開到最終目的地的連接,並從客戶端代理到應用程式伺服器。來源 IP 不能是 nginx IP 位址以外的任何其他值,否則 TCP 連線將無法運作。

您需要將應用程式伺服器設定為使用X-Real-IP標頭中指定的 IP 位址,而不是來自 TCP 連線的 IP 位址。

答案2

這種情況的解決方案是更改 C# 程式碼,如下所示。未對防火牆或 nginx 進行任何變更。

var userIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

之前失敗的嘗試:

var userIP = Request.ServerVariables["X_FORWARDED_FOR"];
var userIP = Request.ServerVariables["X-REAL-IP"];
var userIP = Request.ServerVariables["REMOTE_ADDR"];
var userIP = Request.UserHostAddress;

感謝所有貢獻者幫助澄清問題不在於防火牆,也不在於 nginx 設定。

相關內容