通过多个代理传递客户端 IP

通过多个代理传递客户端 IP

我在 Apache httpd 服务器前面有一个负载平衡器,而该服务器又在运行 Tomcat6 的服务器前面。我们使用 Tomcat 来运行 Shibboleth 的 IdP。如下所示:

Client -> Load Balancer -> Apache httpd server (mod_proxy_ajp) -> Tomcat server

我希望将客户端的 IP 传递给 Tomcat 服务器。LB 将变量传递ClientIP给 httpd 服务器,我可以在 httpd 的 LogFormat 中将其解析为"%{ClientIP}i",但这显然不会到达 Tomcat 服务器,而是 Tomcat 记录了 LB 的 IP。

我尝试使用 Tomcat 的 RemoteIpValve 作为(在server.xml内部<Engine>):

> <Valve className="org.apache.catalina.valves.RemoteIpValve"   
> remoteIpHeader="X-Forwarded-For"    protocolHeader="X-Forwarded-Proto"
> protocolHeaderHttpsValue="https" />

希望利用mod_proxy会传递 IP 而X-Forwarded-For无法成功。我看过 上的帖子mod_rpaf,但我希望在不使用其他 apache httpd mods 的情况下做到这一点。

我认为我离把所有这些联系在一起只差几步之遥,但却陷入了困境。有什么想法吗?

答案1

如果负载均衡器将客户端 IP 地址插入名为 ClientIP 的标头中,mod_proxy 应将其传递给 Tomcat 服务器,而无需任何特殊配置。尝试配置 Tomcat RemoteIpValve 以查找客户端IP代替X-转发例如

<Valve className="org.apache.catalina.valves.RemoteIpValve" 
       remoteIpHeader="ClientIP"
       protocolHeaderHttpsValue="https" />

相关内容