1

我正在使用 Linode NodeBalancers 为我的 2 个 tomcat 服务器负载均衡器(服务 https 请求),我们的业务需求之一是能够捕获 ClientIP 以进行指纹识别+其他目的。

但是,我似乎无法让 NodeBalancers 通过 x-forwarded-for 传递客户端 IP,Linode 支持也不知道如何在 Tomcat 配置上这样做?

这是我的 Tomcat 配置 (server.xml) 的一部分

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           keystoreFile="myKeyStore" 
           keystorePass="myKeyStorePassword"
           compression="on"
           compressableMimeType="text/html,text/xml,text/css,text/javascript"
           compressionMinSize="1024"
             maxPostSize="5097152"
           clientAuth="false" sslProtocol="TLS" />
  <Valve className="org.apache.catalina.valves.RemoteIpValve"
       remoteIpHeader="x-forwarded-for"
       protocolHeader="x-forwarded-proto"
       protocolHeaderHttpsValue="https"
  />
4

1 回答 1

1

看起来您的标头配置很好,但是需要注意三件事:

  • trustedProxies 属性需要信任负载均衡器。默认情况下,这包括除 172.16/12 范围内的所有私有地址
  • 如果您使用的是 Tomcat 访问日志阀门,请确保您在阀门上使用 requestAttributesEnabled。日志记录是异步的,当控制权返回给它时 RemoteIpValve 将重置原始值,但是请求属性不会改变
  • 如果您正在卸载 HTTPS,请注意从 foo 到 foo/ 的重定向发生在连接器中,然后阀门才能执行其操作。您可能会发现您还需要在连接器上设置方案和代理端口,否则您可能会在 302 中获得不稳定的位置

Valve 文档非常好,但最近这三个文档都让我感到意外(此处的文档http://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html)。

于 2014-03-27T23:45:07.323 回答