【发布时间】:2020-07-06 14:11:10
【问题描述】:
考虑场景/流程:
remote user (client) > proxy1 > proxy2 > AWS ALB > httpd/reverse_proxy > my_application
当用户的请求传出他们的网络时,X-Forwarded-For (XFF) 标头会附加每个后续代理的 IP 地址。 例如,当它到达 ALB 时,XFF 标头包含“192.168.1.100, 100.99.98.97”。 然后 ALB 会将 ClientIP 附加到此标头,在本例中为 proxy2 的 IP。 最后,当请求到达我的应用程序前面的反向代理时,XFF 标头现在是:“192.168.1.100, 100.99.98.97, 95.94.93.92”。
我看到的问题: 在 reverse_proxy 中,httpd 似乎忽略或丢弃了 X-Forwarded-For 标头链中的最后一个/最右边的 IP,特别是当有超过 2 个地址时。
- 反向代理的 tcpdump 显示标头包含 完整 链,因此 AWS ALB 正在做它应该做的并附加 proxy2 的地址。
- 在 httpd 访问日志中打印 XFF 标头时,我只看到打印的链中的前 2 个地址。
- 更重要的是,当尝试对预期的第三个地址采取行动时,此测试失败,进一步证明(我认为)第三个地址被丢弃。 “采取行动”是指在 vhost 中设置
RemoteIPHeader X-Forwarded-For之后尝试调用Require指令 (mod_authz_host)。 - 如果我从流中删除
proxy1,我会在反向代理的 XFF 标头中看到proxy2的地址,而不会出现问题。
我不确定我在配置或测试中遗漏了什么,虽然不是标准,但 XFF 标头中的多个地址很常见。我只在 Apache httpd 2.4 中遇到这个问题。在 2.2 版中,这不是问题,我可以重复相同的设置/流程,我会看到链中的所有 3 个地址。 提前致谢。
示例虚拟主机:
<VirtualHost *:80>
ProxyPreserveHost On
ServerName myapp.mydomain.com
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
RemoteIPHeader X-Forwarded-For
ProxyPass / http://10.1.2.3:8080/ timeout=3600
ProxyPassReverse "/" http://10.1.2.3:8080/
SetEnv proxy-sendchunked
ErrorLog /var/log/httpd/error_myapp
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined2
CustomLog /var/log/httpd/access_myapp combined2
</VirtualHost>
【问题讨论】:
标签: apache http http-headers reverse-proxy x-forwarded-for