带有HAProxy的远程IP


19

我正在测试一个新的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

Answers:


31

引自HAProxy文档haproxy.1wt.eu

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

声明应用程序必须处理X-Forwarded-For HTTP标头才能知道客户端IP地址。似乎是您要解决的唯一方法。

为HAProxy 1.4更新

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

   option http-server-close
   option forwardfor

2
更好地使用option forwardfor header X-Real-IPreqidel ^X-Real-IP:,这可以防止伪造日志中的IP。仅供参考:X-Real-IPNginX'option 的默认标题set_real_ip_from
蒂诺2012年

这个问题没有提到nginx。X-Real-IP无法正常工作。
里克·弗莱彻

1.是否必须在前端或后端配置部分中设置这两个选项?(因为它们似乎在这里不起作用)2.在Tomcat级别上也需要任何类型的配置吗?
yglodt



1

请注意,您似乎可以覆盖更改Apache标头后应用程序看到的内容:

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

但是,这不适用于通过“ Allow from”等进行的Apache访问。


如果客户端X-Forwarded-For在将新IP地址添加到现有列表的末尾(由逗号和空格分隔)时发送了现有标头,则可能会导致不可预测的结果。更改(.*)([^ ]*)$只抢到最后一个IP ...或使用mod_rpafmod_remoteip对Apache 2.4或更高版本。
Ladadadada 2012年

1

根据设计,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


错误的,您可以选择“ forwardfor”
wittwerch

是的,此选项默认情况下处于启用状态,但是它的作用是设置X-Forwarded-For HTTP标头。我说的是,问问我问的是发问者真正要问的是IP数据包的实际源地址
Thiagodrv 2009年


0

尝试从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

-1

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

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

haproxy.conf:

听ssl 0.0.0.0:443

模式tcp

平衡最小二乘

选项httpchk GET / ping

选项日志运行状况检查

服务器w1 192.168.1.1:443 send-proxy check check-ssl验证无

服务器W2 192.168.1.1:443 send-proxy check check-ssl验证无

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;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.