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 } 

最简洁的答案是不。

长的答案,您的Java应用程序只看到本地主机的xinetd服务器。

这不能由xinetd单独完成。 使用代理服务器来获取标题等全部function

显然是同样的问题: tomcat6后面的xinetd – 真正的客户端IP

您的服务器堆栈可能是越野车或过时的。 在我的服务器上(3.19.0-41-generic 14.04.2-Ubuntu,xinetd 2.3.15 libwrap loadavg)xinetd 确实转发了所需的头文件没有问题。 我会build议升级服务器堆栈。 你可以得到xinetd版本

 xinetd -version 

另外检查你是否正确configuration了Tomcat上的RemoveIpValve 。 对于像你这样的configuration,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" />