網站接入Web應用防火墻WAF(Web Application Firewall)后,訪問請求在到達源站服務器之前,需要經過WAF的代理轉發。這種情況下,源站服務器可以通過解析回源請求中的X-Forwarded-For記錄,獲取客戶端的真實IP。本文介紹如何配置不同類型的Web應用服務器(包括Nginx、IIS
6、IIS 7、Apache、Tomcat)以及容器K8s,以獲取客戶端的真實IP。
背景信息
WAF在將客戶端的訪問請求轉發到下一環節的服務器時,會在HTTP的請求頭中添加一條X-Forwarded-For記錄,用于記錄客戶端的IP,格式為X-Forwarded-For:客戶端IP
。如果客戶端和源站服務器之間有多個代理服務器(例如WAF、DDoS高防、CDN等),則X-Forwarded-For記錄使用以下格式記錄客戶端IP和依次經過的代理服務器IP:X-Forwarded-For:客戶端IP, 代理服務器1的IP, 代理服務器2的IP, 代理服務器3的IP, ……
。
因此,常見的Web應用服務器(包括Nginx、IIS 6、IIS 7、Apache、Tomcat)以及容器K8s可以通過解析X-Forwarded-For記錄獲取客戶端真實IP。
下文分別介紹如何配置Nginx、IIS 6、IIS 7、Apache和Tomcat服務器以及容器K8s,解析X-Forwarded-For記錄,獲取客戶端的真實IP。
注意 開始配置之前,請務必備份現有環境,包括ECS快照備份和Web應用服務器配置文件備份。
Nginx配置方案
Nginx服務器使用http_realip_module模塊解析X-Forwarded-For記錄。您可以參考如下步驟,安裝http_realip_module模塊,修改Nginx配置。
- 安裝http_realip_module模塊。
在
Nginx
服務器上執行
# nginx -V | grep http_realip_module
命令,查看是否已安裝
http_realip_module
模塊。
- 修改Nginx服務器配置文件。
- 打開
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>
、<ip_range2>
、<ip_rangex>
需要設置為代理服務器(即WAF)的回源IP段。獲取WAF回源IP段的具體操作,請參見放行WAF回源IP段。
多個回源
IP
段必須分行添加。假設
WAF
的回源
IP
段包含
10.0.0.1、10.0.0.2、10.0.0.3,則使用如下格式:
set_real_ip_from 10.0.0.1;
set_real_ip_from 10.0.0.2;
set_real_ip_from 10.0.0.3;
real_ip_header X-Forwarded-For;
- 修改log_format日志記錄格式。
- 打開
nginx.conf
配置文件,定位到http
配置部分的log_format
。
- 在
log_format
中添加x-forwarded-for
字段,替換默認的remote-address
字段。修改后的
log_format
內容如下:
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服務器使用F5XForwardedFor模塊解析X-Forwarded-For記錄。您可以參考如下步驟,安裝F5XForwardedFor模塊。
- 將
x86\Release
或x64\Release
目錄下的F5XForwardedFor.dll
文件拷貝到某個自定義目錄(例如C:\ISAPIFilters\x86
、C:\ISAPIFilters\x64
)。
說明
- 請確保IIS進程擁有自定義目錄的讀寫權限。
- 如果該目錄下,沒有
F5XForwardedFor.dll
文件,請手動下載該文件,并將該文件放到自定義目錄。下載路徑,請參見F5XForwardedFor.dll。
- 打開IIS管理器,定位到目標站點,右鍵單擊屬性。
- 在ISAPI篩選器頁簽,單擊添加。完成如下配置后,單擊確定。
以
32
位操作系統為例:
- 篩選器名稱:
x_forwarded_for_x86
。
- 可執行文件:
F5XForwardedFor.dll
文件所在的完整路徑(例如C:\ISAPIFilters\x86\F5XForwardedFor.dll
)。
- 重啟IIS 6服務器,使配置生效。
IIS 7配置方案
IIS 7服務器使用F5XForwardedFor模塊解析X-Forwarded-For記錄。您可以參考如下步驟,安裝F5XForwardedFor模塊。
- 將
x86\Release
或x64\Release
目錄下的F5XFFHttpModule.dll
和F5XFFHttpModule.ini
文件拷貝到某個自定義目錄(例如C:\x_forwarded_for\x86
、C:\x_forwarded_for\x64
)。
說明
- 請確保IIS進程擁有自定義目錄的讀寫權限。
- 如果該目錄下,沒有
F5XForwardedFor.dll
和F5XFFHttpModule.ini
文件,請手動下載文件,并將文件放到自定義目錄。下載路徑,請參見F5XForwardedFor模塊。
- 打開IIS管理器,在IIS區域,雙擊模塊。
- 在模塊頁面右側操作區域,單擊配置本機模塊。
- 在配置本機模塊對話框,單擊注冊。填寫注冊信息后,單擊確定。
以
32
位操作系統為例:
- 名稱:
x_forwarded_for_x86
。
- 路徑:
F5XFFHttpModule.dll
文件所在的完整路徑(例如C:\x_forwarded_for\x86\F5XFFHttpModule.dll
)。
- 在配置本機模塊對話框,選中新注冊的模塊,單擊確定。
- 在ISAPI 和CGI限制頁面,添加已注冊的DLL,并將限制設置為允許。
- 重啟IIS 7服務器,使配置生效。
Apache配置方案
Windows操作系統
Apache 2.4及以上版本的安裝包中自帶remoteip_module模塊文件(mod_remoteip.so
),Apache服務器使用該模塊獲取客戶端IP地址。
- 進入Apache服務器的extra配置文件夾(
conf/extra/
),新建httpd-remoteip.conf
配置文件。
說明 通過引入remoteip.conf
配置文件的方式加載相關配置,減少直接修改httpd.conf
配置文件的次數,避免因操作失誤導致業務異常。
- 編輯
httpd-remoteip.conf
配置文件,在文件中添加以下內容: # 加載mod_remoteip.so模塊
LoadModule remoteip_module modules/mod_remoteip.so
# 設置RemoteIPHeader頭部
RemoteIPHeader X-Forwarded-For
# 設置回源IP段
RemoteIPInternalProxy <ip_range1> <ip_range2> …… <ip_rangex>
其中,<ip_range1>
、<ip_range2>
、<ip_rangex>
需要設置為代理服務器(即WAF)的回源IP段。獲取WAF回源IP段的具體操作,請參見放行WAF回源IP段。
多個回源
IP
段之前使用空格分隔。假設代理服務器的回源
IP
段包含
10.0.0.1、10.0.0.2、10.0.0.3,則使用以下格式:
RemoteIPInternalProxy 10.0.0.1 10.0.0.2 10.0.0.3
- 編輯conf/httpd.conf配置文件,在文件中添加以下內容:
Include conf/extra/httpd-remoteip.conf
以上命令表示在conf/httpd.conf中插入httpd-remoteip.conf
配置文件。
- 在
httpd.conf
配置文件中修改日志格式。 LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %b" common
- 重啟Apache服務,使配置生效。
Linux操作系統
您可以參考上述Windows操作系統服務器的配置方式,添加Apache 2.4及以上版本自帶的remoteip_module模塊(mod_remoteip.so
)并配置日志格式,獲取客戶端IP地址。
如果Linux服務器使用的Apache版本低于2.4,請參照以下步驟,通過設置Apache的第三方模塊(mod_rpaf),獲取客戶端IP地址。
- 安裝mod_rpaf模塊。
wget https://github.com/gnif/mod_rpaf/archive/v0.6.0.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
- 編輯Apache配置文件
/alidata/server/httpd/conf/httpd.conf
,在文件最后添加以下內容:LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips <rpaf ip地址>
RPAFheader X-Forwarded-For
其中,<rpaf ip地址>
不是代理服務器的公網IP地址,具體IP請通過Apache日志查詢。通常包含兩個IP地址,示例如下:
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 10.XX.XX.65 10.XX.XX.131
RPAFheader X-Forwarded-For
- 重啟Apache服務,使配置生效。
/alidata/server/httpd/bin/apachectl restart
更多Apache相關模塊的信息,請參見Apache幫助文檔。
Tomcat配置方案
Tomcat服務器通過啟用X-Forwarded-For功能,獲取客戶端IP地址。
- 打開
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"/>
容器K8s配置方案
如果您的服務部署在K8s上,K8s會將真實的客戶端IP記錄在X-Original-Forwarded-For字段中,并將WAF回源地址記錄在X-Forwarded-For字段中。您需要修改容器的配置文件,使Ingress將真實的IP添加到X-Forwarded-For字段中,以便您正常獲取真實的客戶端IP地址。
您可以參考以下步驟,對容器配置文件進行修改。
- 執行以下命令修改配置文件
kube-system/nginx-configuration
。kubectl -n kube-system edit cm nginx-configuration
- 在配置文件中添加以下內容:
compute-full-forwarded-for: "true"
forwarded-for-header: "X-Forwarded-For"
use-forwarded-headers: "true"
- 保存配置文件。
保存后配置即刻生效,Ingress會將真實的客戶端IP添加到X-Forwarded-For字段中。
- 將業務程序獲取客戶端真實IP的字段修改為X-Original-Forwarded-For。