在 CNAME 接入 Web Application Firewall(Web Application Firewall,簡稱WAF)的架構中,來源站點收到的請求源 IP 為最後一跳Proxy 位址,而非用戶端真實 IP;WAF 通過在 HTTP 要求頭中插入 X-Forwarded-For 欄位傳遞真實 IP。若需在後端 Web 服務器擷取用戶端真實 IP,必須設定管理員從該欄位進行 IP 提取,以確保日誌記錄和安全審計等功能基於真實 IP 正確執行。
工作原理
在採用 CNAME 方式接入 WAF 的架構中,用戶端請求首先經過 WAF 及可能存在的其他中間代理(如 CDN、DDoS 高防等),再被轉寄至來源站點伺服器。此時,來源站點伺服器所接收到的 TCP 串連源 IP 位址為最後一跳代理的 IP,而非用戶端的真實 IP。
為準確識別並記錄用戶端真實 IP,WAF 會在轉寄 HTTP 要求時自動添加 X-Forwarded-For 頭部欄位。該欄位初始值為用戶端 IP;每當請求經過一個代理節點,該節點的 IP 位址將被追加至欄位末尾,格式如下:
X-Forwarded-For: 用戶端IP, 代理1IP, 代理2IP, …因此,在 CNAME 接入 WAF 的部署模式下,若需在後端 Web 服務器中擷取用戶端真實 IP,必須設定管理員優先從 X-Forwarded-For 頭部中提取並信任最左側的 IP 位址(即原始用戶端 IP)。此配置是確保訪問日誌及安全審計等功能基於真實用戶端 IP 正確執行的前提。下文將分別說明各平台的具體配置方法。
步驟一:擷取 WAF 回源 IP 段
登入Web Application Firewall控制台,在頂部功能表列,選擇WAF執行個體的資源群組和地區(中國內地、非中國內地),單擊,記錄擷取所有的WAF回源IP段,供後續使用。
在執行以下配置前,請務必通過 ECS 快照、設定檔備份等方式對現有環境進行完整備份,以防原有配置丟失。
步驟二:配置來源站點伺服器
Nginx配置方案
Nginx伺服器使用http_realip_module模組解析X-Forwarded-For記錄。請參考如下步驟,修改Nginx配置。
檢查是否已安裝 http_realip_module
登入伺服器並執行以下命令:
nginx -V 2>&1 | grep -o with-http_realip_module若輸出
with-http_realip_module,說明模組已支援,跳至配置 Nginx 信任 WAF 回源 IP 段。若無輸出,說明當前 Nginx 未編譯該模組,請繼續執行添加 realip 模組。
通過yum install nginx或apt install nginx安裝的版本通常包含該模組,僅當使用自訂編譯版本或極簡鏡像時可能缺失。
添加 realip 模組(僅缺失時適用)
方式一:通過系統包管理器重新安裝
# Alibaba Cloud Linux / CentOS / RHEL
sudo yum reinstall nginx -y
# Ubuntu / Debian
sudo apt install --reinstall nginx-core nginx-full方式二:源碼編譯
安裝依賴。
# Alibaba Cloud Linux / CentOS / RHEL sudo yum install -y gcc pcre-devel zlib-devel openssl-devel # Ubuntu / Debian sudo apt update sudo apt install -y build-essential libpcre3-dev zlib1g-dev libssl-dev查看已安裝的Nginx版本。
# 查看版本(用於下載對應源碼) nginx -v # 查看完整編譯參數 nginx -V 2>&1 | grep 'configure arguments' | sed 's/configure arguments: //'記錄輸出內容,例如
--prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module。下載對應版本的 Nginx,請替換為您實際的版本。
cd /tmp wget http://nginx.org/download/nginx-1.26.0.tar.gz tar zxvf nginx-1.26.0.tar.gz cd nginx-1.26.0配置編譯選項,請將步驟 2中擷取的原始參數複製,並在其末尾追加
--with-http_realip_module。./configure \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module編譯並升級服務。
make # make後會在 objs/ 目錄下產生新的 nginx 二進位檔案。 # 重新命名舊二進位(保留備份) sudo mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old # 替換為新編譯的版本 sudo cp objs/nginx /usr/local/nginx/sbin/nginx # 擷取當前主進程 PID OLD_PID=$(pgrep -f 'nginx: master' | head -1) # 啟動新主進程 sudo kill -USR2 $OLD_PID # 等待新進程啟動 sleep 2 # 關閉舊進程 sudo kill -QUIT $OLD_PID
配置 Nginx 信任 WAF 回源 IP 段
編輯
nginx.conf主設定檔,設定檔預設位於/etc/nginx/nginx.conf,在http {}塊中添加以下內容。http { # 信任來自 WAF 回源 IP 的 X-Forwarded-For 頭 # 請替換為實際從控制台擷取的 WAF 回源 IP 段,每個網段單獨一行 # 必須包含全部 WAF 回源網段,若有遺漏,則可能導致日誌仍顯示 WAF 的回源IP,而非用戶端真實 IP。 set_real_ip_from <ip_range1>; set_real_ip_from <ip_range2>; ... set_real_ip_from <ip_rangex>; # 指定從X-Forwarded-For要求標頭提取真實 IP real_ip_header X-Forwarded-For; }重載 Nginx 配置:
nginx -t && nginx -s reload
驗證
訪問網站,請將
http://your-domain.com/替換為已接入WAF的網域名稱。curl http://your-domain.com/查看 Nginx 訪問日誌,應顯示真實用戶端IP地址。
tail -f /var/log/nginx/access.log
IIS 7配置方案(IIS 7以上版本適用)
由於 WAF 作為反向 Proxy,IIS 預設日誌中的 c-ip 欄位記錄的是 WAF 回源 IP,而非真實使用者 IP。為便於審計或日誌排查,可通過 IIS 的 W3C 自訂日誌欄位 功能,將 X-Forwarded-For 要求標頭寫入日誌。
開啟IIS管理器,在左側串連樹中,展開伺服器節點,選擇目標網站(例如
Default Web Site)。雙擊右側功能視圖中的 “日誌” 表徵圖。

在記錄檔地區,確認日誌格式為 W3C(預設值)。若為其他格式,請切換為 W3C。
在記錄檔地區,單擊 “選擇欄位…”。
在彈出的視窗底部,單擊 “添加欄位…”。
在“添加自訂欄位”對話方塊中,填寫以下資訊,並單擊確定。
配置項
配置說明
欄位名稱
填寫
X-FORWARDED-FOR源類型
選擇
請求標題源
填寫
X-Forwarded-For單擊“確定”儲存自訂欄位。
再次單擊“確定”關閉記錄欄位視窗,然後單擊右側“應用”以儲存更改。
重啟IIS伺服器,使配置生效。
訪問網站進行驗證,並查看訪問日誌(預設日誌路徑為
C:\inetpub\logs\LogFiles\W3SVC1\),應顯示真實用戶端IP地址。
Apache配置方案
Apache 2.4及以上版本的安裝包中內建remoteip_module模組檔案(mod_remoteip.so),Apache伺服器使用該模組擷取用戶端IP地址。
Alibaba Cloud Linux / CentOS / RHEL
編輯 Apache 主設定檔。
sudo vim /etc/httpd/conf/httpd.conf在檔案末尾添加以下內容。
# 啟用 mod_remoteip LoadModule remoteip_module modules/mod_remoteip.so # 指定 WAF 傳遞真實 IP 的要求標頭(WAF 使用 X-Forwarded-For) RemoteIPHeader X-Forwarded-For # 設定WAF回源IP段 請務必替換為阿里雲 WAF 的回源 IP 段 RemoteIPTrustedProxy 100.xx.xx.0/10 RemoteIPTrustedProxy 11.xx.xx.0/13 RemoteIPTrustedProxy 112.xx.xx.0/16定位至設定檔的日誌格式部分,將其中的
%h改為%a,%a表示串連的遠程 IP(經mod_remoteip修正後的真實用戶端 IP),%h為原始串連 IP(即 WAF 節點 IP)。修改後的樣本如下圖所示。
重啟Apache服務使配置生效。
sudo systemctl restart httpd訪問網站進行驗證,並查看訪問日誌,應顯示真實用戶端IP地址。
tail -f /var/log/httpd/access_log
Ubuntu / Debian
啟用模組
remoteip。sudo a2enmod remoteip編輯 Apache 主設定檔。
sudo vim /etc/apache2/apache2.conf在檔案末尾添加以下內容。
# 指定 WAF 傳遞真實 IP 的要求標頭(WAF 使用 X-Forwarded-For) RemoteIPHeader X-Forwarded-For # 設定WAF回源IP段 請務必替換為阿里雲 WAF 的回源 IP 段 RemoteIPTrustedProxy 100.xx.xx.0/10 RemoteIPTrustedProxy 11.xx.xx.0/13 RemoteIPTrustedProxy 112.xx.xx.0/16定位至設定檔的日誌格式部分,將其中的
%h改為%a,%a表示串連的遠程 IP(經mod_remoteip修正後的真實用戶端 IP),%h為原始串連 IP(即 WAF 節點 IP)。修改後的樣本如下圖所示。
重啟Apache服務使配置生效。
sudo systemctl restart apache2訪問網站進行驗證,並查看訪問日誌,應顯示真實用戶端IP地址。
tail -f /var/log/apache2/access.log
Tomcat配置方案
Tomcat伺服器通過啟用X-Forwarded-For功能,擷取用戶端IP地址。
前往Tomcat的安裝目錄,開啟
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"/>重啟Tomcat。
sudo systemctl restart tomcat訪問網站進行驗證,並查看訪問日誌,應顯示真實用戶端IP地址。
# 請將以下命令替換為實際的Tomcat安裝目錄路徑,並替換為實際的記錄檔 tail -f /opt/tomcat/logs/localhost_access_log.2026-01-01.txt
Kubernetes 叢集配置方案
當使用Nginx Ingress Controller的Kubernetes叢集服務接入WAF時,原始用戶端 IP 會被 WAF 添加至 X-Forwarded-For 要求標頭。預設情況下,Nginx Ingress Controller 不會信任該欄位,導致業務容器無法擷取真實用戶端 IP。
為正確透傳真實 IP,請按以下步驟配置 Nginx Ingress Controller。
編輯 Ingress Controller 的 ConfigMap:
kubectl -n kube-system edit cm nginx-configuration在
data欄位中添加以下配置項:compute-full-forwarded-for: "true" forwarded-for-header: "X-Forwarded-For" use-forwarded-headers: "true"儲存並退出。配置將自動生效,無需重啟 Pod。
完成上述配置後,Ingress Controller 會將
X-Forwarded-For中的第一個 IP 位址識別為用戶端真實 IP,並在轉寄請求時保留該值。
進階最佳化:使用自訂Header
在複雜的網路架構中,依賴標準的 X-Forwarded-For (XFF) 頭可能存在被偽造、多層代理 IP 混淆或解析邏輯複雜等風險。為了提升安全性與可控性,可以自訂一個專屬 HTTP Header 來透傳真實用戶端 IP。
以下樣本示範如何通過自訂 HTTP Header 擷取真實用戶端 IP 位址。樣本對應的網路架構如圖所示。
CDN配置:
CDN 預設在回源請求中攜帶
Ali-Cdn-Real-IpHTTP 要求頭,該頭部表示用戶端與 CDN 節點建立串連時使用的真實 IP 位址。可通過增加自訂出站要求標頭,將該 IP 位址傳遞至 WAF。在CDN控制台的配置樣本如下。配置項
樣本
请求头操作
增加
自定义请求头参数
自訂回源要求標頭
自定义请求头名称
填寫自訂名稱,例如
TrueIP请求头值
$http_Ali_Cdn_Real_Ip是否允许重复
不允許
規則條件
不使用
WAF配置:
在 WAF 控制台需完成以下兩項配置:
“WAF前是否有七層代理(高防/CDN等)”:用於使 WAF 正確識別真實用戶端 IP;
“啟用流量標記”:用於使來源站點伺服器擷取真實用戶端 IP。
具體配置方法,請參見擷取真實用戶端資訊。
配置項
樣本
WAF前是否有七層代理(高防/CDN等)
選擇“是”,並繼續選擇“【推薦】取指定Header欄位中的第一個IP作為客戶端源IP,避免XFF偽造”,填寫上一步在CDN配置的自定义请求头名称,例如
TrueIP。啟用流量標記
選擇客戶端真實源IP,並填寫上一步在CDN配置的自定义请求头名称,例如
TrueIP。來源站點伺服器配置:
以Nginx為例,編輯
nginx.conf主設定檔,在http {}塊中添加以下內容。具體資訊,請參見Nginx配置方案。http { # 信任來自 WAF 回源 IP 的要求標頭 # 請替換為實際從控制台擷取的 WAF 回源 IP 段,每個網段單獨一行 # 必須包含全部 WAF 回源網段,若有遺漏,則可能導致日誌仍顯示 WAF 的回源IP,而非用戶端真實 IP。 set_real_ip_from <ip_range1>; set_real_ip_from <ip_range2>; ... set_real_ip_from <ip_rangex>; # 指定從自訂的要求標頭提取真實 IP,本樣本使用TrueIP real_ip_header TrueIP; }同時,建議在來源站點伺服器安全性群組配置僅允許存取WAF回源IP段,該措施可確保僅有WAF能與來源站點伺服器建立通訊,避免攻擊者訪問來源站點伺服器公網IP,繞過WAF發起攻擊。
常見問題
來源站點伺服器的真實 IP 擷取配置與 WAF 控制台中的“WAF前是否有七層代理(高防/CDN等)”配置項有什麼區別?
來源站點伺服器的真實 IP 擷取配置(本文內容)
作用:CNAME 接入 WAF 後,使來源站點伺服器(如 Nginx)的訪問日誌(例如
access.log)記錄真實用戶端 IP,而非 WAF 的回源 IP。是否必需:僅在需要於來源站點側查看或處理真實用戶端 IP 時才需配置;否則可不配置。
WAF控制台的“WAF前是否有七層代理(高防/CDN等)”配置項
適用情境:當 WAF 前方部署了其他七層代理(如 CDN、高防等)時。
作用:告知 WAF 從指定 HTTP 要求頭(如
Ali-Cdn-Real-Ip或X-Forwarded-For)中提取真實用戶端 IP,以確保安全報表、攻擊識別基於真實來源 IP。是否必需:僅在 WAF 前存在七層代理時才需啟用並正確配置;若無前置代理,應保持預設值“否”。
X-Forwarded-For偽造是什麼,如何避免?
X-Forwarded-For(XFF)偽造是指攻擊者在 HTTP 要求中構造或篡改 X-Forwarded-For 要求標頭,注入虛假的用戶端 IP 位址,以繞過基於 IP 的存取控制、日誌審計或安全性原則。由於 X-Forwarded-For 是一個可由用戶端任意設定的非標準要求標頭,若後端服務未經驗證直接信任該欄位,將導致安全風險。
樣本:XFF 偽造攻擊命令
攻擊者可使用如下 curl 命令偽造 X-Forwarded-For 頭,聲稱其 IP 為 1.2.3.4:
curl -H "X-Forwarded-For: 1.2.3.4" https://example.com/為防範 XFF 偽造,可通過使用自訂可信要求標頭傳遞真實 IP的方式進行防範:
配置 CDN 或 WAF 在回源時使用預定義的、非公開的自訂 HTTP 要求頭傳遞真實用戶端 IP,並在來源站點側僅解析該自訂頭。由於該頭由可信中介軟體(如 WAF)注入,且不被用戶端直接控制,可有效避免偽造。