Настройка MQTT-брокера Mosquitto на OpenWrt

Установка оказалась довольно простой, а вот после неё я словил небольшую проблему с правами доступа к файлу паролей. Поэтому оставлю здесь заметку, вдруг кому-то тоже пригодится.

Обновляем список пакетов и ставим брокер

opkg update opkg install mosquitto-ssl

Открываем файл конфигурации:

nano /etc/mosquitto/mosquitto.conf

Добавляем ниже нужные параметры:

# Слушать на всех интерфейсах listener 1978 # Путь к файлу с паролями password_file /etc/mosquitto/passwd # Запретить анонимные подключения allow_anonymous false # Логирование в syslog log_dest syslog # Отключаем $SYS-топики sys_interval 0

Создаём файл с паролем и пользователем, в моём случае имя пользователя esp:

mosquitto_passwd -c /etc/mosquitto/passwd esp

Система попросит ввести и подтвердить пароль. После этого в файле появится строка вида esp:$6$... - это хеш пароля.

Важно: -c создаёт файл заново. Если добавляете нового пользователя в существующий файл - используйте mosquitto_passwd без -c.

Запускаем брокер:

/etc/init.d/mosquitto enable /etc/init.d/mosquitto start

Пробуем подключиться - и..... ничего не происходит. Надо бы понять почему. Пойдем посмотрим логи:

logread | grep mosquitto

И видим:

Error: Unable to open pwfile "/etc/mosquitto/passwd". Error opening password file "/etc/mosquitto/passwd".

Смотрим права на файлы:

ls -la /etc/mosquitto/
-rw------- 1 root root 40859 mosquitto.conf -rw------- 1 root root 117 passwd

Файлы принадлежат root:root с правами 600

А теперь смотрим, под кем реально работает брокер:

ps | grep mosquitto
13923 mosquitt 6528 S mosquitto -c /etc/mosquitto/mosquitto.conf

Пользователь - mosquitt (усечённое mosquitto до 8 символов), а не root.

Вот в чём причина. Демон работает не от root, а под отдельным пользователем, и физически не может прочитать файлы, принадлежащие root с правами 600. Отсюда и ошибка.

Проверяем, что группа существует:

cat /etc/group | grep mosquitto
mosquitto:x:200:mosquitto

Группа на месте. Значит, просто меняем владельца файлов и права

chmod 640 /etc/mosquitto/mosquitto.conf chmod 600 /etc/mosquitto/passwd chown mosquitto:mosquitto /etc/mosquitto/passwd chown mosquitto:mosquitto /etc/mosquitto/mosquitto.conf

Перезапускаем:

/etc/init.d/mosquitto restart

Проверяем логи:

logread | grep mosquitto | tail -30

Теперь видим долгожданное:

mosquitto version 2.0.18 starting Config loaded from /etc/mosquitto/mosquitto.conf. Opening ipv4 listen socket on port 1978. Opening ipv6 listen socket on port 1978. mosquitto version 2.0.18 running

Брокер запустился и слушает порт 1978.

Да, я знаю, что выставлять MQTT-порт напрямую наружу не самый безопасный вариант, но у меня там некритичная инфраструктура, поэтому мне такой вариант подходит.

Порт 1978 нужно открыть. Через LuCI: Network → Firewall → Traffic Rules, либо вручную в /etc/config/firewall:

config rule option name 'Allow-MQTT-WAN' option src 'wan' option proto 'tcp' option dest_port '1978' option target 'ACCEPT'

Затем нужно перезапустить firewall

/etc/init.d/firewall restart

Теперь при наличии DDNS или белого IP адреса на роутере - можно подключиться к mqtt брокеру из любой точки планеты =)

Статья основана на реальном разборе конфигурации Mosquitto 2.0.18 на OpenWrt. Все команды проверены =)

11
11