EMQ 问答社区

HAProxy + emqx 三节点 ,无法获取客户端真实IP

问题描述

三个节点的EMQX,EMQX服务器上面有2台HAProxy 负载均衡服务器,现在获取到的客户端IP都是我负载均衡服务器的IP,请问如何获取客户端真实IP。

环境信息

  • EMQ X 版本:开源版4.28
  • 操作系统及版本:centos

相关截图


192.168.10.11,192.168.10.12均为我们负载均衡服务器的IP

1赞

给你点赞 @jokin 这是一个非常典型的场景。4层代理客户端实际的 IP 端口是需要 LB (HAproxy) 发过来的。要配置2个地方:

  1. 打开 emqx.conf 对应监听器的 proxoy_protocol:

    listener.tcp.external.proxy_protocol = on
    
  2. 配置 HAProxy,让它把客户端的 IP/Port 发到 emqx。例如,在 haproxy.cfg 的 backend 的 每个server 后面加上 send-proxy-v2

    # 参考: http://cbonte.github.io/haproxy-dconv/1.7/configuration.html#5.2-send-proxy-v2-ssl
    
    backend emqx_tcp_backend
        mode tcp
        server node1 192.168.1.100:1883 send-proxy-v2
    
2赞

搞定了。谢谢。

1赞

打开了这个配置,为什么不能直连EMQTT了?
只有我haproxoy那台服务器可以连接。我直接连接MQTT服务器的IP有报错日志
2021-04-01 10:39:24.814 [error] supervisor: ‘esockd_connection_sup - <0.1804.0>’
errorContext: connection_shutdown
reason: {invalid_proxy_info,<<16,30,0,4,77,81,84,84,4,192,0,10>>}
offender: [{pid,<0.2035.0>},
{name,connection},
{mfargs,
{emqx_connection,start_link,
[[{deflate_options,[]},
{max_conn_rate,10000},
{active_n,100},
{zone,external}]]}}]

我另外个帖子有详细的描述。

打开了就必然没法直连了哈…它要先等 Proxy Protocl Info.
你直连的没有传这个

好的 明白了。