Настройка защищённого Mosquitto (MQTT) на Ubuntu 20.04
Коротко о MQTT и Mosquitto
MQTT — это лёгкий протокол обмена сообщениями, созданный для устройств Интернета вещей (IoT). Он использует модель публикация/подписка: клиенты публикуют сообщения на «топики», брокер (например, Mosquitto) пересылает их подписчикам. Mosquitto — свободный брокер MQTT с низким потреблением ресурсов.
Кратко:
- MQTT — транспорт для лёгких сообщений между устройствами.
- Mosquitto — реализация брокера MQTT.
- MQTTS — MQTT поверх TLS/SSL (обычно порт 8883).
Важно: все команды в примерах выполняются в Ubuntu 20.04 от имени пользователя с sudo-привилегиями.
Содержание
- Требования
- Установка Mosquitto
- Аутентификация паролем
- Тест клиентами
- Установка SSL (Let’s Encrypt)
- Конфигурация Mosquitto для SSL
- Автообновление сертификатов и развёртывание в Mosquitto
- WebSocket-доступ для браузеров
- Проверка, отладка, и рекомендации по безопасности
- Чек‑листы и роли
- Краткое резюме
Требования
- Сервер с Ubuntu 20.04 и пользователь с sudo-привилегиями.
- Домен, указывающий на сервер (например, mqtt.example.com).

ALT: Схематическая диаграмма связи MQTT: клиенты публикуют и подписываются через брокер Mosquitto
Шаг 1 — Установка сервера и клиента Mosquitto
Ubuntu поставляется с более старой версией Mosquitto (1.6). Чтобы установить актуальную версию, добавьте официальный PPA и установите пакеты.
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppaУстановите сервер и клиентские утилиты:
$ sudo apt install mosquitto mosquitto-clientsПроверьте статус службы:
$ sudo systemctl status mosquitto
? mosquitto.service - Mosquitto MQTT Broker
Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-01-25 09:18:40 UTC; 25s ago
Docs: man:mosquitto.conf(5)
man:mosquitto(8)
Main PID: 119694 (mosquitto)
Tasks: 1 (limit: 2274)
Memory: 1.0M
CGroup: /system.slice/mosquitto.service
??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
Jan 25 09:18:39 systemd[1]: Starting Mosquitto MQTT Broker...
Jan 25 09:18:40 systemd[1]: Started Mosquitto MQTT Broker. Если служба не запущена, включите её и проверьте логи: sudo systemctl enable --now mosquitto и sudo journalctl -u mosquitto -f.
Шаг 2 — Настройка аутентификации паролем
Mosquitto имеет утилиту для генерации файла паролей — mosquitto_passwd. Конфигурация хранится в /etc/mosquitto.
Создайте зашифрованный файл паролей /etc/mosquitto/passwd и добавьте пользователя username:
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd username
Password:
Reenter password:Создайте конфигурационный файл /etc/mosquitto/conf.d/default.conf и укажите расположение файла паролей. Если не указать слушатель (listener), соединения по умолчанию будут анонимными, даже при наличии файла паролей.
$ sudo nano /etc/mosquitto/conf.d/default.confДобавьте:
listener 1883
password_file /etc/mosquitto/passwdСохраните файл, затем перезапустите Mosquitto:
$ sudo systemctl restart mosquittoВажно: порт 1883 — стандартный небезопасный порт MQTT. Для защищённого соединения используйте порт 8883 (MQTTS).
Шаг 3 — Тестирование клиента Mosquitto
Клиент может быть подписчиком (subscriber) или издателем (publisher).
Подпишитесь на топик (в примере — home/lights/kitchen):
$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"Откройте новое окно терминала и опубликуйте сообщение:
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"В первом терминале вы увидите payload:
ONОтправьте OFF из второго терминала:
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"Получите в первом терминале:
ON
OFFЕсли вы попытаетесь подключиться без учётных данных, получите ошибку:
$ mosquitto_sub -t "home/lights/sitting_room"
Connection error: Connection Refused: not authorised.Если нужно разрешить анонимные соединения (не рекомендуется), добавьте в /etc/mosquitto/conf.d/default.conf:
allow_anonymous trueПримечание: использование allow_anonymous true делает брокер доступным без пароля — только в доверенной сети и с дополнительными мерами безопасности.
Шаг 4 — Установка SSL (Let’s Encrypt)
Чтобы включить TLS, используйте Certbot от Let’s Encrypt. Установим Certbot через snapd.
$ sudo apt install snapd
$ sudo snap install core
$ sudo snap refresh core
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbotСгенерируйте сертификат (замените email и домен):
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d mqtt.example.comСертификаты появятся в /etc/letsencrypt/live/mqtt.example.com.
Сгенерируйте параметры Diffie–Hellman (dhparam):
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048Создайте веб-корень для автоматического обновления:
$ sudo mkdir -p /var/lib/letsencryptДобавьте ежедневную задачу для проверки и обновления сертификата (файл /etc/cron.daily/certbot-renew):
$ sudo nano /etc/cron.daily/certbot-renewВставьте:
#!/bin/sh
certbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/Сделайте скрипт исполняемым:
$ sudo chmod +x /etc/cron.daily/certbot-renewВажно: certbot обычно настраивает собственные хуки и systemd таймеры; ваш файл в cron.daily — один из вариантов. Всегда проверяйте certbot renew --dry-run после настройки.
Шаг 5 — Конфигурация Mosquitto для SSL
Скопируйте сгенерированные сертификаты в каталог, доступный Mosquitto:
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey.pem /etc/mosquitto/certs/server.keyУстановите владельца каталога на пользователя mosquitto:
$ sudo chown mosquitto: /etc/mosquitto/certsОткройте /etc/mosquitto/conf.d/default.conf и добавьте блок для зашифрованного слушателя:
. . .
listener 8883
certfile /etc/mosquitto/certs/server.pem
cafile /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pemЭтот блок настраивает MQTTS на порту 8883. Сохраните файл и перезапустите Mosquitto:
$ sudo systemctl restart mosquittoОткройте порт в фаерволе:
$ sudo ufw allow 8883Тест публикации через TLS (обратите внимание на указание полного имени хоста и --capath):
$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORDЗамечание: для TLS-клиентов важно использовать имя хоста, совпадающее с сертификатом (mqtt.example.com), иначе проверка хоста провалится.
Шаг 6 — Автообновление сертификатов и развёртывание в Mosquitto
Certbot автоматически обновляет сертификаты, но нужно скопировать новые файлы в /etc/mosquitto/certs и перезапустить или перезагрузить Mosquitto.
Создайте скрипт deploy-хука Certbot /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh:
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.shВставьте (замените домен при необходимости):
# Set which domain this script will be run for
MY_DOMAIN=mqtt.example.com
# Set the directory that the certificates will be copied to.
CERTIFICATE_DIR=/etc/mosquitto/certs
if [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; then
# Copy new certificate to Mosquitto directory
cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem
cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key
# Set ownership to Mosquitto
chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key
# Ensure permissions are restrictive
chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key
# Tell Mosquitto to reload certificates and configuration
pkill -HUP -x mosquitto
fiСделайте скрипт исполняемым:
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.shЕсли у вас есть веб‑сервер (например, nginx), который использует порт 80, добавьте pre_hook/post_hook в файл /etc/letsencrypt/renewal/mqtt.example.com.conf чтобы останавливать/запускать веб‑сервер на время валидации:
pre_hook = systemctl stop nginx
post_hook = systemctl start nginxПроверьте сухим запуском:
$ sudo certbot renew --dry-runЕсли ошибок нет — автоматическое обновление и развёртывание настроены.
Шаг 7 — Включение WebSocket для браузеров
Чтобы использовать MQTT из браузера (через WebSocket), добавьте слушатель с протоколом websockets в конфигурацию Mosquitto:
$ sudo nano /etc/mosquitto/conf.d/default.confДобавьте блок:
. . .
listener 8083
protocol websockets
certfile /etc/mosquitto/certs/server.pem
cafile /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pemПерезапустите Mosquitto и откройте порт 8083:
$ sudo systemctl restart mosquitto
$ sudo ufw allow 8083Для теста используйте браузерный WebSocket-клиент (например, HiveMQ Websocket client). Заполните поля:
- Host: mqtt.example.com
- Port: 8083
- Username / Password: ваши учётные данные
- Включите SSL

ALT: Окно браузерного клиента HiveMQ Websocket c полями для подключения (хост, порт, логин, SSL)
Нажмите Connect, опубликуйте сообщение в home/lights/kitchen — оно должно появиться в терминале подписчика.

ALT: Скриншот публикации сообщения через WebSocket в UI клиента и подтверждение получения в терминале
Проверка и отладка
Основные проверки:
- Служба Mosquitto активна:
sudo systemctl status mosquitto. - Логи Mosquitto:
sudo journalctl -u mosquitto -f. - Файлы сертификатов доступны пользователю mosquitto и имеют права 600.
- Подключение по TLS:
mosquitto_pub -h mqtt.example.com -p 8883 --capath /etc/ssl/certs/ -u username -P password -t test -m hi. - WebSocket: используйте браузерный клиент и убедитесь, что порт 8083 открыт.
Типичные ошибки и как их решать:
- “Connection Refused: not authorised.” — проверьте
password_fileи правильность имени/пароля. - “certificate verify failed” — убедитесь, что клиент использует имя хоста, совпадающее с CN/SAN сертификата, и что root CA присутствует в системе или указан
--capath. - Проблемы при автообновлении — проверьте права на скрипты в
renewal-hooksи выполнениеcertbot renew --dry-run.
Рекомендации по безопасности
- Всегда используйте TLS (порт 8883) для публичных инсталляций.
- Храните приватные ключи с правами 600 и владельцем
mosquitto. - Отключайте
allow_anonymousв публичной сети. - Ограничьте доступ в фаерволе: разрешите порты только с доверенных адресов, если возможно.
- Рассмотрите использование ACL-файла Mosquitto для ограничения доступа к топикам.
Пример простого ACL (файл /etc/mosquitto/acl):
# Разрешить пользователю 'sensor' публиковать в топики sensor/...
user sensor
topic write sensor/#
# Разрешить пользователю 'viewer' только читать
user viewer
topic read #И подключите его в конфигурации:
acl_file /etc/mosquitto/aclЧек‑листы и роли (кто что делает)
Администратор (DevOps):
- Настроить сервер и PPA.
- Установить mosquitto и certbot.
- Настроить автоматическое обновление сертификатов.
- Настроить фаервол и мониторинг.
Инженер безопасности:
- Проверить права на ключи и сертификаты.
- Настроить ACL и аудит логов.
- Запланировать периодический аудит сертификатов.
Разработчик/Интегратор IoT:
- Тестировать публикацию/подписку на нужные топики.
- Проверить WebSocket-клиент в браузере.
- Убедиться, что приложения используют полное имя хоста в TLS.
Типовые сценарии отказа и обходные пути
Когда TLS не нужен (внутренняя и изолированная сеть): можно оставить связи без TLS, но следует ограничить сеть фаерволом и использовать ACL. Для разработки можно временно включить allow_anonymous true на локальной машине только для тестов.
Когда Let’s Encrypt недоступен (у вас нет публичного 80/443): используйте корпоративный CA или самоподписанные сертификаты, но тогда клиенты должны доверять CA вручную.
Мини‑методология развёртывания (пошагово)
- Установить Mosquitto и убедиться в работе сервиса.
- Настроить
password_fileи проверить аутентификацию. - Настроить тестовые подписчики/публикаторы.
- Получить сертификат Let’s Encrypt и разместить в
/etc/mosquitto/certs. - Настроить
listener 8883и перезапустить Mosquitto. - Добавить скрипт в
renewal-hooks/deployи проверитьcertbot renew --dry-run. - Включить WebSocket (если нужен) и протестировать клиент в браузере.
- Настроить ACL и фаервол.
Критерии приёмки
- Mosquitto работает и слушает на портах 1883, 8883 (и 8083 при WebSocket).
- Подписчик получает сообщения от издателя через TLS.
- Certbot успешно проходит dry-run и deploy-хук копирует сертификаты в каталог Mosquitto.
- Права на ключи обеспечены:
-rw------- mosquitto:mosquitto.
Краткий глоссарий (1‑строчные определения)
- Брокер: сервер, пересылающий сообщения от издателей подписчикам.
- Топик: строка, по которой фильтруются сообщения в MQTT.
- MQTTS: MQTT поверх TLS/SSL (обычно порт 8883).
- WebSocket: протокол, позволяющий браузеру поддерживать двунаправленное соединение.
Быстрая галерея ошибок (Edge‑cases)
- Certbot не может получить challange: проверьте, что порт 80 открыт и домен указывает на сервер.
pkill -HUP -x mosquittoне перезагружает процессы: используйтеsystemctl reload mosquittoилиsystemctl restart mosquittoесли нужен перезапуск.- Несовпадение имени хоста: клиент будет отклонять соединение при проверке CN/SAN.
Заключение
Мы прошли через установку Mosquitto, включили аутентификацию паролем, защитили соединения TLS с помощью Let’s Encrypt, настроили автоматическую замену сертификатов и организовали доступ из браузера через WebSocket. Следуйте чек‑листам и рекомендациям по безопасности для надёжной и масштабируемой работы брокера.
Важно: для продакшена дополнительно настройте мониторинг, бэкапы конфигурации и регулярный аудит ACL/логов.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента