Подключение к mqtt-порту

Добрый день.
Установил защиту согласно инструкции
Однако, необходим доступ к чтению и записи к топикам.
На 2 шаге инструкции мы закрываем доступ к websocket- и mqtt-порту, изменяя содержимое файла /mnt/data/etc/mosquitto/conf.d/listeners.conf
#change 0.0.0.0 to to limit listener to localhost

listener 1883 127.0.0.1
#listener 1883 0.0.0.0

# example:
#listener 1883 0.0.0.0


#change 0.0.0.0 to 127.0.0.1 to limit listener to localhost

listener 18883 127.0.0.1
#listener 18883 0.0.0.0
protocol websockets

После закрытия, очевидно, не получится подписаться на топики: (взял для примера /devices/wb-adc/controls/Vin)


В mosquitto_sub можно указать имя пользователя и пароль для подключения, где их нужно создать?
Второй вопрос, в протоколе MQTT существует защищенное SSL-подключение, для которого используется порт 8883. Как его настроить? И в чем будет принципиальная разница от подключения с логином и паролем по порту 1883?

Добрый день!
Если вы не используете TLS как транспортный уровень, то логин-пароль передаются по сети просто текстом, что не очень безопасно.
Как включить TLS на брокере:
http://www.steves-internet-guide.com/mosquitto-tls/
Как использовать mosquitto_sub с TLS:


Как добавить защиту логином и паролем:
http://www.steves-internet-guide.com/mqtt-username-password-example/

Начал с добавления логина и пароля.

Но что-то пошло не так.

  1. На компьютере в mosquitto сделал файл с логином “user” и паролем
    image
    Создался файл passwordfile:
    user:$6$xSei+vfRibHo3sRF$+9cm8u1z6B/UaGnd0grgQqR+sLoLjTHzSZ2eqEpcw1QjP2T7OdhjohC/Tz0cj+ka4krIuA8Xqd/E2CplPIYSog==

  2. Зашел в /etc/mosquitto/mosquitto.conf
    В нем содержится:

    # Place your local configuration in /etc/mosquitto/conf.d/
    #
    # A full description of the configuration file is at
    # /usr/share/doc/mosquitto/examples/mosquitto.conf.example

    pid_file /var/run/mosquitto.pid

    persistence true
    persistence_location /var/lib/mosquitto/

    log_dest file /var/log/mosquitto/mosquitto.log

    include_dir /etc/mosquitto/conf.d

К сожалению подробного описание по адресу /usr/share/doc/mosquitto/examples/mosquitto.conf.example нет.
3. В файле /etc/mosquitto/conf.d/auth.conf, который лежит /mnt/data/etc/mosquitto/conf.d/auth.conf содержится:

acl_file /etc/mosquitto/acl.conf
password_file /etc/mosquitto/passwd.conf

allow_anonymous true
allow_anonymous_localhost true

Я в нем заменил allow_anonymous false
4. В файлы
/mnt/data/etc/mosquitto/acl.conf
/mnt/data/etc/mosquitto/passwd.conf
Которые по умолчанию пустые записал соответственно
user - в первый файл
user:$6$xSei+vfRibHo3sRF$+9cm8u1z6B/UaGnd0grgQqR+sLoLjTHzSZ2eqEpcw1QjP2T7OdhjohC/Tz0cj+ka4krIuA8Xqd/E2CplPIYSog== - во второй
5. Перезапустил в контроллере службу командой service mosquitto restart

После этого контроллер начал перезагружаться с периодичностью в 3-5 минут. В момент между перезагрузками стер содержимое файлов из 4 пункта. И перезагрузка прекратилась.
Подскажите, что сделано не так? Как правильно поставить логин и пароль?

Пробовал по другой инструкции установить логин и пароль, но безуспешно:
Открываем файл настроек
sudo nano /etc/mosquitto/mosquitto.conf
и заменяем его содержимое на следующее:
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

pid_file /var/run/mosquitto.pid
 
persistence true
persistence_location /var/lib/mosquitto/
 
log_dest topic
 
log_type error
log_type warning
log_type notice
log_type information
 
connection_messages true
log_timestamp true
 
include_dir /etc/mosquitto/conf.d

Добавил логин и пароль:
mosquitto_passwd -c /etc/mosquitto/passwd majordomo
nano /etc/mosquitto/conf.d/default.conf
В пустом файле вписываю:
allow_anonymous false
password_file /etc/mosquitto/passwd
Перезагружаю MQTT сервер
sudo systemctl restart mosquitto
В результате


После чего контроллер начинает перезагружаться как и в предыдущем сценарии.
Как исправить или что делаю не так?

Перезагружается контроллер, скорее всего, из-за https://wirenboard.com/wiki/index.php/Watchdog, его можно отключить.
А фундаментальная причина глубже, и, видимо, такая: наши внутренние сервисы, например, wb-mqtt-serial, который опрашивает Modbus-устройства и передаёт значения с них в MQTT, тоже пытаются подключиться к брокеру - а он запаролен. При этом в том же wb-mqtt-serial пароль никак не задать, насколько я знаю.
Поэтому нужно подумать, как сделать так, чтобы локальные сервисы работали с брокером без пароля, а внешние подключения - с паролем.
Я пока придумал только обходной манёвр:

  • поднять ещё один брокер, уже с паролем,
  • на брокере Wiren Board разрешить только локальные подключения (но без пароля),
  • настроить бридж между брокерами.

Вот бы такая возможность была в mosquitto по-умолчанию, очевидная же фича
Ох, стоп! Давайте всё-же посмотрим маны на москито :wink:
В терминале наберём
nano /etc/mosquitto/conf.d/auth.conf
а затем поменяем содержимое на

acl_file /etc/mosquitto/acl.conf
password_file /etc/mosquitto/passwd.conf

allow_anonymous false
allow_anonymous_localhost true

Допустим.

  1. Как правильно поднять второй брокер?
    Один mosquitto уже установлен
  2. Чтоб на WB были только локальные подключения достаточно ли прописать следующее в /mnt/data/etc/mosquitto/conf.d/listeners.conf

#change 0.0.0.0 to to limit listener to localhost

listener 1883 127.0.0.1

example:

#listener 1883 0.0.0.0

#change 0.0.0.0 to 127.0.0.1 to limit listener to localhost

listener 18883 127.0.0.1
protocol websockets

  1. Как правильно пробросить мост между ними?
    На сайте инструкция проброса между контроллером и облаком.

Да не надо вам поднимать второй брокер!
Я чуть выше написал, вам надо в конфиге auth.conf добавить allow_anonymous_localhost true

В этом файле уже была это строчка
image
Менял только allow_anonymous false

Всё, после этого у вас всё будет в порядке и для локалхоста безпарольное подключение будет доступно.
Посмотрел вашу тему с самого начала. Абсолютно очевидно, что проблема в том, что у вас не стартует сам брокер. При чём тут “mqtt-serial” и локалхост я не знаю.

  1. service watchdog stop - останавливаем watchdog чтоб вайронсброд не перезагружался (я хз почему этого способа нет в вики)
  2. nano /etc/mosquitto/passwd.conf пишете туда пользователь:пароль
  3. mosquitto_passwd -U /etc/mosquitto/passwd.conf - генерим хэш на указанный пароль, начиная с этого этапа пароль будет напоминать кракозябры.
  4. service mosquitto restart
  5. смотрим что всё поднялось.
  6. только после этого service watchdog start

Отлично! Спасибо за помощь

Кстати, переписал статью про watchdog: https://wirenboard.com/wiki/index.php?title=Watchdog
Если к ней остались замечания, пишите.

Да, так лучше. Но единственное что я бы добавил “напишите service watchdog start для того, чтобы запустить его обратно.” Оно вроде как и очевидно, а вроде как инструкции пишутся в том числе для тех, кто не может в очевидное :slight_smile:

Здравствуйте.
Произвел действия как в первом посте. Так же проделал операции как рекомендовал PavelSolovev

Собственно вопрос так у меня и остался. Через браузер webUI вижу, все отображается, управлять могу.
А вот в приложении на смартфоне ввожу ip, port, login, passwd - а соединения нет.
Разжуйте, пожалуйста, еще раз как сделать возможным подключение к порту 18883 с приложения.

P.S. IP выделенный, проброс на порт 18883 настроен, внешний порт для доступа к 18883 пингуется и видно что открыт.
Спасибо.

Добрый день. Получилось настроить? Судя по описанию у меня точно такая же проблема

Здравствуйте.
У меня все заработало.

в /etc/mosquitto/conf.d/auth.conf

allow_anonymous false
allow_anonymous_localhost true

@PavelSolovev а подскажите, пожалуйста, в каких манах вы нашли опцию allow_anonymous_localhost ?) Гугл выдает только два результата: эта страница и вики WB (скорее всего поправленная после этого обсуждения). Даже в исходниках mosquitto ничего похожего не нашел🤔
Оно, работает, но совершенно непонятно каким образом.

на mosquitto.conf man page | Eclipse Mosquitto
В “General Options”
описание allow_anonymous

ага, этот я видел, спасибо. мне интересен именно allow_anonymous_localhost . откуда берется этот суффикс _localhost и почему с ним все начинает работать как надо?:sweat_smile: