客戶端真實(shí) IP 及端口
XWAF 獲取通過 CDN 等代理服務(wù)器訪問的客戶端真實(shí) IP
一般 CDN 會(huì)通過 XFF(X-Forwarded-For) 或 X-Real-IP 來傳遞來訪用戶的真實(shí) IP,但是不排除用戶構(gòu)造該字段偽造請(qǐng)求 IP 的情況出現(xiàn)。
如果想在 WAF 端獲取到來訪用戶的真實(shí)的 IP,需要做如下操作
1、打開 WEB 應(yīng)用防火墻控制臺(tái)的【域名管理】,選中需要設(shè)置的域名,點(diǎn)擊【編輯】
2、打開后,開啟【W(wǎng)AF 前是否具有代理】選項(xiàng),并在【真實(shí) IP 字段設(shè)置】處填入 真實(shí)IP 字段(該字段請(qǐng)與您的CDN供應(yīng)商確認(rèn)真實(shí) IP 字段)
3、配置完成后,點(diǎn)擊【確定】,即可讓 XWAF 獲取到客戶到客戶端真實(shí) IP。
源站獲取客戶端真實(shí) IP
XWAF 會(huì)在回源請(qǐng)求頭中添加 X-Real-IP 和 X-Forwarded-For 兩個(gè)字段來傳遞來訪用戶的真實(shí) IP,在源站服務(wù)器中可進(jìn)行相應(yīng)的配置以便獲取這兩個(gè)字段的值。
X-Real-IP 與 X-Forwarded-For 的區(qū)別
代理服務(wù)器(比如 XWAF)會(huì)把請(qǐng)求的來源 IP 寫入 X-Real-IP 字段,然后發(fā)送給源站,這個(gè)字段只會(huì)有一個(gè) IP 地址;而每經(jīng)過一級(jí)代理,代理服務(wù)器會(huì)把來源追加到 X-Forwarded-For 中,在多次代理的情況下,則該字段會(huì)有多個(gè) IP 地址(真實(shí) IP, 代理服務(wù)器 1, 代理服務(wù)器 2, ...)。
源站獲取客戶端真實(shí)端口
XWAF 會(huì)在回源請(qǐng)求頭中添加 X-Real-Port 字段來傳遞來訪用戶的真實(shí)端口,源站可通過取這個(gè)頭部字段的值獲取用戶客戶端真實(shí)的端口。
示例配置
對(duì)于常見的 HTTP 服務(wù)器或 Web 應(yīng)用程序,可以通過下面的方法來獲取客戶端真實(shí) IP:
Nginx
對(duì)于 Nginx 服務(wù)器,可以使用 $http_x_real_ip 取得 X-Real-IP 字段的值,使用 $http_x_real_port 取得 X-Real-Port 字段的值。利用 Nginx 的 http_realip_module 模塊可以讓 $remote_addr 顯示為客戶端的真實(shí) IP,添加的配置如下:
set_real_ip_from 回源IP段; # 回源IP段請(qǐng)參考“XWAF注意事項(xiàng)&FAQ”,多個(gè)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 獲取的客戶端真實(shí) 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ù)器,有可能無法獲取真實(shí) IP。此種情況需要參照前文WAF 獲取通過 CDN 等代理服務(wù)器訪問的客戶端真實(shí) IP提前在域名設(shè)置中開啟【W(wǎng)AF 前是否具有代理】選項(xiàng)并指定客戶端真實(shí) IP 字段。