0

考虑场景/流程:

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 中设置后尝试调用Require指令 (mod_authz_host) 。RemoteIPHeader X-Forwarded-For
  • 如果我proxy1从流程中删除,那么我proxy2会在反向代理的 XFF 标头中看到地址,而不会出现问题。

我不确定我在配置或测试中遗漏了什么,虽然不是标准的,但 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>
4

1 回答 1

0

Vhost 缺少 RemoteIPTrustedProxy 指令。

“当标头值中列出了多个以逗号分隔的用户代理 IP 地址时,它们会按从右到左的顺序进行处理。当不信任给定的用户代理 IP 地址来呈现前面的 IP 地址时,处理将停止。标头字段已更新到这个剩余的未确认 IP 地址列表,或者如果所有 IP 地址都受信任,则从请求中完全删除此标头。”

https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html#remoteiptrustedproxy

像往常一样,答案就在我面前。

于 2020-03-27T03:50:35.533 回答