全部产品
Search
文档中心

Web 应用防火墙:通过 HTTP 请求头获取客户端真实 IP 

更新时间:Mar 09, 2026

在 CNAME 接入 Web应用防火墙(Web Application Firewall,简称WAF)的架构中,源站收到的请求源 IP 为最后一跳代理地址,而非客户端真实 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应用防火墙控制台,在顶部菜单栏,选择WAF实例的资源组和地域(中国内地非中国内地),单击接入管理 > CNAME接入 > Web应用防火墙回源IP网段列表 ,记录获取所有的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
说明

通过yum install nginxapt install nginx安装的版本通常包含该模块,仅当使用自定义编译版本或极简镜像时可能缺失。

添加 realip 模块(仅缺失时适用)

方式一:通过系统包管理器重新安装

# Alibaba Cloud Linux / CentOS / RHEL
sudo yum reinstall nginx -y

# Ubuntu / Debian
sudo apt install --reinstall nginx-core nginx-full

方式二:源码编译

  1. 安装依赖。

    # 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
  2. 查看已安装的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

  3. 下载对应版本的 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
  4. 配置编译选项,请将步骤 2中获取的原始参数复制,并在其末尾追加 --with-http_realip_module

    ./configure \
      --prefix=/usr/local/nginx \
      --with-http_ssl_module \
      --with-http_v2_module \
      --with-http_realip_module
  5. 编译并升级服务。

    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 段

  1. 编辑 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;
    }
  2. 重载 Nginx 配置:

    nginx -t && nginx -s reload

验证

  1. 访问网站,请将http://your-domain.com/替换为已接入WAF的域名。

    curl http://your-domain.com/
  2. 查看 Nginx 访问日志,应显示真实客户端IP地址。

    tail -f /var/log/nginx/access.log

IIS 7配置方案(IIS 7以上版本适用)

由于 WAF 作为反向代理,IIS 默认日志中的 c-ip 字段记录的是 WAF 回源 IP,而非真实用户 IP。为便于审计或日志排查,可通过 IIS 的 W3C 自定义日志字段 功能,将 X-Forwarded-For 请求头写入日志。

  1. 打开IIS管理器,在左侧连接树中,展开服务器节点,选择目标网站(例如 Default Web Site)。

  2. 双击右侧功能视图中的 “日志” 图标。image

  3. 日志文件区域,确认日志格式为 W3C(默认值)。若为其他格式,请切换为 W3C。

  4. 日志文件区域,单击 “选择字段…”。

  5. 在弹出的窗口底部,单击 “添加字段…”。

  6. 在“添加自定义字段”对话框中,填写以下信息,并单击确定。

    配置项

    配置说明

    字段名称

    填写X-FORWARDED-FOR

    源类型

    选择请求标头

    填写X-Forwarded-For

  7. 单击“确定”保存自定义字段。

  8. 再次单击“确定”关闭日志记录字段窗口,然后单击右侧“应用”以保存更改。

  9. 重启IIS服务器,使配置生效。

  10. 访问网站进行验证,并查看访问日志(默认日志路径为C:\inetpub\logs\LogFiles\W3SVC1\),应显示真实客户端IP地址。

Apache配置方案

Apache 2.4及以上版本的安装包中自带remoteip_module模块文件(mod_remoteip.so),Apache服务器使用该模块获取客户端IP地址。

Alibaba Cloud Linux / CentOS / RHEL

  1. 编辑 Apache 主配置文件。

    sudo vim /etc/httpd/conf/httpd.conf
  2. 在文件末尾添加以下内容。

    # 启用 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
  3. 定位至配置文件的日志格式部分,将其中的 %h 改为 %a%a 表示连接的远程 IP(经 mod_remoteip 修正后的真实客户端 IP),%h 为原始连接 IP(即 WAF 节点 IP)。修改后的示例如下图所示。image

  4. 重启Apache服务使配置生效。

    sudo systemctl restart httpd
  5. 访问网站进行验证,并查看访问日志,应显示真实客户端IP地址。

    tail -f /var/log/httpd/access_log

Ubuntu / Debian

  1. 启用模块remoteip

    sudo a2enmod remoteip
  2. 编辑 Apache 主配置文件。

    sudo vim /etc/apache2/apache2.conf
  3. 在文件末尾添加以下内容。

    # 指定 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
  4. 定位至配置文件的日志格式部分,将其中的 %h 改为 %a%a 表示连接的远程 IP(经 mod_remoteip 修正后的真实客户端 IP),%h 为原始连接 IP(即 WAF 节点 IP)。修改后的示例如下图所示。image

  5. 重启Apache服务使配置生效。

    sudo systemctl restart apache2
  6. 访问网站进行验证,并查看访问日志,应显示真实客户端IP地址。

    tail -f /var/log/apache2/access.log

Tomcat配置方案

Tomcat服务器通过启用X-Forwarded-For功能,获取客户端IP地址。

  1. 前往Tomcat的安装目录,打开tomcat/conf/server.xml配置文件。

  2. 将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"/>
  3. 重启Tomcat。

    sudo systemctl restart tomcat
  4. 访问网站进行验证,并查看访问日志,应显示真实客户端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。

  1. 编辑 Ingress Controller 的 ConfigMap:

    kubectl -n kube-system edit cm nginx-configuration
  2. 在 data 字段中添加以下配置项:

    compute-full-forwarded-for: "true"
    forwarded-for-header: "X-Forwarded-For"
    use-forwarded-headers: "true"
  3. 保存并退出。配置将自动生效,无需重启 Pod。

    完成上述配置后,Ingress Controller 会将 X-Forwarded-For 中的第一个 IP 地址识别为客户端真实 IP,并在转发请求时保留该值。

进阶优化:使用自定义Header

在复杂的网络架构中,依赖标准的 X-Forwarded-For (XFF) 头可能存在被伪造、多层代理 IP 混淆或解析逻辑复杂等风险。为了提升安全性与可控性,可以自定义一个专属 HTTP Header 来透传真实客户端 IP。

以下示例演示如何通过自定义 HTTP Header 获取真实客户端 IP 地址。示例对应的网络架构如图所示。

image
  1. CDN配置

    CDN 默认在回源请求中携带 Ali-Cdn-Real-Ip HTTP 请求头,该头部表示客户端与 CDN 节点建立连接时使用的真实 IP 地址。可通过增加自定义出站请求头,将该 IP 地址传递至 WAF。在CDN控制台的配置示例如下。

    配置项

    示例

    请求头操作

    增加

    自定义请求头参数

    自定义回源请求头

    自定义请求头名称

    填写自定义名称,例如TrueIP

    请求头值

    $http_Ali_Cdn_Real_Ip

    是否允许重复

    不允许

    规则条件

    不使用

  2. WAF配置

    在 WAF 控制台需完成以下两项配置: 

    • WAF前是否有七层代理(高防/CDN等)”:用于使 WAF 正确识别真实客户端 IP; 

    • 启用流量标记”:用于使源站服务器获取真实客户端 IP。

    具体配置方法,请参见获取真实客户端信息

    配置项

    示例

    WAF前是否有七层代理(高防/CDN等)

    选择“”,并继续选择“【推荐】取指定Header字段中的第一个IP作为客户端源IP,避免XFF伪造”,填写上一步在CDN配置的自定义请求头名称,例如TrueIP

    启用流量标记

    选择客户端真实源IP,并填写上一步在CDN配置的自定义请求头名称,例如TrueIP

  3. 源站服务器配置

    以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)注入,且不被客户端直接控制,可有效避免伪造。