apache反向代理需配置x-forwarded-for传递真实客户端ip:启用mod_proxy、mod_proxy_http、mod_headers模块,用requestheader设置xff头;多级代理时启用mod_remoteip并配置remoteipinternalproxy指定可信代理网段,自动解析首段真实ip;严禁信任未校验的xff头,须严格限定可信代理ip范围并过滤非法xff。

Apache 作为反向代理参与负载均衡时,后端服务默认只能看到 Apache 自身的 IP(如 192.168.1.1),而非真实客户端 IP。要让后端正确识别用户来源,必须显式配置请求头部传递,核心是 X-Forwarded-For(XFF)头的生成与信任解析。
启用必要模块并设置 X-Forwarded-For 头
确保以下模块已加载(通常在 httpd.conf 或 mods-enabled/ 中):
-
mod_proxy和mod_proxy_http:用于反向代理转发 -
mod_headers:用于动态设置请求头
在虚拟主机或全局配置中添加:
<ifmodule mod_headers.c>
RequestHeader set "X-Forwarded-For" expr=%{REMOTE_ADDR}
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
RequestHeader set "X-Forwarded-Host" expr=%{HTTP_HOST}
</ifmodule>
该配置让 Apache 在转发请求时,将当前连接的客户端 IP(即上一级代理或用户直连 IP)写入 X-Forwarded-For 头。注意:若前端还有 CDN 或其他代理,此值只是“上一跳”IP,不是最终用户 IP。
处理多级代理链(推荐用 mod_remoteip)
当架构含 CDN + 负载均衡器 + Apache 时,X-Forwarded-For 会变成逗号分隔的链(如 203.0.113.5, 198.51.100.20, 192.168.1.10)。仅靠 RequestHeader set 无法自动提取最左侧真实 IP,需使用 mod_remoteip(Apache 2.4+ 内置):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 启用模块:
LoadModule remoteip_module modules/mod_remoteip.so - 指定可信代理网段(即你控制的前置负载均衡器、CDN 回源 IP 段等):
RemoteIPHeader X-Forwarded-For RemoteIPInternalProxy 192.168.1.0/24 RemoteIPInternalProxy 203.0.113.0/24 RemoteIPInternalProxy 2001:db8::/32
配置生效后,Apache 会自动解析 XFF 链,把第一个非可信代理的 IP(即最左侧的原始客户端 IP)赋给 %{REMOTE_ADDR} 环境变量和 $_SERVER['REMOTE_ADDR'](PHP),后端无需手动拆解字符串。
安全注意事项:防止 XFF 伪造
X-Forwarded-For 可被客户端随意构造,因此绝不能直接信任未校验的 XFF 值。关键原则:
- 只允许受信代理(如你自己的 Nginx、HAProxy、AWS ALB)添加或追加 XFF 头
- Apache 的
RemoteIPInternalProxy必须精确列出所有合法上游代理 IP 或 CIDR 段;不在列表中的代理发来的 XFF 将被忽略 - 禁用客户端主动发送 XFF:可在入口层(如前置防火墙或 WAF)丢弃含 XFF 的客户端请求,或在 Apache 中用
SetEnvIf清除非法头
例如,在 Apache 中过滤非可信来源的 XFF:
SetEnvIf X-Forwarded-For "^([0-9]{1,3}\.){3}[0-9]{1,3}$" bad_xff
RequestHeader unset X-Forwarded-For env=bad_xff
验证配置是否生效
部署后,可临时在后端应用(如 PHP)中打印请求头确认:
<?php echo "REMOTE_ADDR: " . $_SERVER['REMOTE_ADDR'] . "\n"; echo "HTTP_X_FORWARDED_FOR: " . ($_SERVER['HTTP_X_FORWARDED_FOR'] ?? 'not set') . "\n"; ?>
同时用 curl -H "X-Forwarded-For: 1.2.3.4" http://your-site/ 测试——若配置正确,REMOTE_ADDR 不应被该伪造头影响,仍显示真实来源 IP。









