Apache用mod_remoteip修正真实IP的核心是可信替换而非解析,需启用模块、配置可信代理网段及X-Forwarded-For头部,并仅添加直连代理IP到RemoteIPInternalProxy。

Apache中用mod_remoteip修正多级代理后的真实IP,核心是让服务器信任前置代理、正确识别X-Forwarded-For头部中最左边的客户端IP,并安全覆盖REMOTE_ADDR。关键不在“解析”,而在“可信替换”。
确认模块已启用且版本匹配
mod_remoteip仅在Apache 2.4及以上版本为内置基础模块,2.2及更早版本不支持。执行以下命令验证:
- apachectl -M | grep remoteip —— 应输出remoteip_module (shared)
- 若无输出,需手动加载:
LoadModule remoteip_module modules/mod_remoteip.so - 确保
mod_headers也已启用(用于调试和头透传)
配置可信代理网段与头部字段
必须明确告诉Apache哪些IP是它能信任的中间代理,否则会拒绝处理X-Forwarded-For,防止IP伪造攻击。典型配置如下:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<ifmodule remoteip_module>
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
RemoteIPInternalProxy 192.168.100.50 192.168.100.51
</ifmodule>
-
RemoteIPHeader:必须与负载均衡器实际发送的头部名称一致(常见为
X-Forwarded-For,CDN可能用True-Client-IP或CF-Connecting-IP,此时需同步修改) - RemoteIPInternalProxy:列出所有直接向本机转发请求的代理IP或网段;多级代理中,只需填最后一跳代理(即直连Apache的那台),不是全部跳数
- 若使用AWS ALB、Cloudflare等公有云服务,需查其官方文档获取其出口IP段并加入白名单
验证真实IP是否生效
配置生效后,REMOTE_ADDR将自动变为X-Forwarded-For中最左侧的IP(即原始客户端IP),而非代理IP。可通过以下方式确认:
- 在日志中添加调试字段:
LogFormat "%a %h %{X-Forwarded-For}i \"%r\" %>s" debug,其中%a显示修正后的IP,%h仍为连接来源IP(即代理IP),%{X-Forwarded-For}i显示原始头内容 - 用curl测试:
curl -H "X-Forwarded-For: 203.0.113.42, 192.168.1.10" http://your-site.com/test.php,后端脚本打印$_SERVER['REMOTE_ADDR']应为203.0.113.42 - 注意:
%{c}a格式可记录原始连接IP(即代理IP),用于审计比对
多级代理场景下的特别注意事项
当请求经过Nginx → HAProxy → Apache三级代理时,常见误区是把所有中间节点IP都加进RemoteIPInternalProxy。实际上:
- 只需将HAProxy的出站IP(即它连接Apache所用的IP)加入
RemoteIPInternalProxy - HAProxy需配置
option forwardfor并确保它把原始XFF链完整传递(如203.0.113.42, 203.0.113.10),mod_remoteip会自动取第一个非内网、非私有地址 - 若前端有CDN,CDN本身已是第一级代理,Apache只需信任CDN回源IP段,无需关心用户到CDN之间的路径
- 禁用
mod_rewrite手工覆盖REMOTE_ADDR,它与mod_remoteip冲突且无法参与授权(如Require ip)










