我正在测试一个新的 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 引入了一种带有“选项 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