Подключение к 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 Like

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

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

  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 Like

Допустим.

  1. Как правильно поднять второй брокер?
    Один mosquitto уже установлен
    image
  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
4 Likes

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

1 Like

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

2 Likes

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

1 Like

Здравствуйте.
Произвел действия как в первом посте. Так же проделал операции как рекомендовал 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:

1 сообщение было перенесено в новую тему: Смена пароля MQTT