Nginx

為某些 HTTP 請求(nginx 日誌)記錄原始請求者 IP 而不是轉發代理 IP

  • April 22, 2017

我在我們的應用程序 Web 伺服器(gunicorn;它是一個 Django 應用程序)前面使用 nginx 作為反向代理。大多數訪問此 Web 應用程序的使用者實際上是通過轉發代理路由的。

由於請求通過轉發代理的伺服器,因此這些情況下的 IP 地址始終來自代理伺服器,而不是來自原始請求者。我想糾正這種情況。

所有來自轉發代理的請求都包含一個標頭via:proxy。在此類請求中,原始請求者 IP 在名為X-IORG-FBS-UIP(and also X-FORWARDED-FOR) 的單獨 HTTP 標頭欄位中發送。

我的問題是,如何配置 nginx 以檢測請求是否具有via:proxy標頭,如果有,則從X-IORG-FBS-UIP標頭中記錄原始請求者 IP?一個說明性的例子會很棒;提前致謝!我的 nginx 是 v 1.4.6


請注意,我沒有轉發代理使用的 IP 範圍。如果我這樣做了,解決此問題的一種方法是設置etc/nginx/conf.d/proxies_acl.conf

set_real_ip_from 1.2.3.0/22;
set_real_ip_from 23.22.20.0/22;
real_ip_header X-IORG-FBS-UIP;

試試這個。有興趣聽聽它是否有效。如果您有任何未翻譯的客戶,它會破壞這一點。

set_real_ip_from 0.0.0.0/0;
real_ip_header X-IORG-FBS-UIP;

您上面的 set_real_ip_from 和 real_ip_header 語句是執行此操作的標準方法。您的情況與大多數人的情況之間的唯一區別是您不知道代理的 IP 地址。0.0.0.0/0 表示“每個 IP 地址”,因此上面的語句說“對於每個請求,從 X-IORG-FBS-UIP 標頭獲取日誌的客戶端 IP”。我的猜測是,如果該標頭不存在,它將使用實際 IP。

在大多數情況下,您可以獲得代理的 IP 地址。AWS、CloudFlare 等。為什麼不知道代理的 IP?

我還注意到你幾個月前問了一個幾乎相同的問題,並接受了答案。如果有人沒有回答您的問題,請不要將其標記為答案。

請求的替代方法 - 不起作用

您要求基於 via:proxy 標頭的替代方法。我不相信這是可能的。我寫了這個

if ($http_X_via:proxy) {
 set_real_ip_from $remote_addr;
 real_ip_header X-IORG-FBS-UIP;
}

但它失敗了。Nginx 說 set_real_ip_from 不能進入 if 塊。這意味著您必須提前知道您的 IP,或者使用我上面的其他解決方案。

引用自:https://serverfault.com/questions/845878