Categories
ESP8266 NodeMCU

Как да инсталираме Mosquitto MQTT брокер (сървър)

MQTT е протокол за съобщения „от машина – до машина“. Създаден да бъде връзката между устройства от „Интернет на Нещата“. Изключително лек е. Основните му методи са „публикуване“ и „абониране“.

Ще покажа стъпките за инсталиране Mosquitto MQTT сървър на VPS с операционна система Debian 10, като стъпките при Ubuntu са идентични.

Стъпка 1 — Инсталиране на Mosquitto

Първо да се свържем с нашата машина използвайки не-root потребител, който има sudo права и да обновим списъка с пакетите използвайки apt update:

$ sudo apt update

Сега да инсталираме Mosquitto услуга и Mosquitto клиент използвайки apt install:

$ sudo apt install mosquitto mosquitto-clients

По подразбиране Debian ще стартира Mosquitto услугата след инсталиране. Нека да тестваме конфигурацията по подразбиране. Ще използваме Mosquitto клиентът, който току-що инсталирахме за да се абонираме (subscribe) за тема (topic) на нашият брокер.

Темите (topics) са етикети, които може да използвате за да публикувате (publish) съобщения (messages) или съответно с тях да се абонирате (subscribe) за да получавате съобщения (messages). В началото нещата звучат много по-сложно от колкото са наистина.

Нека отворим два терминала един до друг и в единия да се абонираме за тема test с:

$ mosquitto_sub -h localhost -t test

-h се използва за да укажем име на хост на MQTT сървъра, а -t за да укажем името на темата. Вие няма да видите резултат след като натиснете ENTER защото mosquitto_sub ще чака да пристигне съобщение. Сега в другия прозорец нека публикуваме съобщение:

$ mosquitto_pub -h localhost -t test -m "hello world"

Опцийте на mosquitto_pub са същите, като на mosquitto_sub, но този път използваме една допълнителна опция -m за да укажем нашето съобщение. Да натиснем ENTER и би трябвало да видим hello world да се появява на другия терминален прозорец. Ние изпратихме нашето първо MQTT съобщение!

Да натиснем CTRL+C в изчакващият прозорец за да излезем от mosquitto_sub, но нека не затваряме прозореца. Той ще ни е нужен на по-късен етап.

По подразбиране всеки с достъп до нашият хост може да се абонира и да получава съобщения. За да ограничим тази възможност е нужно да създадем потребители.

Стъпка 2 — Конфигуриране на MQTT потребители

Mosquitto има команда за създаване на потребители наречен mosquitto_passwd. Информацията за потребители се записва в /etc/mosquitto/passwd. Нека създадем потребител techpotwin. След като натиснем ENTER ще бъдем попитани за парола. Аз ще въведа techpotpass.

$ sudo mosquitto_passwd -c /etc/mosquitto/passwd techpotwin

Сега ще отворим настройките и ще задължим Mosquitto да изисква потребители с пароли.

$ sudo nano /etc/mosquitto/conf.d/default.conf

Тази команда би трябвало да отвори празен файл. Сега трябва да поставим:

allow_anonymous false
password_file /etc/mosquitto/passwd

allow_anonymous false ще забрани анонимните връзки, а password_file посочва къде се намира файлът с информация за потребителите и паролите.

Записваме (CTRL+O, ENTER) и излизаме (CTRL+X).

Сега трябва да рестартираме Mosquitto

$ sudo service mosquitto restart

Опитайте да публикувате съобщение без парола:

$ mosquitto_pub -h localhost -t "test" -m "hello world"

Ще получите съобщение за грешка:

Connection Refused: not authorised.
Error: The connection was refused.

Преди да опитаме да изпратим съобщение използвайки име и парола нека първо се абонираме в другия прозорец.

$ mosquitto_sub -h localhost -t test -u "techpotwin" -P "techpotpass"

Сега нека публикуваме съобщение използвайки парола:

$ mosquitto_pub -h localhost -t "test" -m "hello world" -u "techpotwin" -P "techpotpass"

Резултатът трябва да бъде сходен със стъпка 1.

Стъпка 3 – Конфигуриране на MQTT SSL

За да разрешим SSL трябва да укажем пътя към нашите сертификати. Нека отново отворим файлът с настройките:

$ sudo nano /etc/mosquitto/conf.d/default.conf

Сега да добавим няколко реда към края:

listener 1883 localhost
listener 8883
certfile /etc/letsencrypt/live/techpot.w-lab.win/cert.pem
cafile /etc/letsencrypt/live/techpot.w-lab.win/chain.pem
keyfile /etc/letsencrypt/live/techpot.w-lab.win/privkey.pem

Ние добавяме два отделни слушател (listener) блока към конфигурацията. Първият, некриптиран, listener 1883 localhost, към който се свързвахме до момента го ограничаваме така, че да не може да бъде достъпен извън нашата виртуална машина добавяйки localhost.

listener 8883 разрешава слушател (listener) на порт 8883. Това е стандартният порт за MQTT + SSL, често описан като MQTTS. Следват три линии certfile, cafile и keyfile, които посочват пътищата към нашите сертификати.

Записваме (CTRL+O, ENTER) и излизаме (CTRL+X).

$ sudo service mosquitto restart

Ако използвате firewall ще се наложи да разрешите порт 8883.

$ sudo ufw allow 8883

Сега нека изпробваме mosquitto_pub използвайки SSL:

$ mosquitto_pub -h techpot.w-lab.win -t "test" -m "hello world" -p 8883 --capath /etc/ssl/certs/ -u "techpotwin" -P "techpotpass"

Ако имаме cron, който да обновява нашите сертификати ежемесечно ще е нужно да добавим команда за рестарт на mosquitto услугата след обновяване на сертификата. За целта извикваме:

$ sudo crontab -e

Намираме реда:

23 23 * * 5 certbot renew --noninteractive --post-hook "service nginx restart"

и го променяме на

23 23 * * 5 certbot renew --noninteractive --post-hook "service nginx restart" --post-hook "service mosquitto restart"

Записваме (CTRL+O, ENTER) и излизаме (CTRL+X).

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *