Para comprobar si un puerto MQTT está abierto, ejecuta nc -vz -w 5 broker.connectmq.com 1883 en Linux o macOS, o Test-NetConnection broker.connectmq.com -Port 1883 en PowerShell. "Succeeded" significa que se aceptó una conexión TCP; "refused" o "timed out" te dicen dónde mirar a continuación. Esta guía muestra cada herramienta, qué significa su salida y cómo distinguir un problema de firewall de uno del broker.
Los puertos a comprobar
| Puerto | Transporte | Uso típico |
|---|---|---|
| 1883 | MQTT sobre TCP | MQTT sin cifrar, desarrollo, redes de confianza |
| 8883 | MQTT sobre TLS | Dispositivos en producción |
| 8083 / 8080 | MQTT sobre WebSocket | Navegadores en páginas http, herramientas locales |
| 8084 / 8443 / 443 | MQTT sobre WebSocket seguro | Navegadores, redes restrictivas |
Los números exactos dependen de la configuración del broker; consulta puertos MQTT explicados. En los ejemplos usamos broker.connectmq.com, que escucha en 1883, 8883, 8083 y 8084.
nc (netcat) — Linux y macOS
nc -z abre una conexión TCP y la cierra sin enviar datos; -v muestra el resultado y -w 5 abandona tras cinco segundos.
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 outEl texto exacto varía entre variantes de netcat (macOS muestra connectx to ..., algunas versiones muestran open), pero los tres resultados son siempre los mismos. Comprueba todos los puertos MQTT de una vez:
for p in 1883 8883 8083 8084; do nc -vz -w 5 broker.connectmq.com "$p"; done¿No tienes nc? Bash puede abrir un socket TCP por sí mismo:
timeout 5 bash -c '</dev/tcp/broker.connectmq.com/1883' && echo open || echo closedtelnet
telnet sigue instalado en muchos servidores y funciona en Windows una vez activada la característica Cliente Telnet:
telnet broker.connectmq.com 1883Trying 203.0.113.10...
Connected to broker.connectmq.com.
Escape character is '^]'.Connected to significa que el puerto está abierto. Pulsa Ctrl+] y escribe quit para salir. Si en cambio ves telnet: Unable to connect to remote host: Connection refused, nada aceptó la conexión; una pausa larga seguida de Connection timed out apunta a un filtro intermedio. No escribas nada tras conectar: MQTT es un protocolo binario y el broker cerrará la conexión cuando expire su timeout de conexión sin recibir un paquete CONNECT válido. Es normal.
nmap — varios puertos y su estado
nmap da un estado claro para cada puerto, lo que lo convierte en la mejor herramienta para separar "closed" de "filtered":
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| Estado | Significado |
|---|---|
open | Algo aceptó la conexión TCP |
closed | Host accesible, nada escuchando (reset TCP) |
filtered | Sin respuesta: un firewall descartó la sonda |
-Pn omite el ping previo, que muchos hosts en la nube bloquean. La columna SERVICE es solo una suposición de nmap según el número de puerto, no prueba de que allí corra MQTT.
PowerShell Test-NetConnection — Windows
Test-NetConnection broker.connectmq.com -Port 1883ComputerName : broker.connectmq.com
RemoteAddress : 203.0.113.10
RemotePort : 1883
TcpTestSucceeded : TrueSi falla verás WARNING: TCP connect to (203.0.113.10 : 1883) failed y TcpTestSucceeded : False. Usa -InformationLevel Quiet para obtener solo True / False en scripts. Si un broker local no es accesible desde otras máquinas, el Firewall de Windows Defender es una causa frecuente; consulta MQTT y el firewall de Windows.
Interpretar el resultado: ¿firewall o broker?
| Resultado | Qué significa | Dónde mirar |
|---|---|---|
| Open / succeeded | TCP funciona de extremo a extremo | Sube de capa: TLS y MQTT (más abajo) |
| Connection refused | Se llegó al host, sin listener en ese puerto | ¿Está el broker en marcha? ¿En qué dirección y puerto escucha? |
| Timed out / filtered | Paquetes descartados en algún punto | Firewall del host, security group en la nube, proxy corporativo, IP errónea |
| Nombre no resuelto | Problema de DNS, no de puerto | Revisa el nombre de host; consulta probar DNS y red |
Después repite la misma comprobación desde una segunda red: el hotspot de tu móvil, una VM en la nube, la máquina de un compañero. Si el puerto está abierto desde fuera pero no desde tu oficina, tu red lo bloquea (habitual con 1883 y 8883 en redes corporativas y Wi-Fi de invitados; consulta MQTT detrás de un firewall corporativo). Si está cerrado desde todas partes, el problema está del lado del broker.
En el host del broker: ¿hay algo escuchando?
Si gestionas el broker tú mismo y ves "refused", comprueba qué está escuchando:
sudo ss -ltnp | grep -E '1883|8883' # Linux
sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -E '1883|8883' # macOSnetstat -ano | findstr :1883Un listener en 127.0.0.1:1883 solo acepta conexiones locales. Mosquitto 2.x hace esto por defecto cuando no hay listener configurado y registra Starting in local only mode. Connections will only be possible from clients running on this machine. Añade un listener explícito (y autenticación) para aceptar clientes remotos:
listener 1883 0.0.0.0
allow_anonymous false
password_file /etc/mosquitto/passwdEl generador de configuración de Mosquitto crea un archivo completo con listeners TLS y WebSocket. En Docker, comprueba además que el puerto está publicado (-p 1883:1883).
¿Puerto abierto y sigue sin conectar? Prueba la siguiente capa
Un puerto abierto solo demuestra que TCP funciona. Dos comprobaciones rápidas cubren las capas superiores:
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 -dCon -d, un broker sano muestra una línea sending CONNECT seguida de received CONNACK (0). Un CONNACK distinto de cero es un problema de autenticación o de protocolo: busca el código con la herramienta de reason codes. Si TLS se queda colgado en 1883 o MQTT falla en 8883, has confundido el puerto plano con el de TLS. Los errores de certificado se tratan en probar una conexión TLS. Por último, conéctate con el cliente MQTT online para confirmar un viaje completo de publicación/suscripción.
Confírmalo con un viaje MQTT real
Comprobar un puerto lleva segundos y divide el problema en dos: si TCP falla, es un problema de red, de firewall o de listener; si TCP funciona, mira TLS, las credenciales y el propio MQTT. Haz la comprobación desde más de una red, interpreta "refused" y "timed out" de forma distinta y sabrás dónde mirar antes de abrir un solo archivo de log.
Preguntas frecuentes
¿Cómo compruebo si el puerto 1883 está abierto?
Ejecuta nc -vz -w 5 host 1883 en Linux o macOS, o Test-NetConnection host -Port 1883 en PowerShell en Windows. "succeeded" o TcpTestSucceeded : True significa que se aceptó una conexión TCP; refused o timed out significa que no.
¿Qué diferencia hay entre connection refused y timed out?
Refused significa que el host respondió pero nada escucha en ese puerto (o un firewall lo rechazó activamente). Timed out significa que no hubo respuesta, lo que suele indicar un firewall o security group que descarta paquetes en silencio, una IP incorrecta o un problema de enrutamiento.
El puerto está abierto pero mi cliente MQTT sigue sin conectar. ¿Por qué?
Un puerto abierto solo demuestra que TCP funciona. El fallo está entonces en la capa TLS o MQTT: puerto equivocado para TLS frente a TCP plano, problemas de certificado, un puerto WebSocket usado para MQTT puro, credenciales erróneas o un client ID rechazado. Revisa el reason code del CONNACK con mosquitto_pub -d.


