如何在Nginx所設置的Proxy中可以取得真實客戶的IP位址
如何在Nginx所設置的Proxy架構中可以取得真實客戶的IP位址
常見的情境是需要對客戶端IP進行特定的處理,例如:限定存去次數、流量或是啟用快取服務,此時及需要藉由來源客戶端的IP位置來關聯。
設定前先來說明一下一些變數名稱:
通常可以透過下列的指令來設定
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
設定方法:
在第一層的proxy或是load balancer就先設定nginx的default.conf
這個設定方法的原理是,第一層是第一個收到客戶端的request所以會知道來源端的真實IP,使用X-Real-IP將$remote_addr當作是來源IP,再透過X-Forwarded-For紀錄過程的中的$remote_addr,由最終端的web server進行處理。
可以透過設置Nginx log來觀察結果:
常見的情境是需要對客戶端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; # ... }
留言
張貼留言