haproxy – 在tcp模式下传递原始/远程ip

我有haproxybuild立keepalived percona集群的负载平衡和IP故障转移,因为它工作得很好,我想使用相同的lb /故障转移为另一个服务/守护进程。

我这样configurationhaproxy:

listen my_service 0.0.0.0:4567 mode tcp balance leastconn option tcpka contimeout 500000 clitimeout 500000 srvtimeout 500000 server host1 xxx.xxx.xxx.xx1:4567 check port 4567 inter 5000 rise 3 fall 3 server host2 xxx.xxx.xxx.xx2:4567 check port 4567 inter 5000 rise 3 fall 3 

负载平衡工作正常,但服务看到负载平衡器的IP而不是客户端的实际IP。 在http模式下,haproxy通过远程IP很容易,但是如何在tcp模式下执行? 由于我需要负载平衡的服务的性质,这是至关重要的。

谢谢! 维托

haproxy显然是某种“透明”的模式,我从来没有看过或想要做任何事情,你可以尝试。 否则,你将需要教授后端服务是关于haproxy发送原始IP(“PROXY blahblah”)的特殊方式,并让服务将原始IP从中取出。

为什么你用haproxy困扰,虽然? 你已经有了keepalived,并且它也做了适当的透明的负载平衡。

只是为了将来的参考,keepalived是故障转移而不是负载平衡(也许你的意思是LVS?)的解决scheme。 HAProxy的透明代理模式与发送原始IP的任何特殊方式无关,这将是正常的非透明HTTP模式,您可以在其中使用标准化的HTTP标头。

在我看来,正确地回答原来的问题是:你可以编译透明的代理支持HAProxy启用TPROXY的Linux内核。 这与适当的TPROXY支持版本+ iptables在同一台机器上的configuration,使实际完全透明的tcp代理支持。 这意味着后端服务器不需要任何特殊configuration。

请注意,这实际上不是HAProxy的推荐设置,只能在绝对需要的情况下使用。

在你的configuration(per-server)中使用send-proxy ,即使在TCP模式下,也会在接收服务器端提供原始的source-ip。 这需要HAProxy 1.5+。

您可以在HAProxy文档中find有关代理协议的更多信息。

 listen my_service 0.0.0.0:4567 mode tcp balance leastconn option tcpka contimeout 500000 clitimeout 500000 srvtimeout 500000 server host1 xxx.xxx.xxx.xx1:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3 server host2 xxx.xxx.xxx.xx2:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3 

您可以将HAProxy设置为NAT模式,它仍然在第4层使用TCP模式,但使IP透明。

HAProxy第4层负载均衡NAT模式


另一方面,HAPorxy透明模式在第7层中使用HTTP模式,因为在HTTP模式中已经有了forwardfor选项,所以它并不重要。

HAProxy 7层负载平衡透明代理模式

这个configuration为我工作。 源IP可以在$ _SERVER ['HTTP_X_FORWARDED_FOR']中检索:

全球
         [.....通常的东西....]   
         ssl-server-verify none

前台主*:5000
         bind *:443 ssl crt /etc/ssl/mycert_with_private_key.pem
        模式http
        选项forwardfor
         reqadd X-Forwarded-Proto:\ https
         default_backend https_server

后端https_server
        模式http
        平衡最less
        选项tcpka
         stick-table type ip size 200k expire 30m
        服务器srv04 192.168.1.10:443 ssl检查
        服务器srv05 192.168.1.11:443 ssl检查