haproxy-以 tcp 模式传递原始/远程 ip

haproxy-以 tcp 模式传递原始/远程 ip

我已经使用 keepalived 设置了 haproxy 来实现 percona 集群的负载平衡和 ip 故障转移,由于它运行良好,所以我想对另一个服务/守护进程使用相同的 lb / 故障转移。

我已经这样配置了 haproxy:

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 模式下我该怎么做?由于我需要负载平衡的服务的性质,这一点至关重要。

谢谢!Vito

答案1

显然,haproxy 有某种“透明”模式,我从未看过,也不想与之有任何关系,你可以尝试一下。否则,你需要告诉后端服务有关 haproxy 发送原始 IP 的特殊方式(“PROXY blahblah”),并让服务从中拉出原始 IP。

但是,你为什么还要费心使用 haproxy?你已经安装了 keepalived,而且它也能进行适当的透明负载平衡。

答案2

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

我认为,原始问题的正确答案是:您可以在启用 TPROXY 的 Linux 内核上在 HAProxy 中编译透明代理支持。这与同一台机器上正确的 TPROXY 支持版本 + iptables 配置相结合,可实现实际的完全透明 tcp 代理支持。这意味着后端服务器不需要任何特殊配置。

请注意,这实际上不是 HAProxy 的推荐设置,仅在绝对需要时才应使用。

答案3

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

HAProxy 第 4 层负载均衡 NAT 模式


另一方面,HAPorxy 透明模式在第 7 层使用 HTTP 模式,这不符合您的观点,因为forwardforHTTP 模式中已经有选项。

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

答案4

这个配置对我有用。可以在 $_SERVER['HTTP_X_FORWARDED_FOR'] 中检索源 IP:

全球的
        [.....通常的东西....]   
        ssl 服务器验证 none

前端主要 *:5000
        绑定 *:443 ssl crt /etc/ssl/mycert_with_private_key.pem
        模式 http
        期权远期
        要求添加 X-Forwarded-Proto:\ https
        默认后端 https_server

后端 https_server
        模式 http
        平衡最小连接数
        选项 tcpka
        stick-table 类型 ip 大小 200k 有效期 30m
        服务器 srv04 192.168.1.10:443 ssl 检查
        服务器 srv05 192.168.1.11:443 ssl 检查

相关内容