【发布时间】:2017-03-17 15:44:35
【问题描述】:
我一直在尝试使用 Apache mod_proxy 和 mod_remoteip,以确认我对 X-Forwarded-For 标头处理的理解,特别是关于如何处理内部 IP 地址(例如 10.xxx 或 192.168.xx 范围) .
似乎 mod_proxy 并不总是将内部 IP 地址添加到 X-Forwarded-For 标头中,但我一直无法找到任何解释此预期行为的文档。
据我所知,当请求从内部 IP 地址发起时,mod_proxy 会将内部 IP 地址添加到 X-Forwarded-For 标头中,但是当初始请求来自公共 IP 时,mod_proxy 不会似乎将任何内部 IP 地址添加到 X-Forwarded-For。
问题
我的问题是:管理 mod_proxy 是否将调用 IP 地址附加到 X-Forwarded-For 标头的规则是什么。
在反向代理模式下(例如,使用 ProxyPass 指令),mod_proxy_http 添加多个请求标头,以便将信息传递到源服务器。这些标题是:
X-Forwarded-For - 客户端的 IP 地址。
X-Forwarded-Host - Host HTTP 请求头中客户端请求的原始主机。
X 转发服务器 - 代理服务器的主机名。
在源服务器上使用这些标头时要小心,因为如果原始请求已经包含这些标头之一,它们将包含多个(逗号分隔)值。例如,您可以在源服务器的日志格式字符串中使用 %{X-Forwarded-For}i 来记录原始客户端 IP 地址,但如果请求经过多个代理,您可能会得到多个地址。
我的意思是客户端 IP 地址将始终附加到 X-Forwarded-For 标头,但这不是我观察到的行为。
这个问题的其余部分是我进行的测试和我观察到的行为。
设置
我设置了两台运行 Apache 并安装了 mod_proxy 的服务器。我将它们称为一和二。
- 一个具有(内部)IP 地址 10.0.7.1
- Two 的(内部)IP 地址为 10.0.7.2
One 具有以下 ProxyPass 指令,以便将对 /proxyToTwo 的子路径的请求发送到 /proxyToOne on Two 下的等效子路径
<Location "/proxyToTwo">
ProxyPass http://10.0.7.2/proxyToOne
</Location>
Two 具有以下 ProxyPass 指令,因此对 /proxyToOne 的子路径的请求被发送回 One 但没有 /proxyToOne 前缀
<Location "/proxyToOne">
ProxyPass http://10.0.7.1
</Location>
这样做的效果是,当我向http://One/proxyToTwo/foo 发出请求时,它的代理如下
- 一个收到请求,向两个
http://10.0.7.2/proxyToOne/foo发出以下请求 - 二号收到请求,将以下请求发回一号
http://10.0.7.1/foo - 收到
/foo的请求并实际为资源提供服务
因此,每个请求都会从一跳到二,然后返回到一,然后再响应两次。
使用内部 IP 调用
使用上述设置,我使用它的内部 IP 地址从两个呼叫一个:
curl http://10.0.7.1/proxyToTwo/foo
当 One 最终收到对 /foo 资源的请求时收到的 X-Forwarded-For 和 X-Forwarded-Host 标头是我所期望的如下:
X-Forwarded-For: 10.0.7.2, 10.0.7.1
X-Forwarded-Host: 10.0.7.1, 10.0.7.2
这是我所期望的,请求首先通过一个代理,然后是两个,请求 IP 地址首先是来自两个 (curl) 的初始请求,然后是来自一个 (mod_proxy) 的请求和最终请求(不在标头,因为它是来自两个(mod_proxy)的连接的客户端 IP
使用外部 IP 调用
意外的行为是 mod_proxy 在从公共 IP 调用时似乎表现不同。因此,我没有从二中调用一,而是使用公共地址从本地计算机调用一
curl http://35.162.28.102/proxyToTwo/foo
X-Forwarded-Host 仍然是我所期望的:
X-Forwarded-Host: 35.162.28.102, 10.0.7.2
也就是说,请求首先通过 One 代理(使用它的外部地址),然后通过 Two。
但 X-Forwarded-For 标头仅显示我的(外部)IP 地址:
X-Forwarded-For: 35.163.25.76
这表明 mod_proxy 的初始执行是添加带有客户端 IP 地址的 X-Forwarded-For 标头。但是随后二号的代理并没有附加一号的地址。
我认为这种行为可能比盲目地将内部 IP 地址附加到标头更有用,但我无法在任何地方找到它的文档,因此希望确保我完全理解它。
【问题讨论】:
-
检查了 mod_proxy 代码后,我看不到任何会导致上述行为的东西。所以我的工作理论是,这实际上是由 mod_proxy 和 mod_remoteip 之间的交互引起的。
标签: apache mod-proxy x-forwarded-for