一般狀況下,網站訪問並非簡單地從用戶的瀏覽器直達服務器,中間可能部署有CDN、WAF、高防。例如,採用這樣的架構:「用戶 > CDN/WAF/高防 > 源站服務器」 。那麼,在通過多層代理以後,服務器如何獲取發起請求的真實客戶端IP呢?web
一個透明的代理服務器在把用戶的HTTP請求轉到下一環節的服務器時,會在HTTP的頭部中加入一條「X-Forwarded-For」記錄,用來記錄用戶的真實IP,其形式爲「X-Forwarded-For:訪問者的真實IP,代理服務器1-IP, 代理服務器2-IP,代理服務器3-IP,……」。apache
所以,訪問者的真實IP能夠經過獲取「X-Forwarded-For」對應的第一個IP來獲得。後端
若是您已經使用Web應用防火牆服務,可直接經過WAF服務獲取訪問者的真實IP,也能夠經過配置網站服務器來獲取訪問者的真實IP。如下分別介紹經過WAF直接獲取真實IP的方法,以及針對Tomcat、Apache、Nginx和IIS服務器,相應的X-Forwarded-For配置方案及獲取真實IP的方法。瀏覽器
WAF默認提供獲取客戶端真實IP的功能,下面推薦兩種方式獲取客戶的來源IP,根據您的須要,兩種方式可二選一:tomcat
真實的客戶端IP會被WAF服務放在HTTP頭部的X-Forwarded-For字段,格式以下:服務器
X-Forwarded-For: 用戶真實IP, 代理服務器1-IP, 代理服務器2-IP,...架構
當使用此方式獲取客戶端真實IP時,獲取的第一個地址就是客戶端真實IP。app
各類語言經過調用SDK接口獲取X-Forwarded-For字段的方式:webapp
Request.ServerVariables("HTTP_X_FORWARDED_FOR")函數
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
$_SERVER["HTTP_X_FORWARDED_FOR"]
request.getHeader("HTTP_X_FORWARDED_FOR")
各類語言經過調用SDK接口獲取X-Real-IP字段的方式:
Request.ServerVariables("HTTP_X_REAL_IP")
Request.ServerVariables["HTTP_X_REAL_IP"]
$_SERVER["HTTP_X_REAL_IP"]
request.getHeader("HTTP_X_REAL_IP")
若是您的源站部署了Tomcat服務器,可經過啓用Tomcat的X-Forwarded-For功能,獲取訪問者的真實IP地址。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%{X-Forwarded-For}i %h %l %u %t "%r" %s %b" />
</Host>
若是您的源站部署了Apache服務器,可經過運行命令安裝Apache的第三方模塊mod_rpaf,並修改http.conf文件獲取客戶IP地址。
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xvfz mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
/usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
LoadModule rpaf_module modules/mod_rpaf-2.0.so ##加載mod_rpaf模塊
<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 <反向代理IPs>
RPAFheader X-Forwarded-For
</IfModule>
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common
CustomLog "/[apache目錄]/logs/$access.log" common
/[apached目錄]/httpd/bin/apachectl restart
若是您的源站部署了Nginx反向代理,可經過在Nginx反向代理配置Location信息,後端Web服務器便可經過相似函數獲取客戶的真實IP地址。
Location ^ /<uri> {
proxy_pass ....;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
request.getAttribute("X-Forwarded-For")
若是您的源站部署了IIS 6服務器,您能夠經過安裝「F5XForwardedFor.dll」插件,從IIS 6服務器記錄的訪問日誌中獲取訪問者真實的IP地址。
1.下載並安裝「F5XForwardedFor.dll」插件。
2.根據您服務器的操做系統版本將「x86\Release」或者「x64\Release」目錄中的「F5XForwardedFor.dll」文件拷貝至指定目錄(例如,「C:\ISAPIFilters」),同時確保IIS進程對該目錄有讀取權限。
3.打開IIS管理器,找到當前開啓的網站,在該網站上右鍵選擇「屬性」,打開「屬性」頁面。
4.在「屬性」頁面,切換至「ISAPI篩選器」,單擊「添加」,在彈出的窗口中,配置以下信息:
5.單擊「肯定」,重啓IIS 6服務器。
6.查看IIS 6服務器記錄的訪問日誌(默認的日誌路徑爲:「C:\WINDOWS\system32\LogFiles\ 」,IIS日誌的文件名稱以「.log」爲後綴),可獲取X-Forwarded-For對應的訪問者真實IP。
若是您的源站部署了IIS 7服務器,您能夠經過安裝「F5XForwardedFor」模塊,從IIS 7服務器記錄的訪問日誌中獲取訪問者真實的IP地址。
1.下載並安裝「F5XForwardedFor」模塊。
2.根據服務器的操做系統版本將「x86\Release」或者「x64\Release」目錄中的「F5XFFHttpModule.dll」和「F5XFFHttpModule.ini」文件拷貝到指定目錄(例如,「C:\x_forwarded_for\x86」或「C:\x_forwarded_for\x64」),並確保IIS進程對該目錄有讀取權限。
3.在IIS服務器的選擇項中,雙擊「模塊」,進入「模塊」界面。
4.單擊「配置本機模塊」,在彈出的對話框中,單擊「註冊」,按操做系統選擇「註冊模塊」註冊已下載的DLL文件。
5.註冊完成後,勾選新註冊的模塊(「x_forwarded_for_x86」或「x_forwarded_for_x64」)並單擊「肯定」。
6.在「ISAPI和CGI限制」中,按操做系統添加已註冊的DLL文件,並將其「限制」改成「容許」。
7.重啓IIS 7服務器,等待配置生效。
8.查看IIS 7服務器記錄的訪問日誌(默認的日誌路徑爲:「C:\WINDOWS\system32\LogFiles\ 」,IIS日誌的文件名稱以「.log」爲後綴),可獲取X-Forwarded-For對應的訪問者真實IP。