nginx 獲取源IP 獲取通過N層Nginx轉發的訪問來源真實IP

1. nginx 配置文件中獲取源IP的配置項
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; #通常的web服務器用這個 X-Real-IP 來獲取源IP
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for; #若是nginx 服務器是做爲反向代理服務器的,則這個配置項是必須的;不然看不到源IPhtml

2. nginx 代理服務器的模塊
nginx 經過 ngx_http_proxy_module模塊 實現反向代理;在nginx 啓動服務load conf時,
 就會讀取 proxy_set_header 的配置項;來獲取須要的變量。proxy_set_header 是用來設置請求的header的;
 好比:設置上面的host  X-Real-IP x-forwarded-for linux

 

3.   3個配置項的含義
host:只要 用戶在瀏覽器中訪問的域名綁定了 VIP VIP 下面有RS;則就用$host ;host是訪問URL 中的域名和端口  www.taobao.com:80
X-real-IP:把源IP 【$remote_addr,創建HTTP鏈接header裏面的信息】賦值給X-Real-IP;這樣在代碼中 $X-Real-IP
 來獲取 源IP
x-forwarded-for: 在nginx 做爲代理服務器時,設置的IP列表,會把通過的機器ip,代理機器ip都記錄下來,用 【,】隔開;代碼中用 echo $x-forwarded-for |awk -F, '{print $1}' 來做爲源IPnginx


4.  參考文章
http://zhidao.baidu.com/link?url=Yo2Ll5pSBADoGrAoTEBpU8pRrCk5rR57FTGTSSwUzkioDPRJ52zAKLpME1tcgjxv4-WEIwg5brp3g_VophAHk_web

http://www.cnblogs.com/discuss/articles/1862259.html瀏覽器

http://www.douban.com/note/215633780/安全

---------------------
做者:caoshuming_500
來源:CSDN
原文:https://blog.csdn.net/caoshuming_500/article/details/20952329 服務器

linux 獲取通過N層Nginx轉發的訪問來源真實IP

一般系統出於安全考慮,須要進行權限(帳號、密碼)和IP白名單控制。如何獲取訪問來源真實的IP,若是公司網絡入口設置負載,本身系統設置nginx代理等操做,會使你達到目的不那麼簡單直接。網絡

一般狀況下咱們使用request.getRemoteAddr()就能夠獲取到客戶端ip,可是當咱們使用了nginx做爲反向代理後,因爲在客戶端和web服務器之間增長了中間層,所以web服務器沒法直接拿到客戶端的ip,經過$remote_addr變量拿到的將是反向代理服務器的ip地址。若是咱們想要在web端得到用戶的真實ip,就必須在nginx這裏做一個賦值操做,以下:
proxy_set_header            X-real-ip $remote_addr;
其中這個X-real-ip是一個自定義的變量名,這樣用戶的真實ip就被放在X-real-ip這個變量裏了,而後,在web端能夠這樣獲取:request.getAttribute("X-real-ip")。可是若是中間通過N次代理過來的請求,X-real-ip就只能得到到前一層代理的IP(10.6.61.14)了,下面是個人解決方案:負載均衡

 

 

紅色部分IP是使用X-Forwarded-For(簡稱XFF頭)獲取的:,它表明客戶端,也就是HTTP的請求端真實的IP,只有在經過了HTTP 代理或者負載均衡服務器時纔會添加該項(沒有通過的獲取爲空)標準格式以下:
X-Forwarded-For: client1, proxy1, proxy2
從標準格式能夠看出,X-Forwarded-For頭信息能夠有多個,中間用逗號分隔,第一項爲真實的客戶端ip,剩下的就是曾經通過的代理或負載均衡的ip地址,通過幾個就會出現幾個。
個人Nginx具體配置以下:url

 

關於參數含義:
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
意思是增長(不是覆蓋)一個$proxy_add_x_forwarded_for到X-Forwarded-For裏去。
舉個例子,有一個web應用,在它以前經過了兩個nginx轉發。在第一臺nginx中,使用
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
如今的$proxy_add_x_forwarded_for變量的"X-Forwarded-For"部分是空的,因此只有$remote_addr,而$remote_addr的值是用戶的ip,因而賦值之後,X-Forwarded-For變量的值就是用戶的真實的ip地址了。
到了第二臺nginx,使用
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
如今的$proxy_add_x_forwarded_for變量,X-Forwarded-For部分包含的是用戶的真實ip,$remote_addr部分的值是上一臺nginx的ip地址,因而經過這個賦值之後如今的X-Forwarded-For的值就變成了「用戶的真實ip,第一臺nginx的ip」。

因此我在程序中使用request.getHeader("x-forwarded-for").toString().split(",")[0]就能獲取到訪問客戶的真實IP,不用擔憂前面有幾層轉發啦。--------------------- 做者:zhenzhendeblog 來源:CSDN 原文:https://blog.csdn.net/zhenzhendeblog/article/details/49702575 

相關文章
相關標籤/搜索