在啟用Web Application Firewall後,怎樣擷取訪問者真實 IP

很多時候,網站訪問並不是簡單地從使用者的瀏覽器直達伺服器,中間可能部署有CDN、WAF、高防。例如,採用這樣的架構:使用者 > CDN/WAF/高防 > 來源站點伺服器。那麼,在經過多層加速後,伺服器如何擷取發起請求的真實用戶端 IP 呢?

一個透明的Proxy 伺服器在把使用者的請求轉到下一環節的伺服器時,會在HTTP的頭中加入一條X-Forwarded-For記錄,用來記錄使用者的真實IP,其形式為X-Forwarded-For:使用者IP。如果中間經曆了多個Proxy 伺服器,那麼X-Forwarded-For會表現為以下形式:X-Forwarded-For:使用者IP, Proxy 伺服器1-IP, Proxy 伺服器2-IP, Proxy 伺服器3-IP, ……

因此,常見的應用伺服器可以使用X-Forwarded-For的方式擷取訪問者真實IP。以下分別針對Nginx,IIS 6,IIS 7,Apache和Tomcat 伺服器,介紹相應的X-Forwarded-For配置方案。

Nginx配置方案

1. 確認http_realip_module模組已安裝

作為負載平衡,Nginx使用http_realip_module來擷取真實IP。使用一鍵安裝包安裝的Nginx,預設沒有安裝該模組。您可以執行# nginx -V | grep http_realip_module命令查看該模組是否已安裝。如果沒有安裝,則需要重新編譯Nginx並加裝該模組。

參考以下方法,安裝 http_realip_module模組:
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module
make
make install
kill -USR2 `cat /alidata/server/nginx/logs/nginx.pid`
kill -QUIT `cat /alidata/server/nginx/logs/ nginx.pid.oldbin`

2. 修改Nginx對應server的配置

開啟 default.conf,在 location / {}中添加如下內容:
set_real_ip_from ip_range1;
set_real_ip_from ip_range2;
...
set_real_ip_from ip_rangex;
real_ip_header    X-Forwarded-For;

其中,ip_range1,2,...,x 指WAF的回源IP地址,需要分多條分別添加。

3. 修改日誌記錄格式 log_format

log_format一般在 nginx.conf中的http配置下。在 log_format中,將 x-forwarded-for欄位加進去,替換掉原來的 remote-address,即修改為以下內容:
log_format  main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" ';

完成以上操作後,使用nginx -s reload命令重啟Nginx,使配置生效。

IIS 6配置方案

您可以選擇從IIS 6日誌中擷取來訪者真實IP地址,但前提是您已安裝外掛程式F5XForwardedFor.dll

操作步驟
  1. 根據伺服器的作業系統版本將x86\Release或者x64\Release目錄下的F5XForwardedFor.dll拷貝到某個目錄(假設為C:\ISAPIFilters),同時確保IIS進程對該目錄有讀取許可權。
  2. 開啟IIS管理器,找到當前開啟的網站,在該網站上右鍵選擇屬性,開啟屬性頁面。
  3. 在屬性頁面切換至ISAPI篩選器,單擊添加
  4. 在添加視窗下,配置以下參數,並單擊確定
    • 篩選器名稱:F5XForwardedFor
    • 可執行檔:F5XForwardedFor.dll的完整路徑,如本例中的C:\ISAPIFilters\F5XForwardedFor.dll
  5. 重啟 IIS 伺服器,等待配置生效。

IIS 7配置方案

您可以通過F5XForwardedFor模組來擷取來訪者真實IP地址,但前提是您已安裝F5XForwardedFor 模組

操作步驟
  1. 根據伺服器作業系統版本將x86\Release或者x64\Release目錄下的F5XFFHttpModule.dllF5XFFHttpModule.ini拷貝到指定目錄下(假設為C:\x_forwarded_for\x86C:\x_forwarded_for\x64),並確保IIS進程對該目錄有讀取許可權。
  2. IIS伺服器選項中,雙擊開啟模組

  3. 選擇配置本機模組

  4. 配置本機模組對話方塊中,單擊註冊,分別註冊已下載的DLL檔案。
    • 註冊模組 x_forwarded_for_x86
      • 名稱:x_forwarded_for_x86
      • 路徑C:\x_forwarded_for\x86\F5XFFHttpModule.dll
    • 註冊模組 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. API 和CGI限制中,分別添加登入的DLL,並將其限制改為允許

  7. 重啟IIS伺服器,等待配置生效。

Apache配置方案

  1. 使用以下代碼,安裝Apache的一個第三方模組mod_rpaf
    wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
    tar zxvf mod_rpaf-0.6.tar.gz
    cd mod_rpaf-0.6
    /alidata/server/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
  2. 修改Apache設定檔/alidata/server/httpd/conf/httpd.conf,在其末尾添加以下內容。
    LoadModule rpaf_module modules/mod_rpaf-2.0.so
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips ip地址
    RPAFheader X-Forwarded-For

    其中,RPAFproxy_ips ip地址不是負載平衡提供的公網IP,具體IP可以參考Apache日誌,通常會有2個。

  3. 添加完成後,使用以下命令重啟Apache。
    /alidata/server/httpd/bin/apachectl restart
案例

LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 10.242.230.65 10.242.230.131
RPAFheader X-Forwarded-For

Tomcat配置方案

參照以下方法來開啟Tomcat的X-Forwarded-For:

開啟 tomcat/conf/server.xml,修改AccessLogValve日誌紀錄功能為如下內容。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false"/>