远程IP与HAProxy

我正在testing一个新的Web服务器设置,它有几个问题。 本质上,我们有一个networking服务器,其中的代码使用远程IP一些有趣的事情,还有一些Apache的目录安全到某些IP(我们的办公室等)。

不过,我们只是把这个放在了ha_proxy的后面,所以我们可以考虑添加更多的应用服务器,但是现在远程IP总是作为代理ip而不是真正的远程用户。 这意味着我们无法访问某些位置,而且我们的应用程序在用户IP很重要的地方performance得有点奇怪。

我们的configuration如下:

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 

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

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

据称,应用程序必须将X-Forwarded-For HTTP标题视为了解客户端IP地址。 似乎是唯一的办法去你的情况。

更新了HAProxy 1.4

Haproxy 1.4引入了“选项http-server-close”的新模式。 它仍然closures了与服务器的连接,但是如果可能的话还是保持对客户端的保持连接。 在大多数设置中,您可能需要使用它,因为它有助于延长连接的单个高延迟部分(Haproxy和客户端之间)。

  option http-server-close option forwardfor 

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

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

一些注意事项:

最新的Linux内核(2.6.28-11-server)包含对TProxy的支持,所以重新编译内核是没有必要的。

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

使用rpaf apache模块http://stderr.net/apache/rpaf/我知道这是旧的post,但花了我几天才发现这一点。 这将呈现给任何应用程序的X转发为IP。

请注意,你可以重写应用程序看到的是我更改Apache头文件的情况:

 SetEnvIf X-Forwarded-For (.*) REMOTE_ADDR=$1 SetEnvIf X-Forwarded-For (.*) REMOTE_IP=$1 

但是,这不适用于通过“允许”等方式访问Apache。

根据devise,HAProxy不能将原始IP地址转发到真正的服务器,就像任何其他代理一样。

一个解决scheme可能是,如果你唯一的问题是与Web服务器,要查找X转发的HTTP头,其中应包含客户端的地址。 现在,这是非常多的应用程序/语言特定,但看看这个例子在PHP中:

$headers = apache_request_headers();

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

如果您还想logging原始地址,则可以在httpd.conf中修改LogFormat,如下所示:

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

那么,X-Forwarded-for似乎不适合你的设置。 那么,有什么特别的理由让你坚持haproxy? 看来,IPVS更适合您的需求(我实际上使用ldirector反过来使用ipvs)。

看一眼:

http://kb.linuxvirtualserver.org/wiki/IPVS

http://www.vergenet.net/linux/ldirectord/

在“IP隧道”或“直接路由”模式下使用IPVS会保留客户端的地址。

尝试从http://www.openinfo.co.uk/apache/ mod_extract_forwarded

 LoadModule extract_forwarded_module modules/mod_extract_forwarded.so MEFOrder refuse,accept MEFRefuse all MEFAccept xxx.xxx.xxx.xxx 

在tcp和nginx模式下使用haproxy的简单方法:

添加send-proxy作为服务器选项:

haproxy.conf:

听ssl 0.0.0.0:443

模式tcp

平衡最less

选项httpchk GET / ping

选项日志健康检查

服务器w1 192.168.1.1:443发送代理检查检查sslvalidation没有

服务器w2 192.168.1.1:443发送代理检查检查sslvalidation没有

Nginx需要支持代理协议

nginx.conf:

听192.168.1.1:443 ssl proxy_protocol;

set_real_ip_from 192.168.1.0/24;

real_ip_header proxy_protocol;