核心是让后端应用拿到的REMOTE_ADDR为用户真实IP,需启用mod_remoteip模块,配置RemoteIPHeader指定HTTP头(如X-Forwarded-For),并用RemoteIPTrustedProxy严格列出所有可信代理出口IP或网段,使Apache主动可信替换而非后端解析。

核心是让后端应用拿到的 REMOTE_ADDR 是用户真实 IP,而不是 Apache 本机地址。这不能靠后端“猜”,而要由 Apache 主动修正并可信传递。
用 mod_remoteip 模块自动修正 REMOTE_ADDR
这是最推荐、最安全的方式(Apache 2.4+ 默认支持)。它不依赖后端解析头,而是直接替换服务器变量:
- 启用模块:
LoadModule remoteip_module modules/mod_remoteip.so - 指定真实 IP 所在的请求头(通常是
X-Forwarded-For):RemoteIPHeader X-Forwarded-For - 严格列出所有可信代理的出口 IP 或网段(不是 VIP,不是监听地址):
RemoteIPTrustedProxy 192.168.10.0/24、RemoteIPTrustedProxy 203.0.113.45等 - 配置后,
$_SERVER['REMOTE_ADDR'](PHP)、request.remote_addr(Python WSGI)等就直接是用户真实 IP,无需再手动读取X-Forwarded-For
确保上游代理正确生成并追加 X-Forwarded-For
Apache 不会自己创建这个头,它只负责解析。上游必须把客户端 IP 写进去:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Nginx 反向代理:用
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - CDN(如 Cloudflare、阿里云 SLB):默认携带,但注意它们可能用
Cf-Connecting-IP或X-Real-IP,此时需同步修改RemoteIPHeader - Apache 自身作为前端代理:需显式添加,例如:
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e"(配合mod_headers)
同步更新日志与后端行为
mod_remoteip 修正的是内部变量,但默认日志仍记录代理 IP:
- 日志格式中把
%h改为%a,才能在 access_log 中看到真实 IP - 后端代码应直接使用
REMOTE_ADDR,不要再从HTTP_X_FORWARDED_FOR手动提取——绕过 mod_remoteip 的可信校验,易被伪造 - 若用了 PROXY Protocol(如 HAProxy 启用),还需加
RemoteIPProxyProtocol On
验证与排查关键点
配置生效后,重点检查三项:
- 执行
httpd -M | grep remoteip,确认模块已加载 - 抓包或开启 Apache 日志记录请求头,确认到达的
X-Forwarded-For格式为真实IP, 代理1, 代理2,且最左确实是客户端 IP - 检查
RemoteIPTrustedProxy是否覆盖了所有中间代理的真实出口 IP —— 少一个,链就断,REMOTE_ADDR会退回到上一级代理 IP

















