Tomcat 中的 X-forwarded-for NULL

Tomcat 中的 X-forwarded-for NULL

我们在负载均衡器中注入 x-forwarded-for 标头,它将请求发送到 apache Web 服务器,后者又将请求代理(mod_proxy_balancer)到后端 tomcat 服务器。我们在 apache 上的“x-forwarded-for”标头中看到了客户端 IP,但是在 Tomcat 访问日志中得到的却是“-”。

我们已经在 Tomcat 上的 internalProxies 列表中添加了负载均衡器 IP。

https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html对于安全连接(来自内部代理的请求),x-forwarded-for 似乎变为 NULL,并且客户端 IP 被分配给远程地址。对吗?使用内部代理设置时,有没有办法将客户端 IP 保留在 tomcat 上的 x-forwarded-for 标头中?

谢谢

答案1

在我们的案例中,Web 服务器和 Tomcat 服务器之间使用了 AJP。更新:我在 Tomcat 文档中找到了此答案,https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html,我认为这是正在发生的事情。具体来说:

如果传入的 request.getRemoteAddr() 与阀门的内部代理列表匹配:

  • 在给定请求的 Http 标头(名为 $remoteIpHeader,默认值为 x-forwarded-for)中,循环遍历由前一个负载均衡器或代理传递的 IP 和主机名的逗号分隔列表。值按从右到左的顺序处理。对于列表中的每个 IP/主机:
  • 如果它与内部代理列表匹配,则 ip/主机被吞掉
  • 如果它与受信任的代理列表匹配,则将 ip / 主机添加到创建的代理标头中,否则,将 ip / 主机声明为远程 ip 并停止循环。
  • 如果请求 http 标头名为 $protocolHeader(例如 x-forwarded-for)等于 protocolHeaderHttpsValue 配置参数的值(默认 https),则 request.isSecure = true、request.scheme = https 且 request.serverPort = 443。请注意,443 可以被 $httpsServerPort 配置参数覆盖。

相关内容