Raspberry Pi

Instalar Mosquitto en Raspberry Pi como broker MQTT local y seguro

Instala Mosquitto en una Raspberry Pi, protégelo con contraseñas y una configuración de listeners sensata, pruébalo con mosquitto_pub y mosquitto_sub, y aprende cuándo un broker local debe hacer de puente con un broker en la nube.

Raspberry Pi ejecutando un broker Mosquitto local tras instalar Mosquitto en Raspberry Pi, conectado mediante bridge a un broker MQTT en la nube
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

Al instalar Mosquitto en una Raspberry Pi obtienes un broker MQTT rápido y ligero que sigue funcionando en tu red local aunque falle internet. En este tutorial instalarás los paquetes de Mosquitto para Raspberry Pi desde el repositorio del sistema operativo, configurarás un listener con autenticación por contraseña, lo probarás desde la línea de comandos y decidirás cuándo basta un broker local y cuándo conviene hacer de puente (bridge) con un broker en la nube. Cada archivo de configuración está completo y listo para copiar.

Cuándo tiene sentido un broker Mosquitto local

Un broker en la Pi encaja bien en algunos trabajos y mal en otros. Sé sincero sobre cuál es tu caso antes de invertir tiempo en él.

Situación Mosquitto local en la Pi Broker en la nube
Todos los dispositivos en una LAN, nada necesario en remoto Encaja bien Opcional
Debe seguir funcionando durante cortes de internet Encaja bien Combinar con un broker local
Dispositivos en varios edificios o en redes móviles Encaja mal, requiere redirección de puertos Encaja bien
Apps móviles y dashboards desde cualquier lugar Encaja mal, requiere VPN o puertos abiertos Encaja bien
Quieres que otro se encargue de TLS, autenticación y actualizaciones Encaja mal Encaja bien
Latencia muy baja entre dispositivos locales Encaja bien Añade un viaje de ida y vuelta por internet

El patrón que combina ambos es habitual en la práctica: los dispositivos hablan con un Mosquitto local en la Pi, y Mosquitto hace de puente con un broker en la nube para los topics seleccionados. Las automatizaciones locales siguen funcionando sin conexión, y la parte en la nube recibe los datos para dashboards y acceso remoto. Ahí es donde termina este tutorial. Si antes quieres repasar el papel del broker, consulta qué hace un broker MQTT.

Paso 1: instalar Mosquitto en Raspberry Pi OS

Raspberry Pi OS Bookworm incluye Mosquitto 2.0 en su repositorio, una versión suficientemente reciente para la mayoría de usos:

sudo apt update
sudo apt install -y mosquitto mosquitto-clients
sudo systemctl enable --now mosquitto
mosquitto -h | head -n 1
systemctl status mosquitto --no-pager

El paquete mosquitto-clients añade mosquitto_pub y mosquitto_sub, que usarás para las pruebas.

Tal como viene, Mosquitto 2.0 está bloqueado a propósito: sin ningún listener configurado, solo acepta conexiones desde la propia Pi (localhost) y rechaza clientes remotos anónimos. Eso sorprende a quienes siguieron guías antiguas, en las que el broker aceptaba a cualquiera en el puerto 1883. Es el valor predeterminado correcto, y el paso siguiente lo abre de forma segura.

Paso 2: crear usuarios y un archivo de contraseñas

Crea un archivo de contraseñas con un usuario por dispositivo o servicio. La opción -c crea el archivo, así que úsala solo con el primer usuario:

sudo mosquitto_passwd -c /etc/mosquitto/passwd sensors
sudo mosquitto_passwd /etc/mosquitto/passwd nodered
sudo mosquitto_passwd /etc/mosquitto/passwd dashboard

Cada comando pide una contraseña y guarda un hash con sal, no el texto plano. Restringe el archivo para que solo root y el broker puedan leerlo:

sudo chown root:mosquitto /etc/mosquitto/passwd
sudo chmod 0640 /etc/mosquitto/passwd

Las versiones recientes de Mosquitto avisan en el log cuando el archivo de contraseñas es legible por todos, y versiones futuras podrían rechazarlo, así que configura los permisos ahora.

Paso 3: configurar el listener

Deja el archivo principal /etc/mosquitto/mosquitto.conf tal como viene; incluye todos los archivos de /etc/mosquitto/conf.d/. Añade ahí tu propia configuración:

sudo nano /etc/mosquitto/conf.d/local.conf
# Local network listener with authentication
per_listener_settings true

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

# Limits that protect a small Pi
max_connections 200
max_inflight_messages 20
max_queued_messages 1000
message_size_limit 262144

# Keep the SD card happy: persistence is on by default in the main file,
# save to disk every 5 minutes rather than continuously
autosave_interval 300

Algunas notas sobre estos ajustes. per_listener_settings true permite que cada listener tenga su propia autenticación, algo que necesitarás si más adelante añades un listener WebSocket con reglas distintas. message_size_limit impide que un cliente defectuoso envíe payloads enormes a una Pi con RAM limitada. autosave_interval controla cada cuánto se escribe la base de datos de persistencia en memoria, lo que importa para el desgaste de la tarjeta SD.

Reinicia y revisa el log:

sudo systemctl restart mosquitto
sudo journalctl -u mosquitto -n 30 --no-pager

El log debería mostrar Opening ipv4 listen socket on port 1883. Si el servicio falla, la línea del log justo encima del fallo indica la opción incorrecta.

Paso 4: probar el broker local

En un terminal de la Pi, suscríbete con el usuario dashboard:

mosquitto_sub -h localhost -p 1883 -u dashboard -P 'dashboard-password' \
  -i test-sub -t 'home/#' -v

En otro terminal, o desde un portátil en la misma red usando la dirección IP de la Pi, publica como sensors:

mosquitto_pub -h 192.168.1.50 -p 1883 -u sensors -P 'sensors-password' \
  -i test-pub -t home/kitchen/temperature -m 21.6

El suscriptor imprime home/kitchen/temperature 21.6. Ahora prueba sin credenciales para confirmar que se rechaza el acceso anónimo:

mosquitto_pub -h 192.168.1.50 -p 1883 -i anon-test -t home/x -m test
# Connection error: Connection Refused: not authorised.

Para más patrones de línea de comandos, consulta los ejemplos de mosquitto_pub y mosquitto_sub.

Paso 5: listener WebSocket opcional para dashboards locales

Si un dashboard de navegador en tu LAN necesita hablar con el broker de la Pi, añade un listener WebSocket al mismo archivo:

listener 9001 0.0.0.0
protocol websockets
allow_anonymous false
password_file /etc/mosquitto/passwd

Como per_listener_settings está activado, este listener necesita sus propias líneas allow_anonymous y password_file. Un ws:// sin cifrar es aceptable en una LAN de confianza, pero no a través de internet.

Lista de refuerzo de seguridad tras instalar Mosquitto en Raspberry Pi

  1. Cambia la contraseña del usuario predeterminado de la Pi y mantén el sistema actualizado con sudo apt full-upgrade.
  2. No redirijas el puerto 1883 en tu router. Exponer a internet un broker sin cifrar invita a adivinar contraseñas y a espiar el tráfico.
  3. Usa un usuario MQTT distinto por dispositivo o servicio, para poder revocar uno sin tocar el resto.
  4. Añade una regla de firewall para que solo tu LAN llegue al broker: sudo ufw allow from 192.168.1.0/24 to any port 1883.
  5. Mueve la persistencia a un SSD o reduce las escrituras si la Pi va a funcionar durante años desde una tarjeta SD.
  6. Monitoriza la propia Pi; el publicador de estadísticas del sistema de Raspberry Pi informa del disco y la temperatura.

Para acceder al broker desde fuera, resiste la tentación de abrir puertos. Ese es un trabajo que un broker en la nube hace mejor.

Conectar el broker Mosquitto local a ConnectMQ mediante bridge

Aquí es donde se encuentran el broker local y un broker en la nube. Mosquitto tiene un bridge integrado: se conecta hacia fuera a un broker remoto como un cliente MQTT corriente y reenvía los topics que elijas. ConnectMQ es un broker MQTT en la nube, así que, desde su punto de vista, tu Pi es simplemente otro cliente que inicia sesión con el usuario, la contraseña y el client ID generados en el portal. No se necesita ninguna función de bridge especial en la parte de la nube, y no se abre ningún puerto de entrada en tu red.

Un archivo de bridge mínimo, /etc/mosquitto/conf.d/bridge-connectmq.conf, tiene este aspecto:

connection connectmq
address broker.connectmq.com:8883
bridge_capath /etc/ssl/certs
remote_clientid YOUR_CLIENT_ID
remote_username YOUR_USERNAME
remote_password YOUR_PASSWORD
bridge_protocol_version mqttv311
try_private false
cleansession false
notifications false
start_type automatic

# Local topic home/... appears in the cloud as site1/home/...
topic home/# out 1 "" site1/
# Commands from the cloud reach local devices
topic home/+/set in 1 "" site1/

Reinicia Mosquitto y el log mostrará Connecting bridge connectmq. Los mensajes publicados localmente en home/kitchen/temperature aparecen ahora también en site1/home/kitchen/temperature en ConnectMQ, donde el explorador de topics en vivo y el dashboard del portal pueden mostrarlos. Si se cae internet, los dispositivos locales siguen hablando con la Pi y, con cleansession false y QoS 1, los mensajes salientes se encolan localmente hasta que el bridge se reconecta, hasta el límite de max_queued_messages.

El broker en la nube usa un certificado de Let's Encrypt, por eso bridge_capath /etc/ssl/certs es toda la configuración TLS necesaria. try_private false es importante: impide que Mosquitto use un indicador de protocolo específico de Mosquitto que otros brokers no esperan. La explicación completa opción por opción, incluida la prevención de bucles y las pruebas, está en la guía de configuración del bridge de Mosquitto.

Si llegas a la conclusión de que solo mantienes el broker de la Pi para llegar a la nube, plantéate eliminarlo por completo y apuntar los dispositivos directamente a la nube. La guía para migrar Mosquitto a un broker en la nube cubre ese camino.

Solución de problemas

Error o síntoma Causa Solución
Connection refused desde otros equipos No hay listener en 0.0.0.0 Añade listener 1883 0.0.0.0
not authorised Usuario o contraseña incorrectos, o archivo no legible por el broker Vuelve a ejecutar mosquitto_passwd, comprueba chown root:mosquitto
El servicio falla tras editar la configuración Listener duplicado o error tipográfico Lee journalctl -u mosquitto
Los clientes se desconectan constantemente Dos clientes comparten ID Usa client ID únicos
El bridge se conecta y luego se cae Client ID o credenciales no coinciden Copia los tres valores exactamente del portal

Empieza con ConnectMQ

Conserva Mosquitto para el tráfico local rápido y deja que un broker MQTT gestionado se encargue de todo lo que cruza internet. Crea un broker Serverless gratuito en app.connectmq.com, sin tarjeta de crédito, copia las credenciales generadas en tu archivo de bridge y observa cómo aparecen tus topics locales en el portal. Más proyectos con la Pi en el tutorial de MQTT con Raspberry Pi.

Preguntas frecuentes

¿Por qué Mosquitto rechaza conexiones de otros dispositivos tras la instalación?

Mosquitto 2.0 solo escucha en localhost y rechaza clientes anónimos a menos que configures un listener. Añade listener 1883 0.0.0.0 con allow_anonymous false y un archivo de contraseñas.

¿Debo exponer a internet el broker Mosquitto de mi Raspberry Pi?

No se recomienda. En su lugar, haz un bridge saliente hacia un broker en la nube, para que el acceso remoto pase por un servicio protegido con TLS y tu router mantenga cerrados todos los puertos de entrada.

¿Puede Mosquitto en una Raspberry Pi gestionar muchos dispositivos?

Para un hogar o un sitio pequeño, una Pi maneja con facilidad el tráfico típico de sensores. Los primeros límites que encuentras suelen ser el desgaste de la tarjeta SD y el esfuerzo de mantenimiento, más que el rendimiento bruto.

¿Necesita el bridge una cuenta especial en ConnectMQ?

No. El bridge es un cliente MQTT normal, así que usa el mismo usuario, contraseña y client ID que el portal genera para cualquier dispositivo.

Artículos relacionados

Fiabilidad de la Raspberry Pi: cómo usar una Pi 24/7 como gateway IoT

Una guía práctica para mantener un gateway MQTT con Raspberry Pi funcionando durante meses: desgaste del almacenamiento, sistemas de archivos de solo lectura, alimentación, refrigeración, watchdogs de hardware y software y monitorización remota de la salud.

9 min de lectura

Pico W vs Pico 2 W para MQTT: rendimiento, memoria y TLS de RP2040 frente a RP2350

La Pico 2 W mantiene el formato y el chip Wi-Fi de la Pico W, pero sustituye el RP2040 por el RP2350, más rápido. Esta comparativa analiza qué significa para los dispositivos MQTT: CPU, memoria, TLS, funciones de seguridad, soporte de software y qué placa comprar para cada proyecto.

9 min de lectura

Registro de accesos Raspberry Pi RFID MQTT con el lector RC522

Conecta un lector RFID RC522 a una Raspberry Pi, lee etiquetas en Python, compáralas con una lista blanca local y publica cada intento de acceso como un evento MQTT que pueden consumir registradores, dashboards y herramientas de alertas.

8 min de lectura

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.