客戶端IP指的是訪問(wèn)者(用戶設(shè)備)的IP地址。在Web應(yīng)用開(kāi)發(fā)中,通常需要獲取客戶端真實(shí)的IP地址。例如,投票系統(tǒng)為了防止刷票,需要通過(guò)獲取客戶端真實(shí)IP地址,限制每個(gè)客戶端IP地址只能投票一次。
當(dāng)您的網(wǎng)站已接入Web應(yīng)用防火墻(Web Application Firewall,簡(jiǎn)稱WAF)進(jìn)行安全防護(hù)后,WAF作為一個(gè)反向代理存在于客戶端和服務(wù)器之間,服務(wù)器的真實(shí)IP被隱藏起來(lái),Web訪問(wèn)者只能看到WAF的IP地址。此時(shí),您可直接通過(guò)WAF獲取客戶端的真實(shí)IP,也可以通過(guò)配置網(wǎng)站服務(wù)器獲取客戶端的真實(shí)IP。
本章節(jié)介紹了通過(guò)WAF直接獲取真實(shí)IP的方法,以及不同類型的Web應(yīng)用服務(wù)器(包括Tomcat、Apache、Nginx、IIS 6和IIS 7)如何進(jìn)行相關(guān)設(shè)置,以獲取客戶端的真實(shí)IP。
背景信息
通常情況下,網(wǎng)站訪問(wèn)并不是簡(jiǎn)單地從用戶的瀏覽器直達(dá)服務(wù)器,中間可能部署有CDN、WAF、高防等代理服務(wù)器(架構(gòu)為)。以WAF為例,部署示意圖如圖1所示。
圖1 部署WAF原理圖
說(shuō)明:
- 當(dāng)網(wǎng)站沒(méi)有接入到WAF前,DNS直接解析到源站的IP,用戶直接訪問(wèn)服務(wù)器。
- 當(dāng)網(wǎng)站接入WAF后,需要把DNS解析到WAF的CNAME,這樣流量才會(huì)先經(jīng)過(guò)WAF,WAF再將流量轉(zhuǎn)到源站,實(shí)現(xiàn)網(wǎng)站流量檢測(cè)和攻擊攔截。
在這種情況下,訪問(wèn)請(qǐng)求到達(dá)源站服務(wù)器之前可能經(jīng)過(guò)了多層安全代理轉(zhuǎn)發(fā)或加速代理轉(zhuǎn)發(fā),服務(wù)器如何獲取發(fā)起請(qǐng)求的真實(shí)客戶端IP呢?
一個(gè)透明的代理服務(wù)器在把用戶的HTTP請(qǐng)求轉(zhuǎn)到下一環(huán)節(jié)的服務(wù)器時(shí),會(huì)在HTTP的頭部中加入一條“X-Forwarded-For”記錄,用來(lái)記錄用戶的真實(shí)IP,其形式為“X-Forwarded-For:客戶端的真實(shí)IP,代理服務(wù)器1-IP, 代理服務(wù)器2-IP,代理服務(wù)器3-IP,……”。
因此,您可以通過(guò)獲取“X-Forwarded-For”對(duì)應(yīng)的第一個(gè)IP來(lái)得到客戶端的真實(shí)IP。
通過(guò)WAF直接獲取客戶端真實(shí)IP
網(wǎng)站接入WAF后,WAF作為一個(gè)反向代理部署于客戶端和服務(wù)器之間,實(shí)現(xiàn)網(wǎng)站安全防護(hù)。根據(jù)業(yè)務(wù)需求,您可以通過(guò)以下兩種推薦方式獲取客戶端真實(shí)IP:
- WAF服務(wù)還支持使用X-Real-IP變量,獲取客戶的來(lái)源IP(使用過(guò)程中考慮了后面經(jīng)過(guò)的多層反向代理對(duì)該變量的修改)。
各種語(yǔ)言通過(guò)調(diào)用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如何在訪問(wèn)日志中獲取客戶端真實(shí)IP
如果您的源站部署了Tomcat服務(wù)器,可通過(guò)啟用Tomcat的X-Forwarded-For功能,獲取客戶端的真實(shí)IP地址。
- 打開(kāi)“server.xml”文件(“tomcat/conf/server.xml”),AccessLogValue日志記錄功能部分內(nèi)容如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.values.AccessLogValue" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
- 在pattern中增加“%{X-Forwarded-For}i”,修改后的server.xml為:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValue" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%{X-Forwarded-For}i %h %l %u %t "%r" %s %b" />
</Host>
- 查看“l(fā)ocalhost_access_log”日志文件,可獲取X-Forwarded-For對(duì)應(yīng)的訪問(wèn)者真實(shí)IP。
Apache如何在訪問(wèn)日志中獲取客戶端真實(shí)IP
如果源站部署的Apache服務(wù)器為2.4及以上版本,您可以使用Apache安裝包中自帶“remoteip_module”模塊文件“mod_remoteip.so”,獲取客戶端IP地址。
- CentOS 7.6
- 編輯“httpd.conf”配置文件,在文件中添加以下內(nèi)容:
LoadModule remoteip_module modules/mod_remoteip.so ##加載mod_remoteip.so模塊
RemoteIPHeader X-Forwarded-For ##設(shè)置RemoteIPHeader頭部
RemoteIPInternalProxy WAF的回源IP段 ##設(shè)置WAF回源IP段
有關(guān)獲取WAF回源IP段的詳細(xì)介紹,請(qǐng)參見(jiàn)如何放行WAF回源IP段。
說(shuō)明:
- “mod_remoteip.so”模塊已默認(rèn)加載在以下文件:“/etc/httpd/conf.modules.d/00-base.conf:46”
- 多個(gè)回源IP段請(qǐng)使用空格分隔。
- 修改配置文件日志格式,即將日志格式文件中的“%h”修改為“%a”。
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %b" common
- 重啟Apache服務(wù),使配置生效。
- Ubuntu 20.04.2
- 編輯“apache2.conf”配置文件,在文件中添加以下內(nèi)容:
ln -s ../mods-available/remoteip.load /etc/apache2/mods-enabled/remoteip.load ##加載mod_remoteip.so模塊
RemoteIPHeader X-Forwarded-For ##設(shè)置RemoteIPHeader頭部
RemoteIPInternalProxy WAF的回源IP段 ##設(shè)置WAF回源IP段
有關(guān)獲取WAF回源IP段的詳細(xì)介紹,請(qǐng)參見(jiàn)如何放行WAF回源IP段。
說(shuō)明:
- 修改配置文件日志格式,即將日志格式文件中的“%h”修改為“%a”。
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %b" common
- 重啟Apache服務(wù),使配置生效。
如果源站部署的Apache服務(wù)器為2.2及以下版本,您可通過(guò)運(yùn)行命令安裝Apache的第三方模塊mod_rpaf,并修改“http.conf”文件獲取客戶IP地址。
- 執(zhí)行以下命令安裝Apache的一個(gè)第三方模塊mod_rpaf。
wget https://github.com/gnif/mod_rpaf/archive/v0.6.0.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
- 打開(kāi)“httpd.conf”配置文件,并將文件內(nèi)容修改為如下內(nèi)容:
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目錄](méi)/logs/$access.log" common
- 重啟Apache,使配置生效。
/[apached目錄](méi)/httpd/bin/apachectl restart
- 查看“access.log”日志文件,可獲取X-Forwarded-For對(duì)應(yīng)的客戶端真實(shí)IP。
Nginx如何在訪問(wèn)日志中獲取客戶端真實(shí)IP
如果您的源站部署了Nginx反向代理,可通過(guò)在Nginx反向代理配置Location信息,后端Web服務(wù)器即可通過(guò)類似函數(shù)獲取客戶的真實(shí)IP地址。
- 根據(jù)源站Nginx反向代理的配置,在Nginx反向代理的相應(yīng)location位置配置如下內(nèi)容,獲取客戶IP的信息。
Location ^ /<uri> {
proxy_pass ....;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
|
- 后端Web服務(wù)器通過(guò)定義Nginx日志參數(shù)$http_x_forwarded_for來(lái)獲取客戶的真實(shí)IP。
示例:log_format main ' "<$http_Cdn_Src_IP>" "{$http_x_real_ip}" "[$http_x_forwarded_for]" "$remote_addr" ' '$http_user_agent - $remote_user [$time_local] "$request" ' ' $status $body_bytes_sent "$http_referer" ';
IIS 6如何在訪問(wèn)日志中獲取客戶端真實(shí)IP
如果您的源站部署了IIS 6服務(wù)器,您可以通過(guò)安裝“F5XForwardedFor.dll”插件,從IIS 6服務(wù)器記錄的訪問(wèn)日志中獲取客戶端真實(shí)的IP地址。
- 下載F5XForwardedFor模塊。
- 根據(jù)您服務(wù)器的操作系統(tǒng)版本將“x86\Release”或者“x64\Release”目錄中的“F5XForwardedFor.dll”文件拷貝至指定目錄(例如,“C:\ISAPIFilters”),同時(shí)確保IIS進(jìn)程對(duì)該目錄有讀取權(quán)限。
- 打開(kāi)IIS管理器,找到當(dāng)前開(kāi)啟的網(wǎng)站,在該網(wǎng)站上右鍵選擇“屬性”,打開(kāi)“屬性”頁(yè)面。
- 在“屬性”頁(yè)面,切換至“ISAPI篩選器”,單擊“添加”,在彈出的窗口中,配置如下信息:
- “篩選器名稱”:“F5XForwardedFor”;
- “可執(zhí)行文件”:“F5XForwardedFor.dll”的完整路徑,例如:“C:\ISAPIFilters\F5XForwardedFor.dll”。
- 單擊“確定”,重啟IIS 6服務(wù)器。
- 查看IIS 6服務(wù)器記錄的訪問(wèn)日志(默認(rèn)的日志路徑為:“C:\WINDOWS\system32\LogFiles\ ”,IIS日志的文件名稱以“.log”為后綴),可獲取X-Forwarded-For對(duì)應(yīng)的客戶端真實(shí)IP。
IIS 7如何在訪問(wèn)日志中獲取客戶端真實(shí)IP
如果您的源站部署了IIS 7服務(wù)器,您可以通過(guò)安裝“F5XForwardedFor”模塊,從IIS 7服務(wù)器記錄的訪問(wèn)日志中獲取客戶端真實(shí)的IP地址。
- 下載F5XForwardedFor模塊。
- 根據(jù)服務(wù)器的操作系統(tǒng)版本將“x86\Release”或者“x64\Release”目錄中的“F5XFFHttpModule.dll”和“F5XFFHttpModule.ini”文件拷貝到指定目錄(例如,“C:\x_forwarded_for\x86”或“C:\x_forwarded_for\x64”),并確保IIS進(jìn)程對(duì)該目錄有讀取權(quán)限。
- 在IIS服務(wù)器的選擇項(xiàng)中,雙擊“模塊”,進(jìn)入“模塊”界面。
- 單擊“配置本機(jī)模塊”,在彈出的對(duì)話框中,單擊“注冊(cè)”。
圖2 注冊(cè)模塊
- 在彈出的對(duì)話框中,按操作系統(tǒng)注冊(cè)已下載的DLL文件后,單擊“確定”。
- x86操作系統(tǒng):注冊(cè)模塊“x_forwarded_for_x86”
- 名稱:x_forwarded_for_x86
- 路徑:“C:\x_forwarded_for\x86\F5XFFHttpModule.dll”
圖3 x86操作系統(tǒng)注冊(cè)模塊
- x64操作系統(tǒng):注冊(cè)模塊“x_forwarded_for_x64”
- 名稱:x_forwarded_for_x64
- 路徑:“C:\x_forwarded_for\x64\F5XFFHttpModule.dll”
圖4 x64操作系統(tǒng)注冊(cè)模塊
- 注冊(cè)完成后,勾選新注冊(cè)的模塊(“x_forwarded_for_x86”或“x_forwarded_for_x64”)并單擊“確定”。
- 在“ISAPI和CGI限制”中,按操作系統(tǒng)添加已注冊(cè)的DLL文件,并將其“限制”改為“允許”。
- x86操作系統(tǒng):
- ISAPI或CGI路徑:“C:\x_forwarded_for\x86\F5XFFHttpModule.dll”
- 描述:x86
- x64操作系統(tǒng):
- ISAPI或CGI路徑:“C:\x_forwarded_for\x64\F5XFFHttpModule.dll”
- 描述:x64
- 重啟IIS 7服務(wù)器,等待配置生效。
- 查看IIS 7服務(wù)器記錄的訪問(wèn)日志(默認(rèn)的日志路徑為:“C:\WINDOWS\system32\LogFiles\ ”,IIS日志的文件名稱以“.log”為后綴),可獲取X-Forwarded-For對(duì)應(yīng)的客戶端真實(shí)IP。
該文章在 2022/11/4 16:53:04 編輯過(guò)