我们正在尝试识别 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" />