使用 HAProxy 的远程 IP

使用 HAProxy 的远程 IP

我正在测试一个新的 Web 服务器设置,它有几个问题。本质上,我们有一个 Web 服务器,其中的代码使用远程 IP 来做一些有趣的事情,并且一些 Apache 目录被保护到某些特定的 IP(我们的办公室等)。

然而,我们刚刚将其放在 ha_proxy 后面,以便我们可以考虑添加更多应用服务器,但现在远程 IP 始终作为代理 IP 通过,而不是真正的远程用户。这意味着我们无法访问某些位置,并且我们的应用在用户 IP 很重要的地方表现有点奇怪。

我们的配置如下:

global
      maxconn 4096
      pidfile /var/run/haproxy.pid
      daemon

defaults
      mode http
      retries 3
      option redispatch
      maxconn 2000
      contimeout 5000
      clitimeout 50000
      srvtimeout 50000

listen farm xxx.xxx.xxx.xxx:80
      mode http
      cookie GALAXY insert
      balance roundrobin
      option httpclose
      option forwardfor
      stats enable
      stats auth username:userpass

      server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check

答案1

引自 HAProxy 文档haproxy.1wt.eu

- 如果应用程序需要记录原始客户端的 IP,请使用
  “forwardfor”选项将添加一个“X-Forwarded-For”标头,其中包含
  原始客户端的 IP 地址。您还必须使用“httpclose”来确保
  你将重写每一个请求,而不仅仅是每个请求的第一个请求
  会议:
        选项 httpclose
        期权远期

据称,应用程序必须处理 X-Forwarded-For HTTP 标头才能知道客户端 IP 地址。看来这是你的情况的唯一方法。

已针对 HAProxy 1.4 进行更新

Haproxy 1.4 引入了一种带有“选项 http-server-close”的新模式。它仍然关闭与服务器的连接,但如果可能并使用,则保持对客户端的保持活动状态。在大多数设置中,您可能希望使用它,因为它有助于降低连接的单个高延迟部分(Haproxy 和客户端之间)的延迟。

   option http-server-close
   option forwardfor

答案2

有一种方法可以重新编译 HAproxy 以包含 Tproxy,这将允许转发源地址。

这里有一篇关于此的博客文章: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

几点说明:

最新的 Linux 内核(2.6.28-11-server)包含对 TProxy 的支持,因此无需重新编译内核。

确保使用指向 HAProxy 服务器的默认网关地址配置 Web 场中的服务器。

答案3

使用 rpaf apache 模块http://stderr.net/apache/rpaf/ 我知道这是一篇旧帖子,但我花了好几天才找到它。这将向任何应用程序显示 x-forwarded-for ip。

答案4

从设计上来说,HAProxy 不能将原始 IP 地址转发到真实服务器,就像任何其他代理一样。

如果您唯一的问题出在 Web 服务器上,那么一种解决方案可能是查看 X-forwarded-for HTTP 标头,该标头应包含客户端的地址。现在,这几乎是特定于应用程序/语言的,但请看一下 php 中的这个示例:

$headers = apache_request_headers();

$real_client_ip = $headers["X-Forwarded-For"];

如果您还想记录原始地址,您可以修改 httpd.conf 中的 LogFormat,使其看起来像这样:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common

相关内容