MQTT en producción: pruebas detrás de un broker con 5 protocolos y mTLS
Artículo técnico · Gilberto Castillo · broker.gilman.pro · 2026
MQTT (Message Queuing Telemetry Transport) es el protocolo estándar de IoT: liviano, publish/subscribe, pensado para sensores y dispositivos con recursos limitados. En este artículo te explico la técnica detrás del broker que construí y desplegué en producción: cómo funciona, los 5 protocolos de conexión, la seguridad aplicada y cómo puedes probarlo — empezando por el tester web, porque lo mejor de un sistema es poder tocarlo.
🧪 Pruébalo primero: el Test-Broker
Antes de hablar de puertos y certificados, lo primero que necesitas saber es que puedes probar este broker sin instalar absolutamente nada, desde el navegador.
El Test-Broker (test-broker.gilman.pro) es un tester web de MQTT que construí como proyecto complementario. Técnicamente funciona así:
- El navegador no habla MQTT nativo, así que el backend (FastAPI) abre un puente WebSocket → MQTT: el JavaScript envía el mensaje por WebSocket, el servidor lo traduce a MQTT (con paho-mqtt v2, soportando MQTT v5 y v3.1.1) y lo entrega al broker.
- Soporta los 5 protocolos del broker: TCP, TLS, mTLS, WebSocket y WSS — con selector de protocolo y versión por cliente, e incluso certificados.
- Los usuarios temporales son autogestionados: cualquiera solicita credenciales en
/solicitarcon su correo, el sistema las genera (validez 24 h, límites de clientes y conexiones controlados) y las envía por SMTP. Protegido contra abuso con rate limiting anti-spam (3 solicitudes/h por IP, 1/día por correo) y honeypots.
Para probar el broker desde el navegador:
- Entra a
https://test-broker.gilman.pro/solicitary pide un usuario temporal (llega a tu correo) - Inicia sesión y crea un cliente MQTT hacia
broker.gilman.pro— puerto14769(TCP), usuario/contraseña recibidos - Publica y suscríbete en tiempo real — mensajes al instante, colores por tópico, filtros y auto-scroll
¿Prefieres scripts y terminal? También hay un kit descargable (.rar) con scripts de validación, certificados mTLS, instalador de Mosquitto y guía paso a paso — todo listo para ejecutar:
⚙️ La arquitectura
El broker corre en un VPS con Docker Compose (3 servicios) detrás de nginx como punto único de entrada con TLS:
Dispositivos IoT ── TCP / TLS / mTLS ──► Mosquitto (broker MQTT)
Navegador Web ──── HTTPS/WSS ─────────► nginx ──► Dashboard FastAPI
└──────► Mosquitto (WSS)
| Capa | Tecnología | Rol |
|---|---|---|
| Broker | Eclipse Mosquitto 2.0.12 | Enrutamiento publish/subscribe |
| Dashboard | Python FastAPI + Uvicorn | Panel de administración, API REST, WebSocket de monitoreo |
| Base de datos | SQLite | Usuarios, configuración, logs (ligera, sin dependencias) |
| TLS | nginx | Terminación SSL, proxy de WSS y HTTPS |
| Orquestación | Docker Compose | 3 servicios con watcher de recuperación automática |
El dashboard no solo administra: monitorea en tiempo real (clientes conectados, tráfico, tópicos) vía WebSocket, y un watcher supervisa y recupera servicios automáticamente.
🔌 Los 5 protocolos de conexión, explicados
Un detalle técnico que marca la diferencia: el broker expone 5 métodos de conexión en puertos dedicados, todos gestionables desde el panel (se activan/desactivan en vivo y la configuración de Mosquitto se regenera sola).
| Protocolo | Puerto | ¿Qué es? | ¿Cuándo usarlo? |
|---|---|---|---|
| TCP | 14769 |
MQTT puro sobre TCP | La base: ESP32, Raspberry Pi, sensores |
| WebSocket | 14770 |
MQTT sobre WebSocket | Navegadores y apps web |
| TLS | 14771 |
MQTT cifrado con certificado de servidor | Cuando el canal debe ir cifrado |
| mTLS | 14772 |
Autenticación mutua con certificado de cliente | Máxima seguridad, identidad verificable |
| WSS | 443 |
WebSocket seguro vía nginx | Producción para apps web |
TCP — la conexión estándar
MQTT sobre TCP es el modo más directo: el dispositivo abre el socket, autentica con usuario/contraseña y publica/suscribe por tópicos jerárquicos (casa/sala/temperatura), con comodines + (un nivel) y # (todos).
mosquitto_pub -h broker.gilman.pro -p 14769 \
-u "sensor-temperatura" -P "claveSegura123" \
-t "casa/sala/temperatura" -m "25.5" -q 1
WebSocket — MQTT para el navegador
Los navegadores no pueden abrir sockets MQTT nativos, pero sí WebSocket. El puerto 14770 expone MQTT directamente sobre WebSocket — ideal para dashboards React/Vue/Angular con Paho MQTT:
const client = new Paho.MQTT.Client("broker.gilman.pro", 14770, "web_client_1");
client.connect({
userName: "sensor-temperatura",
password: "claveSegura123",
onSuccess: () => { client.subscribe("casa/+/temperatura"); }
});
TLS — el canal cifrado
En 14771, la conexión va cifrada con el certificado del servidor firmado por la CA interna. El cliente debe confiar en la CA del broker (--cafile ca.crt):
mosquitto_pub -h broker.gilman.pro -p 14771 \
--cafile ca.crt -u "sensor-temperatura" -P "claveSegura123" \
-t "casa/sala/temperatura" -m "25.5" --tls-version tlsv1.2
mTLS — identidad verificable por dispositivo
Aquí está el salto de seguridad: autenticación mutua. No basta con saber la contraseña — el dispositivo presenta un certificado firmado por la CA interna y el broker lo valida en el handshake. Un cliente sin certificado es rechazado antes de poder hablar (lo verifiqué en pruebas: la intrusión mTLS queda bloqueada con error de TLS).
mosquitto_pub -h broker.gilman.pro -p 14772 \
--cafile ca.crt --cert sensor_temp.crt --key sensor_temp.key \
-t "casa/sala/temperatura" -m "25.5"
Cada dispositivo puede tener su propio certificado, emitido y revocado desde el panel — revocar el acceso de un dispositivo toma segundos.
WSS — WebSocket seguro para producción
wss://broker.gilman.pro/mqtt es el WebSocket cifrado terminado en nginx (Let’s Encrypt), el canal que usan las apps web en producción. Detalle técnico: el handshake requiere HTTP/1.1 (con HTTP/2 el servidor responde 502).
🛡️ Seguridad: capas, no candados sueltos
La seguridad está en capas, cada una verificable:
- Web (dashboard): JWT con cookies HttpOnly + Secure + SameSite, roles granulares (admin, editor, lector) con permisos heredados, rate limiting por IP contra fuerza bruta (HTTP 429 con cooldown, confirmado en prueba), CORS restrictivo y headers de seguridad completos (CSP, HSTS, X-Frame-Options…).
- MQTT: usuario/contraseña en todos los puertos (el acceso anónimo está desactivado — lo verifiqué: CONNACK rechaza), y mTLS con certificados por dispositivo para el acceso crítico.
- TLS: 1.2 y 1.3 en el panel (Let’s Encrypt) y cifrado en todos los protocolos expuestos.
Resultados del pentest automatizado (2026-08-12): TLS + HSTS ✅ · SQLi/XSS bloqueados ✅ · anti-enumeración de usuarios ✅ · API protegida (401/404) ✅ · sin archivos sensibles expuestos ✅ · 0 vulnerabilidades críticas. Auditoría web/API: 19/21 (90%) — los 2 casos restantes son credenciales de prueba rotadas (medida de seguridad) y el rate limit de la propia prueba.
✅ Validación: 16/16 pruebas superadas
La infraestructura MQTT se validó contra el broker en producción con un validador automatizado:
| Prueba | Resultado |
|---|---|
| Conexión TCP · WebSocket · WSS · TLS · mTLS | ✅ 5/5 |
| Comunicación cruzada (10 combinaciones entre protocolos) | ✅ 10/10 |
| Intrusión mTLS (cliente sin certificado) | ✅ Bloqueado |
| Total | 16/16 PASS |
Además, con los clientes oficiales mosquitto_pub/mosquitto_sub se hizo PUB/SUB de ida y vuelta en los 4 protocolos (TCP, TLS, mTLS, WSS): 4/4 PASS.
💻 Código por lenguaje
| Lenguaje | Librería | Puerto | Ejemplo mínimo |
|---|---|---|---|
| CLI | mosquitto_pub | 14769 | mosquitto_pub -h broker.gilman.pro -p 14769 -u user -P pass -t test -m "hola" |
| Python | paho-mqtt | 14769 | c=mqtt.Client(); c.username_pw_set('u','p'); c.connect('broker.gilman.pro',14769) |
| Node.js | mqtt.js | 14769 | mqtt.connect('mqtt://broker.gilman.pro:14769',{username:'u',password:'p'}) |
| ESP32 | PubSubClient | 14769 | client.setServer("broker.gilman.pro",14769) |
| Navegador | Paho MQTT | 14770 | new Paho.MQTT.Client("broker.gilman.pro",14770,"id") |
| WSS | paho-mqtt | 443 | wss://broker.gilman.pro/mqtt |
Tópicos recomendados: jerarquías por dominio, p. ej. casa/{habitacion}/{sensor} → casa/sala/temperatura, fabrica/{maquina}/{medicion}, vehiculo/{id}/{sensor}.
📦 Kit de pruebas descargable
Todo lo de este artículo en un solo archivo: scripts de validación (publicador_password.py, publicador_certificado.py, suscriptor_certificado.py, test_wss.py, validador_completo.py), certificados mTLS, instalador de Mosquitto para Windows y guía paso a paso en Markdown y PDF:
⬇️ Descargar kit-pruebas-mqtt.rar
cd broker
python3 publicador_password.py # TCP (14769)
python3 publicador_certificado.py # mTLS (14772)
python3 validador_completo.py # 16/16 pruebas
🎓 Conclusión
Construir un broker MQTT en producción va mucho más allá de levantar Mosquitto: es diseñar 5 caminos de conexión con su autenticación correcta, cifrar todo lo que se mueve, administrar identidades con certificados por dispositivo, monitorear en vivo y demostrar con pruebas que cada capa funciona — incluyendo que el intruso sin certificado no entra.
Y lo mejor de todo: puedes comprobarlo tú mismo. Prueba el Test-Broker con un usuario temporal, o descarga el kit y ejecuta la validación completa: Total: 16/16 pruebas superadas.
Recursos: Proyecto Broker MQTT · Proyecto Test MQTT · Kit de pruebas · Test-Broker (web)