emqx / MQTTX

A Powerful and All-in-One MQTT 5.0 client toolbox for Desktop, CLI and WebSocket.
https://mqttx.app
Apache License 2.0
3.95k stars 450 forks source link

[Bug] Can't Connect to mqtt broker with IPv6 LLA #1536

Open shoe-perinet-io opened 11 months ago

shoe-perinet-io commented 11 months ago

What did I do

Try to connect the MQTTX client to a local MQTT broker. The MQTT broker is resolved via mDNS. It is resolved to an IPv6 LLA, link local address. server name: mqtt-perimica-hw3kg.local server IP address: fe80::a:ed8a:9f66:8007

What happened

After resolving via mDNS to a IPv6 LLA, The MQTTX client is unable to connect. It reports retrying. The resolved monitor shows repeatedly occurring name resolution requests.

Expected

Connect to the MQTT-Broker.

Environment

More detail

→ Q: mqtt-perimica-hw3kg.local IN A → Q: mqtt-perimica-hw3kg.local IN AAAA ← S: success ← A: mqtt-perimica-hw3kg.local IN AAAA fe80::a:ed8a:9f66:8007

ysfscream commented 11 months ago

Hi, @shoe-perinet-io

I'm sorry for not getting back to you sooner.

MQTTX should indeed support connections via IPv6. Could you connect directly using the IPv6 address to troubleshoot your issue further? This might help determine whether the problem lies with the mDNS resolution process or the MQTTX client's handling of IPv6 addresses. Your feedback on this will be critical in identifying and resolving the issue. Thank you for bringing this to our attention.

shoe-perinet-io commented 11 months ago

Hi @ysfscream , thanks for accepting this issue. Please be advised an IPv6 link local address (LLA) needs to specify the scopeid when connecting to a remote [1]. Let me know, how I can collect further debug information for you, if necessary.

I assume the problem is not in the mDNS resolve process, since my system resolver logs a successful resolved name (resolvectl monitor). This tells me, (1) MQTTX is using the system resolver and (2) MQTTX fails to handle the received IPv6 LLA:

→ Q: mqtt-perimica-hw3kg.local IN A → Q: mqtt-perimica-hw3kg.local IN AAAA ← S: success ← A: mqtt-perimica-hw3kg.local IN AAAA fe80::a:ed8a:9f66:8007

I also tested the resolver:

ping -n mqtt-perimica-hw3kg.local

PING mqtt-perimica-hw3kg.local(fe80::a:ed8a:9f66:8007%vpn_softether) 56 data bytes 64 bytes from fe80::a:ed8a:9f66:8007%vpn_softether: icmp_seq=1 ttl=64 time=29.0 ms 64 bytes from fe80::a:ed8a:9f66:8007%vpn_softether: icmp_seq=2 ttl=64 time=13.9 ms ^C --- mqtt-perimica-hw3kg.local ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 13.948/21.485/29.022/7.537 ms

as well as have verified the glibc resolver is working:

getent ahosts mqtt-perimica-hw3kg.local

fe80::a:ed8a:9f66:8007%5 STREAM mqtt-perimica-hw3kg.local fe80::a:ed8a:9f66:8007%5 DGRAM
fe80::a:ed8a:9f66:8007%5 RAW

I observed, MQTTX is more chatty when it detects not a terminal at the stdout

./MQTTX-1.9.7.AppImage 2>&1 | cat

[2024-01-02T16:55:26.563] [INFO] default - APP init [2024-01-02T16:55:29.371] [INFO] default - MQTTX client with ID 92444823-f7a5-48f2-b6ce-7cbf81b6db65 assigned [2024-01-02T16:55:29.372] [INFO] default - Connect client mqtt-perimica-hw3kg.local, MQTT/SSL connection: mqtts://mqtt-perimica-hw3kg.local:8883 [2024-01-02T16:55:29.389] [INFO] default - mqtt-perimica-hw3kg.local connect close, MQTT.js onClose trigger [2024-01-02T16:55:33.396] [INFO] default - mqtt-perimica-hw3kg.local reconnect: 0 times retry [2024-01-02T16:55:33.435] [INFO] default - mqtt-perimica-hw3kg.local connect close, MQTT.js onClose trigger [2024-01-02T16:55:37.444] [INFO] default - mqtt-perimica-hw3kg.local reconnect: 1 times retry [2024-01-02T16:55:37.486] [INFO] default - mqtt-perimica-hw3kg.local connect close, MQTT.js onClose trigger

I tried to feed unsuccessfully MQTTX the plain IPv6 address, but unfortunately it treated it as a name and tried to resolve the IPv6LLA :

./MQTTX-1.9.7.AppImage 2>&1 | cat

[2024-01-02T17:10:46.127] [INFO] default - APP init [2024-01-02T17:11:01.649] [INFO] default - mqtt-perimica-hw3kg.local was edited, ID: 92444823-f7a5-48f2-b6ce-7cbf81b6db65 [2024-01-02T17:11:02.299] [INFO] default - MQTTX client with ID 92444823-f7a5-48f2-b6ce-7cbf81b6db65 assigned [2024-01-02T17:11:02.301] [INFO] default - Connect client mqtt-perimica-hw3kg.local, MQTT/SSL connection: mqtts://fe80::a:ed8a:9f66:8007%vpn_softether:8883 [2024-01-02T17:11:05.500] [WARN] default - MQTTX force close the connection mqtt-perimica-hw3kg.local (clientID mqttx_21706337), reset the reconnect times to 0 [2024-01-02T17:11:05.507] [ERROR] default - mqtt-perimica-hw3kg.local connect fail, MQTT.js onError trigger, Error: getaddrinfo ENOTFOUND fe80 at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26) [2024-01-02T17:11:05.536] [INFO] default - mqtt-perimica-hw3kg.local connect close, MQTT.js onClose trigger [2024-01-02T17:11:27.900] [INFO] default - mqtt-perimica-hw3kg.local was edited, ID: 92444823-f7a5-48f2-b6ce-7cbf81b6db65 [2024-01-02T17:11:28.468] [INFO] default - MQTTX client with ID 92444823-f7a5-48f2-b6ce-7cbf81b6db65 assigned

[2024-01-02T17:11:32.322] [WARN] default - MQTTX force close the connection mqtt-perimica-hw3kg.local (clientID mqttx_21706337), reset the reconnect times to 0 [2024-01-02T17:11:32.327] [ERROR] default - mqtt-perimica-hw3kg.local connect fail, MQTT.js onError trigger, Error: getaddrinfo ENOTFOUND :8007 at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26) [2024-01-02T17:11:32.360] [INFO] default - mqtt-perimica-hw3kg.local connect close, MQTT.js onClose trigger [2024-01-02T17:11:45.710] [INFO] default - mqtt-perimica-hw3kg.local was edited, ID: 92444823-f7a5-48f2-b6ce-7cbf81b6db65 [2024-01-02T17:11:46.307] [INFO] default - MQTTX client with ID 92444823-f7a5-48f2-b6ce-7cbf81b6db65 assigned [2024-01-02T17:11:46.308] [INFO] default - Connect client mqtt-perimica-hw3kg.local, MQTT/SSL connection: mqtts://fe80::a:ed8a:9f66:8007:8883 [2024-01-02T17:11:50.273] [WARN] default - MQTTX force close the connection mqtt-perimica-hw3kg.local (clientID mqttx_21706337), reset the reconnect times to 0 [2024-01-02T17:11:50.278] [ERROR] default - mqtt-perimica-hw3kg.local connect fail, MQTT.js onError trigger, Error: getaddrinfo ENOTFOUND fe80 at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26) [2024-01-02T17:11:50.304] [INFO] default - mqtt-perimica-hw3kg.local connect close, MQTT.js onClose trigger [2024-01-02T17:16:22.961] [INFO] default - mqtt-perimica-hw3kg.local was edited, ID: 92444823-f7a5-48f2-b6ce-7cbf81b6db65 [2024-01-02T17:16:23.543] [INFO] default - MQTTX client with ID 92444823-f7a5-48f2-b6ce-7cbf81b6db65 assigned [2024-01-02T17:16:23.544] [INFO] default - Connect client mqtt-perimica-hw3kg.local, MQTT/SSL connection: mqtts://fe80:0000:0000:0000:000a:ed8a:9f66:8007:8883 [2024-01-02T17:16:26.813] [WARN] default - MQTTX force close the connection mqtt-perimica-hw3kg.local (clientID mqttx_21706337), reset the reconnect times to 0 [2024-01-02T17:16:26.816] [ERROR] default - mqtt-perimica-hw3kg.local connect fail, MQTT.js onError trigger, Error: getaddrinfo ENOTFOUND fe80 at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26) [2024-01-02T17:16:26.843] [INFO] default - mqtt-perimica-hw3kg.local connect close, MQTT.js onClose trigger App closed

I made the extra effort and tried an IPv4 proxy, which made your not IPv6 compliant MQTTX client connect. So there is no issue with the broker, so far.:

socat -d -v TCP4-LISTEN:8883,reuseaddr,fork,bind=127.0.0.1 TCP6:[fe80::a:ed8a:9f66:8007%vpn_softether]:8883

./MQTTX-1.9.7.AppImage 2>&1 | cat

[2024-01-02T17:19:27.657] [INFO] default - APP init [2024-01-02T17:19:46.601] [INFO] default - mqtt-perimica-hw3kg.local was edited, ID: 92444823-f7a5-48f2-b6ce-7cbf81b6db65 [2024-01-02T17:19:47.224] [INFO] default - MQTTX client with ID 92444823-f7a5-48f2-b6ce-7cbf81b6db65 assigned [2024-01-02T17:19:47.226] [INFO] default - Connect client mqtt-perimica-hw3kg.local, MQTT/SSL connection: mqtts://::1:8883 [2024-01-02T17:19:50.532] [WARN] default - MQTTX force close the connection mqtt-perimica-hw3kg.local (clientID mqttx_21706337), reset the reconnect times to 0 [2024-01-02T17:19:50.539] [ERROR] default - mqtt-perimica-hw3kg.local connect fail, MQTT.js onError trigger, Error: getaddrinfo ENOTFOUND :8883 at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26) [2024-01-02T17:19:50.569] [INFO] default - mqtt-perimica-hw3kg.local connect close, MQTT.js onClose trigger [2024-01-02T17:19:59.757] [INFO] default - mqtt-perimica-hw3kg.local was edited, ID: 92444823-f7a5-48f2-b6ce-7cbf81b6db65 [2024-01-02T17:20:00.319] [INFO] default - MQTTX client with ID 92444823-f7a5-48f2-b6ce-7cbf81b6db65 assigned [2024-01-02T17:20:00.320] [INFO] default - Connect client mqtt-perimica-hw3kg.local, MQTT/SSL connection: mqtts://127.0.0.1:8883 [2024-01-02T17:20:00.338] [WARN] default - MQTTX force close the connection mqtt-perimica-hw3kg.local (clientID mqttx_21706337), reset the reconnect times to 0 [2024-01-02T17:20:00.340] [ERROR] default - mqtt-perimica-hw3kg.local connect fail, MQTT.js onError trigger, Error: connect ECONNREFUSED 127.0.0.1:8883 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1146:16) [2024-01-02T17:20:00.349] [INFO] default - mqtt-perimica-hw3kg.local connect close, MQTT.js onClose trigger Opening in existing browser session. [2024-01-02T17:22:32.592] [INFO] default - MQTTX client with ID 92444823-f7a5-48f2-b6ce-7cbf81b6db65 assigned [2024-01-02T17:22:32.592] [INFO] default - Connect client mqtt-perimica-hw3kg.local, MQTT/SSL connection: mqtts://127.0.0.1:8883 [2024-01-02T17:22:33.143] [INFO] default - mqtt-perimica-hw3kg.local connect success, MQTT.js onConnect trigger [2024-01-02T17:22:48.449] [INFO] default - mqtt-perimica-hw3kg.local connect close, MQTT.js onClose trigger [2024-01-02T17:22:48.452] [INFO] default - MQTTX client disconnect, Name: mqtt-perimica-hw3kg.local, client ID: mqttx_21706337

[1] https://labs.ripe.net/author/philip_homburg/whats-the-deal-with-ipv6-link-local-addresses/

ysfscream commented 11 months ago

Thank you for your detailed information and efforts in diagnosing the issue. The getaddrinfo ENOTFOUND error usually indicates a problem with the DNS resolution process, where the domain name cannot be resolved into an IP address. This can be due to various reasons, such as incorrect domain names, DNS configuration issues, or network connectivity problems.

We will take a closer look into this issue. Your input has been very helpful in pinpointing the potential areas of concern. We appreciate your patience and help in resolving this situation.

shoe-perinet-io commented 11 months ago

Yes, it does indeed. But please be advised, it only occurred when I was using the IPv6LLA as server destination in the configuration of the MQTT-Broker connection. It did not occurr when I used the fqdn 'mqtt-perimica-hw3kg.local'.

Also, the name of the configuration was, unfortunately, called 'mqtt-perimica-hw3kg.local'. I guess this is misleading. But the actual target can be found with the MQTT/SSL connection: prefix.

I strongly think your Client handles the information from the resolver wrongly. It seems not to use the proper API to cover also IPv6 LLA addresses resolved by the system-resolver.

Be advised, the same behaviour can also be observed with Chromium or NodeJS.