我的防火牆工作正常:來自互聯網的連接被轉發到 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 設定。