Гид по технологиям

Настройка защищённого Mosquitto (MQTT) на Ubuntu 20.04

• 7 min read • DevOps • Обновлено 18 Nov 2025
Mosquitto (MQTT) с SSL на Ubuntu 20.04
Mosquitto (MQTT) с SSL на 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).

Логотип Mosquitto и схема связи MQTT

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

HiveMQ Websockets Client

ALT: Окно браузерного клиента HiveMQ Websocket c полями для подключения (хост, порт, логин, SSL)

Нажмите Connect, опубликуйте сообщение в home/lights/kitchen — оно должно появиться в терминале подписчика.

Mosquitto Websocket Publish

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 вручную.

Мини‑методология развёртывания (пошагово)

  1. Установить Mosquitto и убедиться в работе сервиса.
  2. Настроить password_file и проверить аутентификацию.
  3. Настроить тестовые подписчики/публикаторы.
  4. Получить сертификат Let’s Encrypt и разместить в /etc/mosquitto/certs.
  5. Настроить listener 8883 и перезапустить Mosquitto.
  6. Добавить скрипт в renewal-hooks/deploy и проверить certbot renew --dry-run.
  7. Включить WebSocket (если нужен) и протестировать клиент в браузере.
  8. Настроить 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/логов.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро