apache反向代理需三步打通真实ip:启用mod_headers设x-forwarded-for头;自定义logformat用%{x-forwarded-for}i记日志;启用mod_remoteip并配置remoteipinternalproxy和remoteipheader,使remote_addr变为真实ip。
apache 用 mod_proxy 做反向代理时,后端看到的 remote_addr 默认是 apache 自己的内网地址(比如 127.0.0.1),不是用户真实 ip。要正确传递真实客户端 ip,得从头到尾打通三环:上游传进来、apache 接得住、后端拿得到。
确保 X-Forwarded-For 头被正确生成和转发
Apache 本身不主动加 X-Forwarded-For,它依赖上游(比如 CDN、Nginx 或前置 Apache)提供。如果 Apache 是最前端,必须自己加:
- 启用
mod_headers模块:LoadModule headers_module modules/mod_headers.so - 在虚拟主机或全局配置中加入:
RequestHeader set "X-Forwarded-For" "%{REMOTE_ADDR}e" early - 如果是 HTTPS 站点,顺带补上协议头:
RequestHeader set "X-Forwarded-Proto" "https" early
注意:early 表示在请求早期就注入,避免被后续模块覆盖;%{REMOTE_ADDR}e 是当前连接的真实客户端 IP(非代理 IP)。
让 Apache 日志记录真实 IP
仅改头还不足以影响日志,需自定义日志格式:
- 修改
LogFormat,用%{X-Forwarded-For}i替代默认的%h:LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined_realip - 再指定访问日志使用该格式:
CustomLog logs/access_log combined_realip
重启后,日志首字段就是 X-Forwarded-For 的完整值(如 203.0.113.45, 192.168.1.10),第一个 IP 就是用户真实地址。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
让后端应用真正读到真实 IP(关键一步)
光有头没用——PHP 里 $_SERVER['REMOTE_ADDR']、Java 里 request.getRemoteAddr() 还是返回 127.0.0.1。必须启用 mod_remoteip 模块来“替换”这个变量:
- 确认已加载:
LoadModule remoteip_module modules/mod_remoteip.so - 配置信任的代理网段(防止伪造):
RemoteIPInternalProxy 192.168.0.0/16 10.0.0.0/8 172.16.0.0/12 - 指定从哪个头取 IP:
RemoteIPHeader X-Forwarded-For
配置生效后,REMOTE_ADDR 就自动变成 X-Forwarded-For 中最左边的有效 IP,后端代码无需改动就能直接使用。
多层代理下的安全处理建议
如果前面还有 CDN 或 Nginx,X-Forwarded-For 可能是长链(如 真实IP, CDN_IP, Nginx_IP)。这时不能盲目取第一个,而应结合 RemoteIPInternalProxy 限定可信代理范围,mod_remoteip 会自动跳过可信代理,只取链中最左的不可信 IP ——也就是真实客户端 IP。
不复杂但容易忽略










