通常情況下,網站訪問並不是簡單地從使用者的瀏覽器直達伺服器,中間可能部署有CDN、WAF、高防。例如,採用這樣的架構:“使用者 > CDN/WAF/高防 > 源站伺服器” 。那麼,在經過多層代理之後,伺服器如何獲取發起請求的真實客戶端IP呢?
一個透明的代理伺服器在把使用者的HTTP請求轉到下一環節的伺服器時,會在HTTP的頭部中加入一條“X-Forwarded-For”記錄,用來記錄使用者的真實IP,其形式為“X-Forwarded-For:訪問者的真實IP,代理伺服器1-IP, 代理伺服器2-IP,代理伺服器3-IP,……”。
因此,訪問者的真實IP可以通過獲取“X-Forwarded-For”對應的第一個IP來得到。
如果您已經使用Web應用防火牆服務,可直接通過WAF服務獲取訪問者的真實IP,也可以通過配置網站伺服器來獲取訪問者的真實IP。以下分別介紹通過WAF直接獲取真實IP的方法,以及針對Tomcat、Apache、Nginx和IIS伺服器,相應的X-Forwarded-For配置方案及獲取真實IP的方法。
通過WAF直接獲取真實IP
WAF預設提供獲取客戶端真實IP的功能,下面推薦兩種方式獲取客戶的來源IP,根據您的需要,兩種方式可二選一:
- WAF服務使用X-Forwarded-For的方式獲取客戶端的真實IP地址。
真實的客戶端IP會被WAF服務放在HTTP頭部的X-Forwarded-For欄位,格式如下:
X-Forwarded-For: 使用者真實IP, 代理伺服器1-IP, 代理伺服器2-IP,...
當使用此方式獲取客戶端真實IP時,獲取的第一個地址就是客戶端真實IP。
各種語言通過呼叫SDK介面獲取X-Forwarded-For欄位的方式:
- ASP:
Request.ServerVariables("HTTP_X_FORWARDED_FOR")
- ASP.NET(C#):
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
- PHP:
$_SERVER["HTTP_X_FORWARDED_FOR"]
- JSP:
request.getHeader("HTTP_X_FORWARDED_FOR")
- WAF服務還支援使用X-Real-IP變數,獲取客戶的來源IP(使用過程中考慮了後面經過的多層反向代理對該變數的修改)。
各種語言通過呼叫SDK介面獲取X-Real-IP欄位的方式:
- ASP:
Request.ServerVariables("HTTP_X_REAL_IP")
- ASP.NET(C#):
Request.ServerVariables["HTTP_X_REAL_IP"]
- PHP:
$_SERVER["HTTP_X_REAL_IP"]
- JSP:
request.getHeader("HTTP_X_REAL_IP")
Tomcat如何在訪問日誌中獲取真實客戶端的IP地址(個人推薦)
如果您的源站部署了Tomcat伺服器,可通過啟用Tomcat的X-Forwarded-For功能,獲取訪問者的真實IP地址。
- 開啟server.xml檔案(“tomcat/conf/server.xml”),AccessLogValve日誌記錄功能部分內容如下:
<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" />
- 在pattern中增加“%{X-Forwarded-IP}i”,修改後的server.xml為:
<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>
- 檢視localhost_access_log日誌檔案,可獲取X-Forwarded-For對應的訪問者真實IP。
Apache如何在訪問日誌中獲取真實客戶端的IP地址
如果您的源站部署了Apache伺服器,可通過執行命令安裝Apache的第三方模組mod_rpaf,並修改http.conf檔案獲取客戶IP地址。
- 執行以下命令安裝Apache的一個第三方模組mod_rpaf。
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
- 開啟httpd.conf配置檔案,並將檔案內容修改為如下內容:
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
- 重啟Apache,使配置生效。
/[apached目錄]/httpd/bin/apachectl restart
- 檢視access.log日誌檔案,可獲取X-Forwarded-For對應的訪問者真實IP。
Nginx如何在訪問日誌中獲取真實客戶端的IP地址
如果您的源站部署了Nginx反向代理,可通過在Nginx反向代理配置Location資訊,後端Web伺服器即可通過類似函式獲取客戶的真實IP地址。
- 根據源站Nginx反向代理的配置,在Nginx反向代理的相應location位置配置如下內容,獲取客戶IP的資訊。
Location ^ /<uri> {
proxy_pass ....;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
- 後端Web伺服器通過類似函式獲取客戶的真實IP。
request.getAttribute("X-Forwarded-For")
IIS 6如何在訪問日誌中獲取真實客戶端的IP地址
如果您的源站部署了IIS 6伺服器,您可以通過安裝“F5XForwardedFor.dll”外掛,從IIS 6伺服器記錄的訪問日誌中獲取訪問者真實的IP地址。
1.下載並安裝“F5XForwardedFor.dll”外掛。
2.根據您伺服器的作業系統版本將“x86\Release”或者“x64\Release”目錄中的“F5XForwardedFor.dll”檔案拷貝至指定目錄(例如,“C:\ISAPIFilters”),同時確保IIS程式對該目錄有讀取許可權。
3.開啟IIS管理器,找到當前開啟的網站,在該網站上右鍵選擇“屬性”,開啟“屬性”頁面。
4.在“屬性”頁面,切換至“ISAPI篩選器”,單擊“新增”,在彈出的視窗中,配置如下資訊:
- “篩選器名稱”:“F5XForwardedFor”;
- “可執行檔案”:“F5XForwardedFor.dll”的完整路徑,例如:“C:\ISAPIFilters\F5XForwardedFor.dll”。
5.單擊“確定”,重啟IIS 6伺服器。
6.檢視IIS 6伺服器記錄的訪問日誌(預設的日誌路徑為:“C:\WINDOWS\system32\LogFiles\ ”,IIS日誌的檔名稱以“.log”為字尾),可獲取X-Forwarded-For對應的訪問者真實IP。
IIS 7如何在訪問日誌中獲取真實客戶端的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檔案。
- x86作業系統:註冊模組“x_forwarded_for_x86”
- 名稱:x_forwarded_for_x86
- 路徑:“C:\x_forwarded_for\x86\F5XFFHttpModule.dll”
- x64作業系統:註冊模組“x_forwarded_for_x64”
- 名稱:x_forwarded_for_x64
- 路徑:“C:\x_forwarded_for\x64\F5XFFHttpModule.dll”
5.註冊完成後,勾選新註冊的模組(“x_forwarded_for_x86”或“x_forwarded_for_x64”)並單擊“確定”。
6.在“ISAPI和CGI限制”中,按作業系統新增已註冊的DLL檔案,並將其“限制”改為“允許”。
- x86作業系統:
- ISAPI或CGI路徑:“C:\x_forwarded_for\x86\F5XFFHttpModule.dll”
- 描述:x86
- x64作業系統:
- ISAPI或CGI路徑:“C:\x_forwarded_for\x64\F5XFFHttpModule.dll”
- 描述:x64
7.重啟IIS 7伺服器,等待配置生效。
8.檢視IIS 7伺服器記錄的訪問日誌(預設的日誌路徑為:“C:\WINDOWS\system32\LogFiles\ ”,IIS日誌的檔名稱以“.log”為字尾),可獲取X-Forwarded-For對應的訪問者真實IP。