apache ProxyPass:如何保留原始IP地址

Posted

技术标签:

【中文标题】apache ProxyPass:如何保留原始IP地址【英文标题】:apache ProxyPass: how to preserve original IP address 【发布时间】:2010-10-20 02:30:51 【问题描述】:

我们正在使用 ProxyPass 将所有“/r”请求重定向到端口 18080 上的 jboss,如下所示:

ProxyPreserveHost on
ProxyPass /r http://localhost:18080/redirectService/
ProxyPassReverse /r http://localhost:18080/redirectService/

但是,这会导致 jboss 的访问日志中记录的 IP 地址为“127.0.0.1”。有人知道我们如何保留请求来自 HttpServletRequest 的原始 IP 吗?我们想通过 doGet() 中的 jboss servlet 请求访问它

【问题讨论】:

【参考方案1】:

您可以从X-Forwarded-For 标头字段中获取原始主机。

【讨论】:

【参考方案2】:

JasonW 的回答很好。但是由于 apache httpd 2.4.6 有一个替代方案:mod_remoteip

你必须做的就是:

    可能你必须安装 mod_remoteip 包

    启用模块:

    LoadModule remoteip_module modules/mod_remoteip.so
    

    将以下内容添加到您的 apache httpd 配置中。请注意,您必须将此行 not 添加到代理服务器的配置中。您必须将此添加到代理目标 httpd 服务器的配置中(代理后面的服务器):

    RemoteIPHeader X-Forwarded-For
    # replace IP with the remote server you trust
    RemoteIPInternalProxy 10.123.123.1/24
    

有关更多信息和更多选项,请访问http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html

安全警告!仅对您信任的代理执行此操作。否则有人可以伪造他们的 IP。

【讨论】:

你在这里描述的设置是什么?是另一个 apache 后面的 apache 吗?这适用于 apache 后面的 jboss 吗? 是的。将 mod_remoteip 包添加到代理服务器后面的 apache 中。 mod_remoteip 将代理服务器的 IP 地址替换为 X-Forward-For 的值,其中包含 Web 客户端的原始 IP 地址。 请记住始终将其与RemoteIPInternalProxy 或类似的安全功能一起使用。创建假 IP 通常相当困难。创建假 XFF 标头并不难。 请注意,您还必须更改代理目标httpd服务器中的日志格式,请参阅serverfault.com/questions/846695/…【参考方案3】:

这有更优雅的解释和不止一种可能的解决方案。 http://kasunh.wordpress.com/2011/10/11/preserving-remote-iphost-while-proxying/

这篇文章描述了如何在涉及代理的设置中使用一个流行的和一个鲜为人知的 Apache 模块来保留主机/IP。

使用 mod_rpaf 模块,在后端服务器中安装并启用它,并在模块的配置中添加以下指令。 RPAFenable 开启 RPAFsethostname 开启 RPAFproxy_ips 127.0.0.1

(2017 年编辑)mod_rpaf 的当前位置:https://github.com/gnif/mod_rpaf

【讨论】:

如果您真正总结链接的内容和/或引用最相关的部分会更好。否则它看起来就像你在发送垃圾邮件。 RPAF 还可以诱使网站认为它是通过 HTTPS 访问的,用于 ssl 终止代理。【参考方案4】:

如果您有能力这样做,我建议使用mod-jk 或mod-proxy-ajp 将请求从Apache 传递到JBoss。与使用 HTTP 代理请求相比,AJP 协议效率更高,而且作为一个好处,JBoss 会将请求视为来自原始客户端而不是 Apache。

【讨论】:

【参考方案5】:

如果您使用 Apache 反向代理为在 localhost 端口上运行的应用程序提供服务,则必须将位置添加到您的虚拟主机。

<Location />            
   ProxyPass http://localhost:1339/ retry=0
   ProxyPassReverse http://localhost:1339/
   ProxyPreserveHost On
   ProxyErrorOverride Off
</Location>

获取IP地址有以下选项

console.log(">>>", req.ip);// this works fine for me returned a valid ip address 
console.log(">>>", req.headers['x-forwarded-for'] );// returned a valid IP address 
console.log(">>>", req.headers['X-Real-IP'] ); // did not work returned undefined 
console.log(">>>", req.connection.remoteAddress );// returned the loopback IP address 

所以要么使用 req.ip 要么 req.headers['x-forwarded-for']

【讨论】:

“位置”标签有什么作用? "ProxyPreserveHost On" 为我成功了。我不知道您可以在位置标签中放入基于位置的反向代理。谢谢。

以上是关于apache ProxyPass:如何保留原始IP地址的主要内容,如果未能解决你的问题,请参考以下文章

Apache 代理设置背后的 Icecast - 如何保留原始侦听器 IP

使用Weblogic的Apache 2.2 ProxyPass - 不能使用root

Nginx proxy pass简单用法、负载均衡

如何在 Apache 中将部分 URL 传递给 ProxyPass

Apache ProxyPass 负载平衡所有 URL

使用 proxyPass 和 proxyPassReverse 的 Apache 重写