客戶端真實 IP 及端口
XWAF 獲取通過 CDN 等代理服務(wù)器訪問的客戶端真實 IP
一般 CDN 會通過 XFF(X-Forwarded-For) 或 X-Real-IP 來傳遞來訪用戶的真實 IP,但是不排除用戶構(gòu)造該字段偽造請求 IP 的情況出現(xiàn)。
如果想在 WAF 端獲取到來訪用戶的真實的 IP,需要做如下操作
1、打開 WEB 應(yīng)用防火墻控制臺的【域名管理】,選中需要設(shè)置的域名,點擊【編輯】
2、打開后,開啟【W(wǎng)AF 前是否具有代理】選項,并在【真實 IP 字段設(shè)置】處填入 真實IP 字段(該字段請與您的CDN供應(yīng)商確認真實 IP 字段)
3、配置完成后,點擊【確定】,即可讓 XWAF 獲取到客戶到客戶端真實 IP。
源站獲取客戶端真實 IP
XWAF 會在回源請求頭中添加 X-Real-IP 和 X-Forwarded-For 兩個字段來傳遞來訪用戶的真實 IP,在源站服務(wù)器中可進行相應(yīng)的配置以便獲取這兩個字段的值。
X-Real-IP 與 X-Forwarded-For 的區(qū)別
代理服務(wù)器(比如 XWAF)會把請求的來源 IP 寫入 X-Real-IP 字段,然后發(fā)送給源站,這個字段只會有一個 IP 地址;而每經(jīng)過一級代理,代理服務(wù)器會把來源追加到 X-Forwarded-For 中,在多次代理的情況下,則該字段會有多個 IP 地址(真實 IP, 代理服務(wù)器 1, 代理服務(wù)器 2, ...)。
源站獲取客戶端真實端口
XWAF 會在回源請求頭中添加 X-Real-Port 字段來傳遞來訪用戶的真實端口,源站可通過取這個頭部字段的值獲取用戶客戶端真實的端口。
示例配置
對于常見的 HTTP 服務(wù)器或 Web 應(yīng)用程序,可以通過下面的方法來獲取客戶端真實 IP:
Nginx
對于 Nginx 服務(wù)器,可以使用 $http_x_real_ip 取得 X-Real-IP 字段的值,使用 $http_x_real_port 取得 X-Real-Port 字段的值。利用 Nginx 的 http_realip_module 模塊可以讓 $remote_addr 顯示為客戶端的真實 IP,添加的配置如下:
set_real_ip_from 回源IP段; # 回源IP段請參考“XWAF注意事項&FAQ”,多個IP段需多條指令。 real_ip_header X-Forwarded-For; # 也可以使用 X-Real-IP real_ip_recursive on; # 若WAF前有CDN等代理,需要此指令設(shè)為 on,否則不用。CopyErrorSuccess
若源站的 Nginx 作為代理服務(wù)器,在前文配置的基礎(chǔ)上還可在配置中添加以下內(nèi)容使得后端應(yīng)用也能通過 X-Real-IP 或 X-Forwarded-For 獲取的客戶端真實 IP:
# ... location / { # ... proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #
ASP
Request.ServerVariables("X-Real-IP")
JSP
request.getHeader("X-Real-IP")
PHP
$_SERVER["HTTP_X_FORWARDED_FOR"]
說明:
如果上層鏈路為 CDN 等第三方代理服務(wù)器,有可能無法獲取真實 IP。此種情況需要參照前文WAF 獲取通過 CDN 等代理服務(wù)器訪問的客戶端真實 IP提前在域名設(shè)置中開啟【W(wǎng)AF 前是否具有代理】選項并指定客戶端真實 IP 字段。