Apache代理隐藏HttpServletRequest对象的远程IP地址

时间:2016-11-02 17:51:48

标签: java apache proxy ip

我正在用Java编写一个应用程序,该应用程序使用来自底层数据库的数据来提供网页。我基于一些IP限制限制访问网页。基本上,任何属于“已接受”范围的IP都将被允许访问该网页,并且此范围之外的任何IP都将被重定向到错误页面。要获取尝试访问该页面的用户的IP地址,我使用以下内容:

String userIPAddress = request.getRemoteAddr();

'request'是我的HttpServletRequest对象。

我遇到的问题是这个网页是通过Apache Web服务器代理的。

发生这种情况时,它会丢失客户端IP地址并采用我们防火墙的IP地址。因此,当我访问request.getRemoteAddr()时,无论客户是从哪里尝试访问该网页,它都将返回相同的IP。

当通过直接IP地址在内部访问网页时,我的IP检查工作正常。当您通过代理访问时,问题就出现了。

我是否可以通过编程方式访问客户端的实际IP地址?或者这是必须通过Apache Web服务器完成/更改以允许此信息通过的东西?在这种情况下,如果那是一个更好的论坛,我可以发布到服务器故障。

非常感谢您的帮助。

最诚挚的问候。

3 个答案:

答案 0 :(得分:2)

当以反向代理模式运行时(例如,使用ProxyPass指令),Apache mod_proxy_http添加了几个请求标头,以便将信息传递给源服务器,其中一个是{{1} }将包含客户端的IP地址。

请记住,如果原始请求已包含此标头(这根本不常见),Apache会将客户端IP地址附加到existig值,因此您将获得逗号+空格分隔的IP地址列表。最后(最右边)的IP地址始终是连接到最后一个代理(您的Apache)的IP地址,这意味着您要对其进行测试。

答案 1 :(得分:0)

我认为不可能以编程方式执行此操作。我不认为甚至可以在Apache Web服务器中进行更改。

听起来好像你的防火墙伪装了传入的IP地址。我认为解决方案在于防火墙的配置。

答案 2 :(得分:0)

您可以在Apache代理中使用AJP协议而不是HTTP。

显然,这会保留客户端的IP地址。有没有人有任何想法?

使用:

ProxyPass /APPLICATION_NAME ajp://IP_ADDRESS:8009/APPLICATION_NAME

而不是:

<Location "/APPLICATION_NAME">
    ProxyPass  http://IP_ADDRESS:8080/APPLICATION_NAME
    ProxyPassReverse http://IP_ADDRESS:8080/APPLICATION_NAME
</Location>

在.conf代理文件中。

这使我能够从客户端获取IP而不会在代理期间被覆盖。我也没有更改任何代码。在Apache代理文件中更改为AJP后,以下内容包含正确的IP地址:

String userIPAddress = request.getRemoteAddr();