一、http_x_forwarded_for的定義
http_x_forwarded_for是一個HTTP請求頭部,在經過代理後保留了原始客戶端IP地址並發送到了最終的伺服器。Nginx中該頭部的完整名稱是nginxhttp_x_forwarded_for。
當Nginx作為反向代理伺服器時,它會從客戶端收到一個HTTP請求,然後轉發給後端伺服器。這個轉發請求會導致客戶端的IP地址變成Nginx伺服器的IP地址。通過在請求頭中添加nginxhttp_x_forwarded_for欄位,可以在後端伺服器上看到真正的客戶端IP地址。
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
二、http_x_forwarded_for的作用
http_x_forwarded_for的主要作用是識別客戶端的真實IP地址,解決在代理伺服器中無法獲取真實IP的問題。
如果沒有nginxhttp_x_forwarded_for頭部,後端伺服器只能看到代理伺服器的IP地址。這可能導致錯誤日誌和安全問題。而添加了nginxhttp_x_forwarded_for頭部,則允許後端伺服器追蹤請求的來源,獲取真實IP地址。
三、http_x_forwarded_for的安全性問題
http_x_forwarded_for頭部可以被偽造,這可能導致安全問題。攻擊者可以通過篡改http_x_forwarded_for頭部來偽造客戶端的IP地址,從而進行攻擊。
為了解決此問題,可以通過在Nginx配置文件中添加以下代碼,限制http_x_forwarded_for的長度和內容。這樣可以防止攻擊者篡改http_x_forwarded_for頭部,同時保護伺服器的安全。
# set the maximum length of the x-forwarded-for header
http {
underscores_in_headers on;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# more good security measures
if ($http_x_forwarded_for ~ "^(.+,)?10\.")
{
return 403;
}
if ($http_x_forwarded_for ~ "^(.+,)?172\.([1][6-9]|[2]\d|[3][0-1])\.")
{
return 403;
}
if ($http_x_forwarded_for ~ "^(.+,)?192\.168\.")
{
return 403;
}
四、http_x_forwarded_for的使用場景
http_x_forwarded_for頭部是常用的伺服器配置,適用於以下場景:
- 反向代理伺服器:使用Nginx等反向代理伺服器時,http_x_forwarded_for可以識別客戶端真實IP地址。
- CDN緩存加速:CDN緩存加速伺服器也需要使用http_x_forwarded_for頭部來獲取真實的客戶端IP地址。
- 防火牆安全:可以通過限制http_x_forwarded_for的長度和內容,來保護伺服器的安全。
五、http_x_forwarded_for的注意事項
http_x_forwarded_for頭部可能會受到代理伺服器的影響而變化。因此需要特別注意以下情況:
- 代理鏈:如果請求通過多個代理伺服器,則http_x_forwarded_for頭部可能包含多個IP地址。
- 匿名代理:如果請求通過匿名代理伺服器,則http_x_forwarded_for頭部可能包含虛假的IP地址。
- 緩存:CDN緩存等伺服器可能會緩存http_x_forwarded_for頭部,導致後續請求還是使用的緩存的頭部。
- 客戶端:客戶端也有可能篡改http_x_forwarded_for頭部,從而影響真實的IP地址。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/240811.html