獲取用戶IP地址的三個屬性的區別(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
一、沒有使用代理服務器的情況:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 沒數值或不顯示
HTTP_X_FORWARDED_FOR = 沒數值或不顯示
二、使用透明代理服務器的情況:Transparent Proxies
REMOTE_ADDR = 最後一個代理服務器 IP
HTTP_VIA = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 您的真實 IP ,經過多個代理服務器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
這類代理服務器還是將您的信息轉發給您的訪問對象,無法達到隱藏真實身份的目的。
三、使用普通匿名代理服務器的情況:Anonymous Proxies
REMOTE_ADDR = 最後一個代理服務器 IP
HTTP_VIA = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 代理服務器 IP ,經過多個代理服務器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
隱藏了您的真實IP,但是向訪問對象透露了您是使用代理服務器訪問他們的。
四、使用欺騙性代理服務器的情況:Distorting Proxies
REMOTE_ADDR = 代理服務器 IP
HTTP_VIA = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 隨機的 IP ,經過多個代理服務器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
告訴了訪問對象您使用了代理服務器,但編造了一個虛假的隨機IP代替您的真實IP欺騙它。
五、使用高匿名代理服務器的情況:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服務器 IP
HTTP_VIA = 沒數值或不顯示
HTTP_X_FORWARDED_FOR = 沒數值或不顯示 ,經過多個代理服務器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
完全用代理服務器的信息替代了您的所有信息,就象您就是完全使用那臺代理服務器直接訪問對象。
------------------------------------------------------------------------------------------------------------
proxy_pass http://yourdomain.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
-
在默認情況下,Nginx 並不會對 XFF 頭做任何處理
- 此時 Nginx 後面的 Resin/Apache/Tomcat 通過 request.getHeader("X-FORWARDED-FOR") 獲得的ip仍然是原始ip。
-
當 Nginx 設置 X-Forwarded-For 等於 $proxy_add_x_forwarded_for 時:
-
如果從CDN過來的請求沒有設置 XFF 頭(通常這種事情不會發生),XFF 頭爲 CDN 的ip
- 此時相對於 Nginx 來說,客戶端就是 CDN
-
如果 CDN 設置了 XFF 頭,我們這裏又設置了一次,且值爲$proxy_add_x_forwarded_for 的話:
- XFF 頭爲“客戶端IP,Nginx負載均衡服務器IP”,這樣取第一個值即可
- 這也就是大家所常見的場景!
-
如果從CDN過來的請求沒有設置 XFF 頭(通常這種事情不會發生),XFF 頭爲 CDN 的ip
Client -> Apache WebServer + Weblogic http plugin -> Weblogic Instances
proxy_set_header HTTP_CLIENT_IP $remote_addr;
內網IP:172.16.100.10
客戶端IP:123.123.123.123
測試頁面: test.jsp
<%
out.println("x-forwarded-for: " + request.getHeader("x-forwarded-for"));
out.println("remote hosts: " + request.getRemoteAddr());
%>
nginx 配置一proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;wget測試wget -O aa --header="X-Forwarded-For:192.168.0.1" "http://test.com/test.jsp"頁面返回結果:x-forwarded-for: 192.168.0.1, 123.123.123.123remote hosts: 172.16.100.10curl測試curl -H "X-Forwarded-For:192.168.0.1" "http://test.com/test.jsp"x-forwarded-for: 192.168.0.1, 123.123.123.123remote hosts: 172.16.100.10
nginx 配置二
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
wget測試:
wget -O aa --header="X-Forwarded-For:192.168.0.1" "http://test.com/test.jsp"
頁面返回結果:
x-forwarded-for: 123.123.123.123
remote hosts: 172.16.100.10
curl測試
curl -H "X-Forwarded-For:192.168.0.1" "http://test.com/test.jsp"
x-forwarded-for: 123.123.123.123
remote hosts: 172.16.100.10
測試結果:
1、配置
增加了一個真實ip X-Forwarded-For,並且順序是增加到了“後面”。
2、配置
清空了客戶端僞造傳入的X-Forwarded-For,
保證了使用 request.getHeader("x-forwarded-for") 獲取的ip爲真實ip,
或者用“,”分隔,截取 X-Forwarded-For 最後的值。