我们试图确定哪些特定请求来自我们的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" />