Bir MQTT Wireshark yakalaması, istemcinizin broker'a tam olarak ne gönderdiğini alan alan gösterir. Bu eğitimde ücretsiz broker.connectmq.com test broker'ına 1883 portu üzerinden giden kendi trafiğinizi yakalayacak, CONNECT, SUBSCRIBE ve PUBLISH paketlerini çözecek, ardından şifrelemenin neyi gizlediğini görmek için testi TLS portu 8883 üzerinde tekrarlayacaksınız. Bu, bağlantı sorunlarını ayıklamanın ve üretim trafiğinin neden TLS kullanması gerektiğini kendinize kanıtlamanın en hızlı yoludur.
Yalnızca size ait olan veya izleme yetkiniz bulunan ağlarda ve cihazlarda trafik yakalayın.
Neye İhtiyacınız Var?
- Resmi siteden Wireshark 3.x veya 4.x ve makinenizde yakalama izinleri.
- Mosquitto komut satırı istemcileri (
mosquitto_pubvemosquitto_sub). - TLS şifre çözme adımı için isteğe bağlı olarak paho-mqtt 2.x ile Python 3.
- Benzersiz bir topic öneki, örneğin
connectmq/demo/ws-4821/.
Herkese açık broker herkese açıktır; bu yüzden yalnızca test verisi publish edin. Ücretsiz herkese açık MQTT broker yazısı sınırlarını listeler.
Adım 1: Port Filtresiyle Yakalama Başlatın
Wireshark'ı açın, internet erişimi için kullandığınız ağ arayüzünü seçin ve yalnızca MQTT trafiğini kaydetmek için bir yakalama filtresi girin:
tcp port 1883 or tcp port 8883
Yakalamayı başlatın. Wireshark 1883 portundaki MQTT'yi otomatik olarak tanır ve MQTT dissector'ını uygular.
Adım 2: Biraz Şifresiz MQTT Trafiği Üretin
Bir terminalde subscribe olun:
mosquitto_sub -h broker.connectmq.com -p 1883 -i ws-sub-4821 -V mqttv5 \
-t 'connectmq/demo/ws-4821/#' -v
İkinci bir terminalde bir retained ve bir normal mesaj publish edin:
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
Subscriber'ı Ctrl+C ile durdurun ve yakalamayı sonlandırın.
Adım 3: MQTT Görüntüleme Filtrelerini Uygulayın
Üstteki çubuğa bir görüntüleme filtresi yazın. En kullanışlı olanlar şunlardır:
| Görüntüleme filtresi | Gösterdiği |
|---|---|
mqtt |
Çözümlenmiş tüm MQTT paketleri |
mqtt.msgtype == 1 |
CONNECT |
mqtt.msgtype == 2 |
CONNACK |
mqtt.msgtype == 3 |
PUBLISH |
mqtt.msgtype == 8 |
SUBSCRIBE |
mqtt.msgtype == 12 or mqtt.msgtype == 13 |
PINGREQ ve PINGRESP |
mqtt.msgtype == 14 |
DISCONNECT |
mqtt.topic contains "ws-4821" |
Topic önekinize ait paketler |
mqtt.clientid == "ws-pub-4821" |
Belirli bir istemciden gelen CONNECT |
tls |
Genellikle 8883 üzerindeki şifreli trafik |
Alan adları Wireshark sürümleri arasında biraz farklılık gösterebilir. Bir filtre reddedilirse bir paketi genişletin, bir alana sağ tıklayın ve tam adı almak için "Apply as Filter" seçeneğini seçin.
Adım 4: Çözümlenmiş Paketleri Okuyun
CONNECT
Bir CONNECT paketi seçin ve "MQ Telemetry Transport Protocol" bölümünü genişletin. Şunları göreceksiniz:
- Protokol adı ve sürümü (MQTT, sürüm 5 veya 3.1.1 için 4).
- Bağlantı bayrakları (connect flags): clean start, will bayrağı, kullanıcı adı ve parola bayrakları.
- Saniye cinsinden keep alive.
- Session expiry interval gibi özellikler (MQTT 5).
- Client ID, burada
ws-pub-4821.
Bir istemci 1883 portu üzerinden kullanıcı adı ve parola göndermiş olsaydı, ikisi de burada düz metin olarak görünürdü. Bu tek gözlem, TLS lehine ihtiyaç duyacağınız en güçlü argümandır.
CONNACK
CONNACK, reason code'u (0x00 başarı anlamına gelir) ve MQTT 5 için maksimum paket boyutu, receive maximum, retained mesajların ve wildcard subscription'ların kullanılabilir olup olmadığı ve maksimum QoS gibi sunucu özelliklerini gösterir. Bunları okumak, bir broker'ın sınırlarını anlamanın hızlı bir yoludur.
SUBSCRIBE ve SUBACK
SUBSCRIBE paketi, topic filtrelerini seçenekleriyle birlikte listeler. SUBACK, her filtre için bir reason code döndürür. 0x80 veya daha yüksek bir kod, subscription'ın reddedildiği anlamına gelir; bu durum uygulama loglarında kolayca gözden kaçar ama Wireshark'ta apaçık görünür.
PUBLISH
Her PUBLISH; topic'i, QoS'u, retain bayrağını, QoS 1 ve 2 için paket tanımlayıcısını, özellikleri ve ham payload'u gösterir. {"celsius":21.7} mesajınız paket baytları bölmesinde okunabilir. QoS 1 publish'in ardından broker'dan aynı paket tanımlayıcısına sahip bir PUBACK gelir. Her alışverişin ne anlama geldiği için MQTT QoS seviyeleri yazısına bakın.
Adım 5: Testi 8883 Portunda TLS Üzerinden Tekrarlayın
Aynı filtreyle yeni bir yakalama başlatın ve publish işlemini bu kez TLS kullanarak tekrarlayın:
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
Windows veya macOS'ta --capath yerine --cafile seçeneğini bir CA paketine yönlendirin. ConnectMQ, standart CA paketlerinin güvendiği bir Let's Encrypt sertifikası kullanır.
tls görüntüleme filtresini uygulayın. Şimdi şunları görürsünüz:
- Bir TLS handshake: ClientHello, ServerHello ve sürüme bağlı olarak sertifika mesajları.
- ClientHello içinde şifrelenmemiş olan Server Name Indication (
broker.connectmq.com). - Topic, client ID veya payload görünmeyen "Application Data" kayıtları.
Ağdaki bir gözlemci yine de broker ile konuştuğunuzu, ne zaman konuştuğunuzu ve kabaca ne kadar veri gönderdiğinizi görebilir. Kimlik bilgilerini, topic'leri veya mesaj içeriğini göremez. TLS'in size sağladığı koruma budur; MQTT TLS yapılandırması rehberi bunu her istemcide nasıl kuracağınızı açıklar.
Adım 6: Hata Ayıklama İçin Kendi TLS Trafiğinizin Şifresini Çözün
Bazen geliştirme sırasında kendi istemcinizin TLS trafiğini incelemeniz gerekir. İstemci oturum anahtarlarını bir key log dosyasına yazarsa Wireshark TLS'i çözebilir. Python'un ssl modülü bunu destekler:
import ssl
import time
import paho.mqtt.client as mqtt
ctx = ssl.create_default_context()
ctx.keylog_filename = "tls-keys.log" # yalnızca geliştirme için, asla üretimde değil
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()
Wireshark'ta Edit > Preferences > Protocols > TLS yolunu izleyin ve "(Pre)-Master-Secret log filename" alanını tls-keys.log dosyasına ayarlayın. Wireshark 8883 portunun MQTT taşıdığını bilmediği için bir TLS paketine sağ tıklayın, "Decode As..." seçeneğini seçin ve 8883 portunu MQTT olarak ayarlayın. Şifresi çözülmüş paketler artık 1883'te gördüğünüz alanların aynısını gösterir.
İşiniz bittiğinde key log dosyasını silin. Bu dosyaya sahip herkes o yakalamanın şifresini çözebilir.
Wireshark ile Sorun Giderme
| Yakalamadaki belirti | Olası neden |
|---|---|
| SYN gönderildi, SYN-ACK yok | Portu engelleyen güvenlik duvarı veya yanlış hostname |
| TCP bağlanır, istemci CONNECT gönderir, broker hemen kapatır | Protokol ihlali, boş client ID veya geçersiz kimlik bilgileri |
| 0x86 veya 0x87 reason code'lu CONNACK | Hatalı kullanıcı adı/parola veya yetkisiz |
| 0x85 ile CONNACK | Client identifier geçerli değil |
| "unknown CA" veya "bad certificate" TLS alert'i | İstemci sertifika zincirine güvenmiyor |
| PINGREQ var, PINGRESP yok, ardından reset | Ağ boşta kalan bağlantıları düşürüyor; keep alive'ı azaltın |
| 0x97 ile DISCONNECT | Broker üzerinde kota aşıldı |
| Saniyeler arayla çok sayıda CONNECT paketi | Yeniden bağlanma döngüsü, çoğu zaman yinelenen client ID'den |
Yinelenen client ID durumu özellikle yaygındır: aynı ID'ye sahip iki cihaz sırayla birbirini dışarı atar ve Wireshark bu deseni anında gösterir.
Üretime Taşımak
Herkese açık broker testler içindir. Gerçek veriler için özel bir broker oluşturun, oluşturulan kullanıcı adını, parolayı ve client ID'yi kullanın ve yalnızca 8883 üzerinden TLS veya 8084 üzerinden güvenli WebSocket ile bağlanın. ConnectMQ üzerinde özel broker'lar ayrıca tenant izolasyonu, kotalar, flood koruması ve tekrarlanan başarısız oturum açma denemelerinden sonra IP engelleme içerir. Wireshark orada da faydalı olmaya devam eder: kendi tarafınızda yakalama yapmak, cihazınızdan hiçbir şeyin şifresiz çıkmadığını doğrular. Korumasız broker'larda başka nelerin ters gidebileceğini anlamak için açıkta kalan MQTT broker'lar hakkında okuyun.
ConnectMQ ile Başlayın
Yukarıdaki yakalamaları şimdi broker.connectmq.com'a karşı deneyin, ardından app.connectmq.com adresinde ücretsiz Serverless planla kredi kartı olmadan özel bir broker oluşturun. İstemci kodunuzun testten yönetilen MQTT broker'a geçmesi için yalnızca bir hostname, kimlik bilgileri ve 8883 portu yeterlidir. Genel sıkılaştırma ipuçları için MQTT güvenliği en iyi uygulamaları yazısına bakın.
Sık Sorulan Sorular
Wireshark neden 8883 portunda MQTT göstermiyor?
8883 üzerindeki trafik TLS ile şifrelenir; bu nedenle Wireshark yalnızca TLS kayıtlarını görür. Kendi oturumlarınızın şifresini bir key log dosyasıyla çözebilir, ardından MQTT dissector'ını uygulamak için "Decode As" seçeneğini kullanabilirsiniz.
MQTT için Wireshark filtresi nedir?
Çözümlenmiş tüm paketler için mqtt görüntüleme filtresini, yalnızca PUBLISH paketleri için mqtt.msgtype == 3 filtresini kullanın. tcp port 1883 yakalama filtresi kaydı şifresiz MQTT ile sınırlar.
Wireshark, WebSocket üzerinden MQTT'yi görebilir mi?
Evet; şifrelenmemiş bir WebSocket portunda Wireshark WebSocket çerçevelerini çözer ve bunların payload'una MQTT dissector'ını uygulayabilir. 8084 üzerindeki güvenli WebSocket, tıpkı 8883 portu gibi şifrelidir.
MQTT trafiğini yakalamak yasal mı?
Hata ayıklama amacıyla kendi cihazlarınızda ve ağlarınızda trafik yakalamak olağan bir uygulamadır. Başkalarının trafiğini yetkisiz yakalamak ise öyle değildir; bu yüzden yakalamaları size ait veya izleme izniniz olan sistemlerle sınırlayın.



