MQTT Güvenliği

MQTT Wireshark Eğitimi: MQTT Trafiğini Yakalama ve Analiz Etme

Kendi MQTT trafiğinizi Wireshark ile yakalayın, 1883 portunda her paket alanını okuyun ve ücretsiz broker.connectmq.com test broker'ını kullanarak 8883 portundaki TLS'in tam olarak neyi koruduğunu görün.

Çözümlenmiş CONNECT ve PUBLISH paketlerini 8883 portundaki şifreli TLS kayıtlarının yanında gösteren MQTT Wireshark yakalaması
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

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_pub ve mosquitto_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.

İlgili yazılar

MQTT Kimlik Bilgileri Kesintisiz Nasıl Yenilenir?

Bir filo genelinde MQTT kullanıcı adı ve şifrelerini yenilemek için adım adım çift kimlik bilgisi stratejisi: yeni kimlik bilgisini hazırlayın, geri dönüş seçeneğiyle geçiş yapın, doğrulayın ve ancak ondan sonra eskisini iptal edin.

6 dk okuma

MQTT Kimlik Bilgilerini Gömülü Cihazlarda Güvenle Saklamak

ESP32 ve Linux cihazlarda MQTT kullanıcı adı ve şifrelerini korumanın yollarına pratik bir karşılaştırma; şifrelenmiş NVS ve flash şifrelemeden secure element'lere ve TPM destekli systemd kimlik bilgilerine kadar.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.