linux apache多级代理真实ip透传需每跳手动拼接x-forwarded-for并启用mod_remoteip校验:一级用set初始化,后续用edit追加,全加early;启用proxypreservehost;后端配置remoteipinternalproxy与remoteipheader,并验证%a输出原始ip。

在 Linux 的 Apache 中实现多级代理下的真实 IP 透传,核心不是“开一个开关”,而是每跳都主动注入、逐层拼接、后端严格校验。关键在于避免 X-Forwarded-For 被覆盖或伪造,同时确保后端能准确提取最左侧可信客户端 IP。
每级 Apache 都要配置 RequestHeader 拼接 X-Forwarded-For
不能只在第一级加头,也不能用 ProxyAddHeaders 自动填——它只会简单追加,且不支持控制格式。必须手动用 RequestHeader 控制行为:
- 第一级(公网入口):用
set初始化头:RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" early - 第二级及后续跳板机:用
edit拼接,避免覆盖:RequestHeader edit X-Forwarded-For ^(.*)$ "$1, %{REMOTE_ADDR}e" early - 所有层级都加
early修饰符,确保在 mod_proxy 处理前注入,防止被 rewrite 或安全模块清空
启用 ProxyPreserveHost 并配合 Host 头透传
Host 头默认会被 Apache 替换为后端目标地址,导致后端无法识别原始域名。需显式保留:
- 每级代理都启用:
ProxyPreserveHost On - 若后端还需协议信息(如判断 HTTPS),补充:
RequestHeader set X-Forwarded-Proto "https" env=HTTPSRequestHeader set X-Forwarded-Proto "http" env=!HTTPS
后端 Apache 必须启用 mod_remoteip 做可信解析
仅转发 X-Forwarded-For 不够——后端若直接读 REMOTE_ADDR,看到的仍是上一跳代理 IP。必须用 mod_remoteip 模块递归解析并替换:
- 确认已加载:
LoadModule remoteip_module modules/mod_remoteip.so - 在虚拟主机或全局配置中声明可信代理段:
RemoteIPInternalProxy 10.0.10.0/24RemoteIPInternalProxy 192.168.5.100
(填你各级跳板机的真实内网 IP 或网段) - 指定从哪个头提取真实 IP:
RemoteIPHeader X-Forwarded-For - 日志中即可用
%a(自动输出解析后的客户端 IP)替代%h
验证与防伪造的关键动作
配置完不等于生效,必须做三件事:
- 用
curl -H "X-Forwarded-For: 1.1.1.1" http://your-domain.com/test测试后端是否忽略外部伪造头(应仍显示真实 IP) - 抓包检查各级请求头:确认 X-Forwarded-For 字段按 “客户端IP,一级IP,二级IP” 顺序出现,无重复或错位
- 查看后端 access_log,确认
%a字段输出的是最左原始 IP,而非中间代理 IP











