Une capture MQTT Wireshark vous montre exactement ce que votre client envoie au broker, champ par champ. Dans ce tutoriel, vous allez capturer votre propre trafic vers le serveur MQTT public gratuit broker.connectmq.com sur le port 1883, décoder les paquets CONNECT, SUBSCRIBE et PUBLISH, puis répéter le test sur le port TLS 8883 pour voir ce que le chiffrement masque. C'est le moyen le plus rapide de déboguer des problèmes de connexion et de vous prouver pourquoi le trafic de production doit passer par TLS.
Ne capturez le trafic que sur des réseaux et des appareils qui vous appartiennent ou que vous êtes autorisé à surveiller.
Ce dont vous avez besoin
- Wireshark 3.x ou 4.x depuis le site officiel, avec les droits de capture sur votre machine.
- Les clients en ligne de commande Mosquitto (
mosquitto_pubetmosquitto_sub). - En option, Python 3 avec paho-mqtt 2.x pour l'étape de déchiffrement TLS.
- Un préfixe de topic unique, par exemple
connectmq/demo/ws-4821/.
Le serveur public est ouvert à tous ; ne publiez donc que des données de test. L'article consacré au serveur MQTT public gratuit en liste les limites.
Étape 1 : lancer une capture avec un filtre de port
Ouvrez Wireshark, choisissez l'interface réseau que vous utilisez pour accéder à Internet et saisissez un filtre de capture pour n'enregistrer que le trafic MQTT :
tcp port 1883 or tcp port 8883
Lancez la capture. Wireshark reconnaît automatiquement MQTT sur le port 1883 et applique son dissecteur MQTT.
Étape 2 : générer du trafic MQTT en clair
Dans un premier terminal, abonnez-vous :
mosquitto_sub -h broker.connectmq.com -p 1883 -i ws-sub-4821 -V mqttv5 \
-t 'connectmq/demo/ws-4821/#' -v
Dans un second terminal, publiez un message normal et un retained message :
mosquitto_pub -h broker.connectmq.com -p 1883 -i ws-pub-4821 -V mqttv5 \
-t 'connectmq/demo/ws-4821/temp' -m '{"celsius":21.7}' -q 1
mosquitto_pub -h broker.connectmq.com -p 1883 -i ws-pub-4821 -V mqttv5 \
-t 'connectmq/demo/ws-4821/status' -m 'online' -r
Arrêtez l'abonné avec Ctrl+C, puis arrêtez la capture.
Étape 3 : appliquer des filtres d'affichage MQTT
Saisissez un filtre d'affichage dans la barre en haut. Voici les plus utiles :
| Filtre d'affichage | Affiche |
|---|---|
mqtt |
Tous les paquets MQTT décodés |
mqtt.msgtype == 1 |
CONNECT |
mqtt.msgtype == 2 |
CONNACK |
mqtt.msgtype == 3 |
PUBLISH |
mqtt.msgtype == 8 |
SUBSCRIBE |
mqtt.msgtype == 12 or mqtt.msgtype == 13 |
PINGREQ et PINGRESP |
mqtt.msgtype == 14 |
DISCONNECT |
mqtt.topic contains "ws-4821" |
Les paquets de votre préfixe de topic |
mqtt.clientid == "ws-pub-4821" |
Le CONNECT d'un client précis |
tls |
Le trafic chiffré, généralement sur le 8883 |
Les noms de champs peuvent légèrement varier d'une version de Wireshark à l'autre. Si un filtre est refusé, développez un paquet, faites un clic droit sur un champ et choisissez « Apply as Filter » pour obtenir le nom exact.
Étape 4 : lire les paquets décodés
CONNECT
Sélectionnez un paquet CONNECT et développez « MQ Telemetry Transport Protocol ». Vous verrez :
- Le nom et la version du protocole (MQTT, version 5, ou 4 pour 3.1.1).
- Les connect flags : clean start, will flag, indicateurs de nom d'utilisateur et de mot de passe.
- Le keep alive en secondes.
- Les propriétés (MQTT 5), comme le session expiry interval.
- Le client ID, ici
ws-pub-4821.
Si un client avait envoyé un nom d'utilisateur et un mot de passe sur le port 1883, tous deux seraient visibles ici en clair. Cette seule observation est l'argument le plus fort en faveur de TLS dont vous aurez jamais besoin.
CONNACK
Le CONNACK affiche le reason code (0x00 signifie succès) et, pour MQTT 5, les propriétés du serveur comme la taille maximale de paquet, le receive maximum, la disponibilité des retained messages et des abonnements avec wildcard, ainsi que la QoS maximale. Les lire est un moyen rapide de comprendre les limites d'un broker.
SUBSCRIBE et SUBACK
Le paquet SUBSCRIBE liste les filtres de topics avec leurs options. Le SUBACK renvoie un reason code par filtre. Un code égal ou supérieur à 0x80 signifie que l'abonnement a été refusé, ce qui passe facilement inaperçu dans les journaux applicatifs mais saute aux yeux dans Wireshark.
PUBLISH
Chaque PUBLISH affiche le topic, la QoS, le retain flag, l'identifiant de paquet pour les QoS 1 et 2, les propriétés et le payload brut. Votre message {"celsius":21.7} est lisible dans le volet des octets du paquet. La publication en QoS 1 est suivie d'un PUBACK du broker portant le même identifiant de paquet. Consultez les niveaux de QoS MQTT expliqués pour comprendre la signification de chaque échange.
Étape 5 : répéter le test via TLS sur le port 8883
Lancez une nouvelle capture avec le même filtre et répétez la publication, cette fois via TLS :
mosquitto_pub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
-i ws-pub-tls-4821 -V mqttv5 \
-t 'connectmq/demo/ws-4821/temp' -m '{"celsius":22.1}' -q 1
Sous Windows ou macOS, faites pointer --cafile vers un bundle d'autorités de certification au lieu de --capath. ConnectMQ utilise un certificat Let's Encrypt, reconnu par les bundles d'autorités standard.
Appliquez le filtre d'affichage tls. Vous voyez maintenant :
- Une négociation TLS : ClientHello, ServerHello et, selon la version, des messages de certificat.
- Le Server Name Indication (
broker.connectmq.com) dans le ClientHello, qui n'est pas chiffré. - Des enregistrements « Application Data » sans topic, client ID ni payload visibles.
Un observateur sur le réseau peut toujours voir que vous avez communiqué avec le broker, à quel moment et approximativement combien de données vous avez envoyées. Il ne peut voir ni les identifiants, ni les topics, ni le contenu des messages. C'est la protection que vous offre TLS, et le guide de configuration TLS de MQTT explique comment la mettre en place sur chaque client.
Étape 6 : déchiffrer votre propre trafic TLS pour le débogage
Il arrive que vous deviez inspecter le trafic TLS de votre propre client pendant le développement. Wireshark peut déchiffrer TLS si le client écrit ses clés de session dans un fichier de journal de clés. Le module ssl de Python le permet :
import ssl
import time
import paho.mqtt.client as mqtt
ctx = ssl.create_default_context()
ctx.keylog_filename = "tls-keys.log" # développement uniquement, jamais en production
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="ws-py-tls-4821",
protocol=mqtt.MQTTv5)
client.tls_set_context(ctx)
def on_connect(c, userdata, flags, reason_code, properties):
print("connected:", reason_code)
c.publish("connectmq/demo/ws-4821/debug", "decrypt me", qos=1)
client.on_connect = on_connect
client.connect("broker.connectmq.com", 8883, keepalive=30)
client.loop_start()
time.sleep(3)
client.loop_stop()
client.disconnect()
Dans Wireshark, allez dans Edit > Preferences > Protocols > TLS et renseignez « (Pre)-Master-Secret log filename » avec le fichier tls-keys.log. Comme Wireshark ne sait pas que le port 8883 transporte du MQTT, faites un clic droit sur un paquet TLS, choisissez « Decode As... » et associez le port 8883 à MQTT. Les paquets déchiffrés affichent désormais les mêmes champs que sur le 1883.
Supprimez ensuite le fichier de journal de clés. Quiconque le possède peut déchiffrer cette capture.
Dépannage avec Wireshark
| Symptôme dans la capture | Cause probable |
|---|---|
| SYN envoyé, pas de SYN-ACK | Pare-feu bloquant le port ou mauvais nom d'hôte |
| La connexion TCP s'établit, le client envoie CONNECT, le broker ferme aussitôt | Violation du protocole, client ID vide ou identifiants invalides |
| CONNACK avec le reason code 0x86 ou 0x87 | Mauvais nom d'utilisateur ou mot de passe, ou non autorisé |
| CONNACK avec 0x85 | Client identifier non valide |
| Alerte TLS « unknown CA » ou « bad certificate » | Le client ne fait pas confiance à la chaîne de certificats |
| PINGREQ sans PINGRESP, puis réinitialisation | Le réseau coupe les connexions inactives ; réduisez le keep alive |
| DISCONNECT avec 0x97 | Quota dépassé sur le broker |
| De nombreux paquets CONNECT à quelques secondes d'intervalle | Boucle de reconnexion, souvent due à un client ID en double |
Le cas du client ID en double est particulièrement fréquent : deux appareils portant le même ID s'éjectent à tour de rôle, et Wireshark révèle ce schéma instantanément.
Passer en production
Le serveur MQTT public gratuit sert aux tests. Pour des données réelles, créez un broker privé, utilisez le nom d'utilisateur, le mot de passe et le client ID générés, et connectez-vous uniquement via TLS sur le 8883 ou via WebSockets sécurisés sur le 8084. Sur ConnectMQ, les brokers privés incluent aussi l'isolation des tenants, des quotas, la protection contre le flooding et le blocage d'IP après des échecs de connexion répétés. Wireshark reste utile dans ce contexte : une capture de votre côté confirme que rien ne quitte votre appareil sans chiffrement. Pour comprendre ce qui peut encore mal tourner sur des brokers non protégés, découvrez les brokers MQTT exposés.
Démarrer avec ConnectMQ
Essayez dès maintenant les captures ci-dessus avec broker.connectmq.com, puis créez un broker privé sur l'offre gratuite Serverless sur app.connectmq.com, sans carte bancaire. Votre code client n'a besoin que d'un nom d'hôte, d'identifiants et du port 8883 pour passer du test à un broker MQTT managé. Pour des conseils généraux de durcissement, consultez les bonnes pratiques de sécurité MQTT.
Questions fréquentes
Pourquoi Wireshark n'affiche-t-il pas MQTT sur le port 8883 ?
Le trafic sur le 8883 est chiffré avec TLS ; Wireshark ne voit donc que des enregistrements TLS. Vous pouvez déchiffrer vos propres sessions avec un fichier de journal de clés, puis utiliser « Decode As » pour appliquer le dissecteur MQTT.
Quel est le filtre Wireshark pour MQTT ?
Utilisez le filtre d'affichage mqtt pour tous les paquets décodés, ou mqtt.msgtype == 3 pour les seuls paquets PUBLISH. Un filtre de capture tcp port 1883 limite l'enregistrement au MQTT en clair.
Wireshark peut-il voir MQTT sur WebSockets ?
Oui : sur un port WebSocket non chiffré, Wireshark décode les trames WebSocket et peut appliquer le dissecteur MQTT à leur payload. Les WebSockets sécurisés sur le 8084 sont chiffrés comme le port 8883.
Est-il légal de capturer du trafic MQTT ?
Capturer le trafic de vos propres appareils et réseaux à des fins de débogage est une pratique normale. Capturer le trafic d'autrui sans autorisation ne l'est pas ; limitez donc vos captures aux systèmes qui vous appartiennent ou que vous êtes autorisé à surveiller.



