xinetd 端口转发导致 HttpServletRequest.getRemoteAddr() 始终返回 127.0.0.1

xinetd 端口转发导致 HttpServletRequest.getRemoteAddr() 始终返回 127.0.0.1

我们正在尝试识别 Java 应用程序内部特定请求的来源。我们已将日志文件更改为包含 IP 地址,并正在使用它httpServletRequest.getRemoteAddr()来获取该远程地址。

当使用 xinetd 将端口 443 上的外部请求转发到我们的应用服务器正在监听的内部端口(例如 8999)时,getRemoteAddr()始终返回 127.0.0.1。如果我们从堆栈中删除 xinetd,我们就会得到正确的地址。

请注意,X-Forwarded-For标题也没有被填充。

有什么方法可以继续使用 xinetd 进行端口转发,而无需删除请求者的 IP 地址?

我们的设置:

service https
{
    disable = no
    flags = REUSE
    socket_type = stream
    wait = no
    user = root
    port = 443
    protocol = tcp
    redirect = localhost 8999
    log_on_failure += USERID
}

答案1

最简洁的答案是不。

长答案是,您的 java 应用程序只能看到来自本地主机的 xinetd 服务器。

xinetd 无法单独完成此操作。使用代理服务器可获得 headers 等的全部功能。

显然是同样的问题:tomcat6 位于 xinetd 后面-真实客户端 IP

答案2

您的服务器堆栈可能有错误或已过时。在我的服务器上(3.19.0-41-generic 14.04.2-Ubuntu,xinetd 2.3.15 libwrap loadavg)xinetd转发所需的标头没有问题。我建议升级服务器堆栈。您可以使用以下方式获取 xinetd 版本

xinetd -version

还要检查您是否已配置移除IpValve在 Tomcat 上正确运行。对于像你这样的配置,conf/server.xml 应该包含类似

<Engine name="Catalina" defaultHost="localhost">
  <Valve className="org.apache.catalina.valves.RemoteIpValve"
    remoteIpProxiesHeader="x-forwarded-by"
    remoteIpHeader="x-forwarded-for"
    internalProxies="127\.0\.0\.1" 
    protocolHeader="x-forwarded-proto" />      

相关内容