HTTP 請求頭中的 Remote_Addr,X-Forwarded-For,X-Real-IP


REMOTE_ADDR

表示發出請求的遠程主機的 IP 地址,remote_addr代表客戶端的IP,但它的值不是由客戶端提供的,而是服務端根據客戶端的ip指定的,當你的瀏覽器訪問某個網站時,假設中間沒有任何代理,那么網站的web服務器Nginx,Apache等)就會把remote_addr設為你的機器IP,如果你用了某個代理,那么你的瀏覽器會先訪問這個代理,然后再由這個代理轉發到網站,這樣web服務器就會把remote_addr設為這台代理機器的IP

x_forwarded_for

簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理或者負載均衡服務器時才會添加該項,正如上面所述,當你使用了代理時,web服務器就不知道你的真實IP了,為了避免這個情況,代理服務器通常會增加一個叫做x_forwarded_for的頭信息,把連接它的客戶端IP(即你的上網機器IP)加到這個頭信息里,這樣就能保證網站的web服務器能獲取到真實IP

格式一般為:

X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3

代表 請求由1.1.1.1發出,經過三層代理,第一層是2.2.2.2,第二層是3.3.3.3,而本次請求的來源IP4.4.4.4是第三層代理

場景1

是很簡單的場景,Nginx Proxy直接把請求往后轉發,沒有做任何處理

Nginx Proxy
192.168.107.107 nginx.conf
location /test {
    proxy_pass http://192.168.107.112:8080;
}
192.168.107.112 nginx.conf
location /test {
    proxy_pass http://192.168.107.114:8080;
}
Nginx Proxy就是簡單的把請求往后轉發。
Nginx Backend
192.168.107.114 nginx.conf
location /test {
    default_type text/html;
    charset gbk;
    echo "$remote_addr || $http_x_forwarded_for";
}

Nginx Backend輸出客戶端IP($remote_addr)和X-Forwarded-For請求頭($http_x_forwarded_for),當訪問服務時輸出結果如下所示:

192.168.107.112 ||

分析
1.$remote_addr代表客戶端IP,當前配置的輸出結果為最后一個代理服務器的IP,並不是真實客戶端IP; 
2.在沒有特殊配置情況下,X-Forwarded-For請求頭不會自動添加到請求頭中,即Nginx Backend的$http_x_forwarded_for輸出為空。

場景2

通過添加X-Real-IP和X-Forwarded-For捕獲客戶端真實IP。

Nginx Proxy
192.168.107.107 nginx.conf
location /test {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.107.112:8080;
}
192.168.107.112 nginx.conf
location /test {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.107.114:8080;
}
Nginx Backend
192.168.107.114 nginx.conf
location /test {
    default_type text/html;
    charset gbk;
    echo "$remote_addr ||$http_x_real_ip  ||$http_x_forwarded_for";
}

當訪問服務時,輸出結果為:

192.168.107.112 || 192.168.162.16 || 192.168.162.16, 192.168.107.107

分析
1.在離用戶最近的反向代理NginxProxy 1,通過“proxy_set_header X-Real-IP $remote_addr”把真實客戶端IP寫入到請求頭X-Real-IP,在NginxBackend輸出$http_x_real_ip獲取到了真實客戶端IP;而Nginx Backend的“$remote_addr”輸出為最后一個反向代理的IP; 
2.“proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for”的是把請求頭中的X-Forwarded-For與$remote_addr用逗號合起來,如果請求頭中沒有X-Forwarded-For則$proxy_add_x_forwarded_for為$remote_addr。 
X-Forwarded-For代表了客戶端IP,反向代理如Nginx通過$proxy_add_x_forwarded_for添加此項,X-Forwarded-For的格式為X-Forwarded-For:real client ip, proxy ip 1, proxy ip N,每經過一個反向代理就在請求頭X-Forwarded-For后追加反向代理IP。 
到此我們可以使用請求頭X-Real-IP和X-Forwarded-For來獲取客戶端IP及客戶端到服務端經過的反向代理IP了。這種方式還是很麻煩,$remote_addr並不是真實客戶端IP。

X-Real-IP

當有多個代理時候,可以在第一個反向代理上配置“proxy_set_header X-Real-IP $remote_addr” 獲取真實客戶端IP;

-----------------------------------------

X-Forwarded-For一般是每一個非透明代理轉發請求時會將上游服務器的IP地址追加到X-Forwarded-For的后面,使用英文逗號分割
X-Real-IP一般是最后一級代理將上游IP地址添加到該頭中
X-Forwarded-For是多個IP地址,而X-Real-IP是一個

 

 

 

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-Forwarded-For

https://www.cnblogs.com/diaosir/p/6890825.html

https://www.jianshu.com/p/15f3498a7fad

https://blog.51cto.com/victor1980/1066652


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM