docker内的MQTTS客户端如何透传IP

docker内部署了haproxy 监听一个mqtts端口,比如8889,将mqtts代理转发至emqx服务的端口,比如1883,然后emqx也是部署在docker内
此时,emqx的dashboard获取到的IP会是docker的nat模式的IP比如172.17.0.1,请问如何使emqx获取到连接mqtts客户端的原IP地址,或者说有没有办法让一个springboot程序获取到

监听器配置为启用 proxy_protocol

启用该配置之后,所有MQTT都无法连接(服务端自己连MQTT,客户端连的MQTTS),请问是哪里还没配置好吗

listeners.tcp.default {
bind = “0.0.0.0:1883”
max_connections = 1024000

proxy_protocol = true
}

LB 是否开启 send-proxy ?

haproxy的mqtts配置:
backend sn_mqtt_backend
mode tcp
balance roundrobin
timeout server 100s
timeout connect 100s
server emqx1 ip:port send-proxy-v2 maxconn 50000

emqx.conf添加:
listeners.tcp.default {
bind = “0.0.0.0:1883”
max_connections = 1024000

proxy_protocol = true
}

这样是不行,请问还有哪里没配置吗

云服务器本身的EMQX服务连的MQTT(自己连自己),其他客户端使用MQTTS,能否一份配置文件同时兼容MQTT以及带透传IP的MQTTS连接

“自己连自己”,就是不会通过 LB 连接对么?
要同时使用,可以新建一个监听器,绑定到其他端口并关闭 proxy_protocol 选项。

现在如果docker内部署的emqx的conf配置了proxy_protocol = true,LB的也没连上(用mqttx连接之后一直显示重连但连不上),自己连自己的也没连上(因为是mqtt没有ssl)

  • 基于默认配置的监听器,多建一个 tcp 监听器
    • 此时应该有两个 tcp 监听器,一个是默认的 default, 一个是你新建的。把其中一个开启 proxy_protocol 选项。让经由 LB 的客户端连接到这个开启了 pp 的监听器
  • HA 配置,如果我没理解错你是希望 mqtts 的加密连接通过 LB 连接到 EMQX 的 tcp 监听器?
    • 这样的话需要在 HA 配置证书卸载并开启 send-proxy

总结下,EMQX 自己连自己是通过没有开启 proxy_protocol 的 tcp 监听器。
外部 mqtts 客户端,在 HA 卸载证书并添加 proxy_protocol 头,连接到 EMQX 开启了 proxy_protocol 选项的监听器。

可以参考下这篇 blog