【发布时间】:2020-07-04 17:47:42
【问题描述】:
我们目前正在使用 Tomcat 7 更新 76 进行冗余服务器设置(2 个服务器 + 1 个负载平衡器)。为了满足我们公司的日志记录要求,我们正在尝试获取远程服务器的 IP,它实际上发送请求,而不是负载均衡器的 IP。不幸的是,我们无法让它与以下文档一起使用:
- https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html
- https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/AccessLogValve.html
- https://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Remote_IP_Valve
我们使用以下配置进行访问日志记录和远程阀门:
<Valve className="org.apache.catalina.valves.RemoteIpValve" internalProxies="xxx\.xxx\.xxx\.7|xxx\.xxx\.xxx\.8|xxx\.xxx\.xxx\.9" remoteIpHeader="X-Forwarded-For" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="access_log." suffix=".log"
pattern="%{org.apache.catalina.AccessLog.RemoteAddr}r %l %u %t "%r" %s %b"
requestAttributesEnabled="true" />
设置了请求标头“X-Forwarded-For”,并通过wireshark分析了负载平衡器。但是,我们仍然只能获得负载均衡器的 IP,而不是远程客户端的 IP。配置的IP地址已经检查过,并且是正确的。
【问题讨论】:
-
您使用的是什么负载均衡器?它可能被配置为不插入 XFF 标头
-
负载均衡器用wireshark测试过,显示对应的header字段。很难进一步研究负载均衡器的配置,因为它是由另一个提供商管理的。
-
使用Request Dumper Filter 来查看Tomcat 收到了什么,它会回答LB 是否发送XFF 标头。顺便说一句,还有其他调试方法,我只是提供一个想法。
-
我们现在启用了请求转储过滤器。来自负载均衡器的请求包括以下行:header=x-forwarded-for=yyy.yyy.yyy.yyy。
-
您可以尝试将
logging.properties中的org.apache.catalina.valves.RemoteIpValve.level的日志级别提高到FINE
标签: tomcat proxy tomcat7 load-balancing x-forwarded-for