考虑场景/流程:
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>