Instalacja i konfiguracja Mosquitto na Raspberry Pi

MQTT to jeden z protokołów wykorzystywanych w rozwiązaniach IoT / inteligentnych domach. Wspominałem już, dlaczego zdecydowałem się nim zainteresować oraz jakie są jego zalety i wady. Dzisiaj pora na krótki wpis na temat instalacji i podstawowej konfiguracji serwera (brokera) MQTT.

Instalacja

Instalacja pakietów w Linuksie, włączając w to Raspberry Pi OS (bo tak się teraz nazywa Raspbian) jest banalnie prosta. Wystarczy z poziomu terminala wydać komendę:

sudo apt install mosquitto -y

Menadżer pakietów powinien połączyć się z repozytorium, ściągnąć odpowiedni pakiet i go zainstalować. To wszystko.

Konfiguracja Mosquitto

W następnej kolejności zawsze powinniśmy zajrzeć do plików konfiguracyjnych, zlokalizowanych w katalogu /etc/mosquitto, przy czym najbardziej interesuje nas mosquitto.conf. Jeżeli nie zmodyfikujemy nic w konfiguracji, to nasz broker MQTT będzie nasłuchiwał połączeń na standardowym porcie 1883, a do połączenia nie będzie wymagał haseł. Przynajmniej takie jest domyślne zachowanie w obecnych wersjach programu.

Właściwie domyślna konfiguracja jest wystarczająca, żeby zacząć zabawę z MQTT. Warto jednak w tym miejscu wspomnieć, że Mosquitto pozwala na dość złożoną parametryzację, włączając w to nasłuch na różnych portach z osobnymi zasadami dla każdego z nich, co może być przydatne, gdy chcemy odfiltrować ruch lokalny od zewnętrznego. Parametrem, który umożliwia różnicowanie konfiguracji, w zależności od portu jest per_listener_settings, który możemy ustawić na true.

Innym parametrem, który może być ważny, gdy używamy poziomów QOS większych niż 0, jest persisatence true, w połączeniu z persistence_location, ponieważ pozwalają one przechować wiadomości na dysku, gdy Mosquitto jest restartowane. Oczywiście trzeba się przy tym liczyć ze zwiększoną liczbą zapisów na dysk, co może mieć jakieś znaczenie przy dużym ruchu i słabym nośniku pamięci.

Jeżeli chcemy używać uwierzytelnianie klientów na podstawie nazwy użytkownika i hasła, powinniśmy użyć opcji password_file, przy czym warto od razu rozważyć, czy jest to absolutnie wymagane i odpowiednio ustawić parametr allow_anonymous.

Jeżeli już zdecydowaliśmy na uwierzytelnianie, można także rozważyć, czy interesuje nas też rozgraniczanie uprawnień między użytkownikami. W tym celu definiujemy plik autoryzacyjny przez parametr acl_file, w którym określamy, kto będzie miał dostęp do publikowania wiadomości bądź subskrybowania wybranych tematów.

Gdy już jesteśmy przy opcjach związanych z bezpieczeństwem, warto wspomnieć krótko o szyfrowaniu. Mosquitto w pełni wspiera SSL. Możemy go stosować na różnych poziomach. W podstawowej wersji, jak zawsze użyjemy samego szyfrowania, żeby zapobiec podsłuchiwaniu transmisji, w tym haseł. Nic natomiast nie stoi na przeszkodzie, żeby pójść krok dalej i weryfikować z poziomu klienta, czy mamy do czynienia z właściwym serwerem (brokerem). To zachowanie znamy świetnie ze świata www, gdzie przeglądarki, na podstawie listy zaufanych certyfikatów sprawdzają, czy połączenie z serwerem jest bezpieczne i czy to jest ten serwer, którego się spodziewamy (żeby np. nie podać hasła komuś, kto się podszywa pod inny serwer). Można natomiast pójść jeszcze dalej i autoryzować klientów nie za pomocą hasła, ale certyfikatu klienckiego. Możemy też zrezygnować z certyfikatów i użyć kluczy psk (pre-shared-keys), znanych obu stronom połączenia, podobnie jak to ma miejsce w komunikacji wi-fi.

Jak widać opcji związanych z bezpieczeństwem i szyfrowaniem jest bardzo wiele, podobnie jak scenariuszy ich zastosowania. Temat jest na tyle szeroki, że być może doczeka się osobnego wpisu.

Uruchomienie

Do uruchomienia Mosquitto wystarcza komenda:

sudo systemctl start mosquitto

Warto jedynak od razu rozważyć uruchamianie naszego brokera razem ze startem systemu. Opcja ta zostanie włączona przez:

sudo systemctl enable mosquitto

Po uruchomieniu Mosquitto możemy potwierdzić, czy nasłuchuje on na porcie 1883:

$ netstat -lnt | grep :1883
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN     
tcp6       0      0 :::1883                 :::*                    LISTEN 

Z powyższego wynika, że tak, mamy nasłuch zarówno na wszystkich interfejsach sieciowych. Jeżeli natomiast coś jest nie tak, to zawsze możemy sprawdzić plik logu /var/log/mosquitto/mosquitto.log.

Test

Jak już mamy uruchomiony brokera (serwer), to wypadałoby jakoś go sprawdzić z użyciem klientów. Na początek zainstalujmy klienty:

sudo apt install mosquitto-clients

Po instalacji powinniśmy mieć dostęp do komend mosquitto_pub do publikowania wiadomości i mosquitto_sub do subskrybowania. Zasubskrybujmy więc wpierw w jednej sesji kanał „test/test„:

pi@raspberrypi:~ $ mosquitto_sub -v -t "test/test"

Nie podaliśmy serwera z użyciem opcji -h, więc jesteśmy połączeni z lokalnym serwerem przez domyślny port. Otwórzmy teraz inną sesję i opublikujmy komunikat na tym kanale:

pi@raspberrypi:~ $ mosquitto_pub -t "test/test" -m "testujemy"

W naszej pierwszej sesji, jak i każdej innej zapisanej do tego tematu, powinniśmy odebrać komunikat:

pi@raspberrypi:~/.pm2/logs $ mosquitto_sub -v -t "test/test"
test/test testujemy

Wszystko działa więc zgodnie z założeniami – broker MQTT został zainstalowany i wykonuje swoją pracę. Można zacząć go używać do komunikacji różnych programów i urządzeń. Ale to już osobny temat.

Ten wpis został opublikowany w kategorii Raspberry Pi i oznaczony tagami , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *