如何在Nginx所設置的Proxy中可以取得真實客戶的IP位址

如何在Nginx所設置的Proxy架構中可以取得真實客戶的IP位址

常見的情境是需要對客戶端IP進行特定的處理,例如:限定存去次數、流量或是啟用快取服務,此時及需要藉由來源客戶端的IP位置來關聯。

設定前先來說明一下一些變數名稱:

$remote_addr

Nginx核心模組中(ngx_http_core_module)中的內建變數$remote_addr就是用戶端的IP位址。


X-Forwarded-For

X-Forwarded-For(XFF),是一個用來辨識通過HTTP Proxy或是load balance連接到web server,用戶端最原始的IP位址使用的HTTP Request header欄位。

X-Real-IP

X-Real-IP為傳統上HTTP reverse proxy會使用非標準的header去告知upstream server關於來源戶端的IP位址,之一個HTTP header欄位。在Nginx的文件(http://nginx.org/en/docs/http/ngx_http_proxy_module.html)範例中可以看到。


$proxy_add_x_forwarded_for

Nginx Http proxy模組中(ngx_http_proxy_module)中的內建變數$proxy_add_x_forwarded_for,會使用HTTP Request Header, X-Forwarded-For將來源IP記錄於此,當request經過多台proxy或是load balance產生的多筆IP位址會以逗號分開來,如果一開始沒有設置X-Forwarded-For,那麼在模組中的$proxy_add_x_forwarded_for的值就會跟$remote_addr一樣。

通常可以透過下列的指令來設定

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


設定方法:

在第一層的proxy或是load balancer就先設定nginx的default.conf

 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


這個設定方法的原理是,第一層是第一個收到客戶端的request所以會知道來源端的真實IP,使用X-Real-IP將$remote_addr當作是來源IP,再透過X-Forwarded-For紀錄過程的中的$remote_addr,由最終端的web server進行處理。

可以透過設置Nginx log來觀察結果:


http {

  # ...

    ##
    # Logging Settings
    ##

    log_format specialLog '$remote_addr forwarded for $http_x_real_ip - $remote_user [$time_local]  '
                          '"$request" $status $body_bytes_sent '
                          '"$http_referer" "$http_user_agent"';

    access_log /var/log/nginx/access-special.log specialLog;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    # ...

}

留言

這個網誌中的熱門文章

如何關閉nouveau-kernel-driver,解決無法安裝Nvidia driver問題

如何客製VMware ESXi安裝光碟(加入Realtek驅動程式)