使用 HAProxy 的远程 IP

Nei*_*ton 20 haproxy

我正在测试一个新的网络服务器设置,它有几个问题。本质上,我们有一个网络服务器,其中代码使用远程 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
Run Code Online (Sandbox Code Playgroud)

Max*_*ell 33

引用自haproxy.1wt.eu的 HAProxy 文档。

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

据说应用程序必须处理 X-Forwarded-For HTTP Header 才能知道客户端 IP 地址。似乎是您的情况的唯一方法。

为 HAProxy 1.4 更新

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

   option http-server-close
   option forwardfor
Run Code Online (Sandbox Code Playgroud)

  • 更好地使用`option forwardfor header X-Real-IP` 和`reqidel ^X-Real-IP:`,这会阻止在你的日志中伪造IP。仅供参考:`X-Real-IP` 是`NginX`' 选项`set_real_ip_from` 的默认标头。 (2认同)

Geo*_*gas 6

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

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

一些注意事项:

最新的 linux 内核 (2.6.28-11-server) 包括对 TProxy 的支持,因此不需要重新编译内核。

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