Bir MQTT portunun açık olup olmadığını kontrol etmek için Linux veya macOS'ta nc -vz -w 5 broker.connectmq.com 1883, PowerShell'de ise Test-NetConnection broker.connectmq.com -Port 1883 çalıştırın. "Succeeded" bir TCP bağlantısının kabul edildiğini gösterir; "refused" veya "timed out" ise bir sonraki adımda nereye bakmanız gerektiğini söyler. Bu rehber her aracı, çıktısının ne anlama geldiğini ve bir firewall sorununu broker sorunundan nasıl ayıracağınızı gösteriyor.
Kontrol edilecek portlar
| Port | Taşıma | Tipik kullanım |
|---|---|---|
| 1883 | TCP üzerinden MQTT | Şifresiz MQTT, geliştirme, güvenilir ağlar |
| 8883 | TLS üzerinden MQTT | Üretimdeki cihazlar |
| 8083 / 8080 | WebSocket üzerinden MQTT | http sayfalarındaki tarayıcılar, yerel araçlar |
| 8084 / 8443 / 443 | Güvenli WebSocket üzerinden MQTT | Tarayıcılar, kısıtlayıcı ağlar |
Kesin port numaraları broker yapılandırmasına bağlıdır — bkz. MQTT portları. Örneklerde 1883, 8883, 8083 ve 8084'ü dinleyen broker.connectmq.com kullanıyoruz.
nc (netcat) — Linux ve macOS
nc -z bir TCP bağlantısı açar ve veri göndermeden kapatır; -v sonucu yazdırır, -w 5 ise beş saniye sonra vazgeçer.
nc -vz -w 5 broker.connectmq.com 1883Connection to broker.connectmq.com port 1883 [tcp/ibm-mqtt] succeeded!
nc: connect to broker.connectmq.com port 1883 (tcp) failed: Connection refused
nc: connect to broker.connectmq.com port 1883 (tcp) failed: Connection timed outTam ifade netcat sürümleri arasında değişir (macOS connectx to ... yazar, bazı sürümler open yazar), ancak üç sonuç her zaman aynıdır. Tüm MQTT portlarını tek seferde kontrol edin:
for p in 1883 8883 8083 8084; do nc -vz -w 5 broker.connectmq.com "$p"; donenc kurulu değil mi? Bash kendi başına bir TCP soketi açabilir:
timeout 5 bash -c '</dev/tcp/broker.connectmq.com/1883' && echo open || echo closedtelnet
telnet birçok sunucuda hâlâ kuruludur ve Windows'ta Telnet İstemcisi özelliği etkinleştirildiğinde çalışır:
telnet broker.connectmq.com 1883Trying 203.0.113.10...
Connected to broker.connectmq.com.
Escape character is '^]'.Connected to portun açık olduğunu gösterir. Çıkmak için Ctrl+] tuşlayıp quit yazın. Bunun yerine telnet: Unable to connect to remote host: Connection refused görüyorsanız bağlantıyı hiçbir şey kabul etmemiştir; uzun bir bekleme ardından gelen Connection timed out ise arada bir filtre olduğuna işaret eder. Bağlandıktan sonra bir şey yazmayın — MQTT ikili (binary) bir protokoldür ve broker geçerli bir CONNECT paketi almadan bağlantı zaman aşımı dolduğunda bağlantıyı kapatır. Bu normaldir.
nmap — birden fazla port ve durumları
nmap her port için net bir durum bildirir; bu da onu "closed" ile "filtered"ı ayırt etmek için en iyi araç yapar:
nmap -Pn -p 1883,8883,8083,8084 broker.connectmq.comPORT STATE SERVICE
1883/tcp open mqtt
8883/tcp open secure-mqtt
8083/tcp open us-srv
8084/tcp filtered websnp| Durum | Anlamı |
|---|---|
open | Bir şey TCP bağlantısını kabul etti |
closed | Host erişilebilir, dinleyen yok (TCP reset) |
filtered | Yanıt yok — bir firewall yoklamayı düşürdü |
-Pn, birçok bulut host'unun engellediği ping kontrolünü atlar. SERVICE sütunu yalnızca nmap'in port numarasına göre yaptığı bir tahmindir; orada MQTT çalıştığının kanıtı değildir.
PowerShell Test-NetConnection — Windows
Test-NetConnection broker.connectmq.com -Port 1883ComputerName : broker.connectmq.com
RemoteAddress : 203.0.113.10
RemotePort : 1883
TcpTestSucceeded : TrueBaşarısız olursa WARNING: TCP connect to (203.0.113.10 : 1883) failed ve TcpTestSucceeded : False görürsünüz. Script'lerde yalnızca True / False almak için -InformationLevel Quiet kullanın. Yerel bir broker'a başka makinelerden erişilemiyorsa Windows Defender Firewall sık görülen bir nedendir — bkz. MQTT ve Windows firewall.
Sonucu okumak: firewall mı, broker mı?
| Sonuç | Anlamı | Nereye bakmalı |
|---|---|---|
| Open / succeeded | TCP uçtan uca çalışıyor | Bir katman yukarı çıkın: TLS ve MQTT (aşağıda) |
| Connection refused | Host'a ulaşıldı, o portta listener yok | Broker çalışıyor mu? Hangi adres ve portu dinliyor? |
| Timed out / filtered | Paketler bir yerde düşürülüyor | Host firewall'u, bulut security group'u, kurumsal proxy, yanlış IP |
| İsim çözümlenemedi | Port değil DNS sorunu | Host adını kontrol edin — bkz. DNS ve ağ testi |
Ardından aynı kontrolü ikinci bir ağdan çalıştırın — telefonunuzun hotspot'u, bir bulut VM'i, bir ekip arkadaşınızın makinesi. Port dışarıdan açık ama ofisinizden kapalıysa ağınız onu engelliyordur (kurumsal ağlarda ve misafir Wi-Fi'larında 1883 ve 8883 için yaygındır; bkz. kurumsal firewall arkasında MQTT). Her yerden kapalıysa sorun broker tarafındadır.
Broker host'unda: dinleyen bir şey var mı?
Broker'ı kendiniz çalıştırıyor ve "refused" görüyorsanız neyin dinlediğini kontrol edin:
sudo ss -ltnp | grep -E '1883|8883' # Linux
sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -E '1883|8883' # macOSnetstat -ano | findstr :1883127.0.0.1:1883 üzerindeki bir listener yalnızca yerel bağlantıları kabul eder. Mosquitto 2.x, hiçbir listener tanımlanmadığında varsayılan olarak böyle davranır ve Starting in local only mode. Connections will only be possible from clients running on this machine. mesajını loglar. Uzak istemcileri kabul etmek için açık bir listener (ve kimlik doğrulama) ekleyin:
listener 1883 0.0.0.0
allow_anonymous false
password_file /etc/mosquitto/passwdMosquitto yapılandırma oluşturucu, TLS ve WebSocket listener'larıyla eksiksiz bir dosya üretir. Docker'da ayrıca portun yayınlandığını (-p 1883:1883) kontrol edin.
Port açık ama bağlantı yine yok mu? Bir sonraki katmanı test edin
Açık bir port yalnızca TCP'nin çalıştığını kanıtlar. İki hızlı kontrol üst katmanları kapsar:
openssl s_client -connect broker.connectmq.com:8883 -servername broker.connectmq.com </dev/nullmosquitto_pub -h broker.connectmq.com -p 1883 -t testmqtt/port-check/ping -m ok -d-d ile sağlıklı bir broker, bir sending CONNECT satırının ardından received CONNACK (0) gösterir. Sıfırdan farklı bir CONNACK, kimlik doğrulama veya protokol sorunudur — kodu reason code aracında arayın. TLS 1883'te takılıyor ya da MQTT 8883'te başarısız oluyorsa düz port ile TLS portunu karıştırmışsınızdır. Sertifika hataları TLS bağlantısını test etme yazısında ele alınıyor. Son olarak tam bir publish/subscribe gidiş-dönüşünü doğrulamak için online MQTT istemcisi ile bağlanın.
Gerçek bir MQTT gidiş-dönüşüyle doğrulayın
Port kontrolü saniyeler sürer ve sorunu ikiye böler: TCP başarısızsa sorun ağda, firewall'da veya listener'dadır; TCP başarılıysa TLS'e, kimlik bilgilerine ve MQTT'nin kendisine bakın. Kontrolü birden fazla ağdan çalıştırın, "refused" ile "timed out"u farklı okuyun; tek bir log dosyası açmadan nereye bakacağınızı bilirsiniz.
Sıkça sorulan sorular
1883 portunun açık olup olmadığını nasıl kontrol ederim?
Linux veya macOS'ta nc -vz -w 5 host 1883, Windows'ta PowerShell ile Test-NetConnection host -Port 1883 çalıştırın. "succeeded" veya TcpTestSucceeded : True bir TCP bağlantısının kabul edildiği, refused veya timed out ise edilmediği anlamına gelir.
connection refused ile timed out arasındaki fark nedir?
Refused, host'un yanıt verdiği ama o portta hiçbir şeyin dinlemediği (veya bir firewall'un aktif olarak reddettiği) anlamına gelir. Timed out ise hiç yanıt gelmediğini gösterir; bu genellikle paketleri sessizce düşüren bir firewall ya da security group, yanlış bir IP veya yönlendirme sorunudur.
Port açık ama MQTT istemcim yine de bağlanamıyor. Neden?
Açık port yalnızca TCP'nin çalıştığını kanıtlar. Hata bu durumda TLS veya MQTT katmanındadır: TLS ile düz TCP için yanlış port, sertifika sorunları, ham MQTT için kullanılan bir WebSocket portu, yanlış kimlik bilgileri veya reddedilen bir client ID. CONNACK reason code'unu mosquitto_pub -d ile kontrol edin.


