Pruebas de brokers

Cómo comprobar si un puerto MQTT está abierto (nc, telnet, nmap)

Comprueba si los puertos MQTT 1883, 8883, 8083 u 8084 están abiertos con nc, telnet, nmap y Test-NetConnection, y distingue firewall de broker.

Actualizado · 7 min de lectura

Cómo comprobar si un puerto MQTT está abierto (nc, telnet, nmap)

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

PuertoTransporteUso típico
1883MQTT sobre TCPMQTT sin cifrar, desarrollo, redes de confianza
8883MQTT sobre TLSDispositivos en producción
8083 / 8080MQTT sobre WebSocketNavegadores en páginas http, herramientas locales
8084 / 8443 / 443MQTT sobre WebSocket seguroNavegadores, 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.

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

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

All MQTT ports
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:

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

telnet

telnet sigue instalado en muchos servidores y funciona en Windows una vez activada la característica Cliente Telnet:

telnet
telnet broker.connectmq.com 1883
Output
Trying 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
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
EstadoSignificado
openAlgo aceptó la conexión TCP
closedHost accesible, nada escuchando (reset TCP)
filteredSin 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

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

Si 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?

ResultadoQué significaDónde mirar
Open / succeededTCP funciona de extremo a extremoSube de capa: TLS y MQTT (más abajo)
Connection refusedSe llegó al host, sin listener en ese puerto¿Está el broker en marcha? ¿En qué dirección y puerto escucha?
Timed out / filteredPaquetes descartados en algún puntoFirewall del host, security group en la nube, proxy corporativo, IP errónea
Nombre no resueltoProblema de DNS, no de puertoRevisa 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:

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

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

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

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

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

Con -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.