­

7個獲取訪問者真實IP的方法,速學!!!

通常情況下,網站訪問並不是簡單地從用戶的瀏覽器直達伺服器,中間可能部署有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 //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。

 

點擊關注,第一時間了解華為雲新鮮技術~