Broker testleri

MQTT Portunun Açık Olup Olmadığı Nasıl Kontrol Edilir (nc, telnet, nmap)

MQTT portları 1883, 8883, 8083 ve 8084'ün açık olup olmadığını nc, telnet, nmap ve Test-NetConnection ile kontrol edin; firewall ile broker'ı ayırın.

Güncellendi · 7 dk okuma

MQTT Portunun Açık Olup Olmadığı Nasıl Kontrol Edilir (nc, telnet, nmap)

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

PortTaşımaTipik kullanım
1883TCP üzerinden MQTTŞifresiz MQTT, geliştirme, güvenilir ağlar
8883TLS üzerinden MQTTÜretimdeki cihazlar
8083 / 8080WebSocket üzerinden MQTThttp sayfalarındaki tarayıcılar, yerel araçlar
8084 / 8443 / 443Güvenli WebSocket üzerinden MQTTTarayı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.

Check one port
nc -vz -w 5 broker.connectmq.com 1883
Possible results
Connection 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 out

Tam 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:

All MQTT ports
for p in 1883 8883 8083 8084; do nc -vz -w 5 broker.connectmq.com "$p"; done

nc kurulu değil mi? Bash kendi başına bir TCP soketi açabilir:

Bash only
timeout 5 bash -c '</dev/tcp/broker.connectmq.com/1883' && echo open || echo closed

telnet

telnet birçok sunucuda hâlâ kuruludur ve Windows'ta Telnet İstemcisi özelliği etkinleştirildiğinde çalışır:

telnet
telnet broker.connectmq.com 1883
Output
Trying 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
nmap -Pn -p 1883,8883,8083,8084 broker.connectmq.com
Example output (8084 blocked by a local firewall)
PORT     STATE    SERVICE
1883/tcp open     mqtt
8883/tcp open     secure-mqtt
8083/tcp open     us-srv
8084/tcp filtered websnp
DurumAnlamı
openBir şey TCP bağlantısını kabul etti
closedHost erişilebilir, dinleyen yok (TCP reset)
filteredYanı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

PowerShell
Test-NetConnection broker.connectmq.com -Port 1883
Output
ComputerName     : broker.connectmq.com
RemoteAddress    : 203.0.113.10
RemotePort       : 1883
TcpTestSucceeded : True

Baş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 / succeededTCP uçtan uca çalışıyorBir katman yukarı çıkın: TLS ve MQTT (aşağıda)
Connection refusedHost'a ulaşıldı, o portta listener yokBroker çalışıyor mu? Hangi adres ve portu dinliyor?
Timed out / filteredPaketler bir yerde düşürülüyorHost firewall'u, bulut security group'u, kurumsal proxy, yanlış IP
İsim çözümlenemediPort değil DNS sorunuHost 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:

Linux / macOS
sudo ss -ltnp | grep -E '1883|8883'        # Linux
sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -E '1883|8883'   # macOS
Windows
netstat -ano | findstr :1883

127.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:

mosquitto.conf
listener 1883 0.0.0.0
allow_anonymous false
password_file /etc/mosquitto/passwd

Mosquitto 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:

TLS: does the port speak TLS, and which certificate?
openssl s_client -connect broker.connectmq.com:8883 -servername broker.connectmq.com </dev/null
MQTT: does the broker answer CONNECT with CONNACK?
mosquitto_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.