HttpServletRequest.getRemoteAddr() 始终返回 127.0.0.1

HttpServletRequest.getRemoteAddr() 始终返回 127.0.0.1

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

在我们运行 Tomcat 的本地开发机器上,这可以正常工作。在我们的 CI 环境(Mac 上的 Tomcat)中,这也可以正常工作。

问题是,在我们的临时和生产环境中,这不起作用。我们总是从 httpServletRequest.getRemoteAddr() 看到 127.0.0.1。我们的临时和生产环境都是运行 CentOS 的 VMware VM。它们在 ESXI 内/上运行,并位于 Cisco 5500 ASA 后面。

我们已经看到其他与此问题类似的帖子,它们说要查找“X-Forwarded-For”标头,如果存在则打印该标头。但事实并非如此。以下是通过请求收到的标头的完整列表。

我们对 ASA 或 VMware 的设置方式了解不多,因此如果有什么原因导致此问题,请提供详细的答案,说明应向我们的 IT 团队咨询什么问题以修复此问题。我们认为这可能与 VMware 有关,因为我们看到的是 127.0.0.1。如果是 ASA,我们会假设我们会看到 ASA 的 IP,但我愿意接受别人告诉我我错了。

请求的完整标头:

user-agent:Mozilla/5.0+(compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)
accept:text/html,application/xhtml+xml,application/xml
q=0.9,*/*
q=0.8
accept-language:en-US,en
q=0.8
accept-charset:ISO-8859-1,UTF-8
q=0.7,*
q=0.7
host:host-omitted-for-stackoverflow.com
connection:keep-alive

更新-我们刚刚意识到我们涉及本地端口重定向:

唯一可能相关的是我们正在使用HTTP xinetd 端口重定向将 SSL 流量转发到内部端口:

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

可能是网络配置文件设置不正确。有关它们的更多详细信息请参见此处:http://docs.oracle.com/cd/E37670_01/E41138/html/ch11s02.html

答案2

事实证明,这是我们配置中的 xinetd 部分造成的。我要关闭这个问题,然后问另一个专门询问这个问题的问题。

相关内容