【问题标题】:Get user machine's IP address when a website is configured with Apache Varnish in front of Tomcat当网站在 Tomcat 前使用 Apache Varnish 配置时获取用户机器的 IP 地址
【发布时间】:2012-09-06 02:30:46
【问题描述】:

目前,我正在运行一个在 Tomcat 上运行的网站,该网站在前面有 Apache,并使用清漆进行缓存。 Tomcat 在端口8080 上运行,端口81 用作清漆后端。我需要实现一个功能,我需要知道访问该网站的客户端机器的 IP 地址。我尝试通过标头X-FORWARDED-FOR访问IP地址。

当从端口 81(即http://mywebsite.com:81/)访问该网站时,我可以获得客户端机器的 IP 地址,但不幸的是,当通过默认端口 80(即http://mywebsite.com/)访问时,它会返回本地主机 IP 地址(127.0. 0.1)。谁能建议如何从端口 80 获取用户的真实 IP 地址?

【问题讨论】:

  • 您是否配置了 apache 以包含 x-forwarded-for 标头?
  • 你的意思是从 apache2.conf 或从 varnish vcl 文件配置?我没有做这些。
  • 两者。您可能还需要配置 tomcat。举个简单的例子:我倾向于在端口 80 上安装 nginx,它可以代理回同一台机器上或网络内的混合 Web 应用程序服务器(可能类似于:apache、uwsgi/python、php-fcgi , ETC )。我必须在“公共”IP 上配置 nginx 以去除任何欺骗性标头并传回 x-real-ip。然后其他服务器具有将 x-real-ip/x-forwarded-for 移动到 remote_addr 的配置/中间件。
  • 但在我的情况下,nginx 没有在 apache/varnish 前面运行。在我的情况下,varnish 在端口 80 上,apache 在端口 80 上,然后 tomcat 在端口 8080 上
  • 我检查了 apache 日志,发现端口 80 的引用地址显示为 127.0.0.1,这意味着当 varnish 向 apache 提交请求时,客户端 ip 被视为 localhost ip .那么,是否有任何解决方法可以让varnish将引用者提交为主机的真实ip而不是localhost ip?

标签: apache jakarta-ee tomcat6 varnish


【解决方案1】:

如果我理解正确,您的设置如下:

清漆(80 端口)-> Apache(81 端口)-> Tomcat(8080 端口)

您希望实际的远程 IP 在 Tomcat 服务器上显示为 REMOTE_ADDR

Varnish 默认附加X-Forwarded-For 标头,因此已经排序。要让 Apache 将实际的远程 IP 传递给 Tomcat,您应该安装 reverse proxy add forward module for Apache (mod_rpaf)。 mod_rpaf 完全符合您的要求。 Apache 的适当配置是:

<IfModule !rpaf_module>
    LoadModule rpaf_module modules/mod_rpaf-2.0.so
</IfModule>

<IfModule rpaf_module>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1
    RPAFheader X-Forwarded-For
</IfModule>

启用模块后,Tomcat 应该会看到正确的 REMOTE_ADDR 标头以及 HTTP_X_FORWARDED_FOR 标头。

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 2011-05-10
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多