MQTT-Broker einrichten/ Multiple Listener

Beschreibung

Bearbeiten
 
Einzelner Broker mit zwei Listener

Der Broker wird so eingerichtet, dass dieser auf verschiedenen Ports Verbindungen annimmt und dort auch teils unterschiedliche Einstellungen aufweist.

Hiermit ist es z.B. möglich, dass MQTT auf der lokalen Netzwerkschnittstelle anonyme Verbindungen annimmt. Auf der externen Schnittstelle dagegen wird eine Authentifizierung benötigt.

Ebenso ist es möglich, wenn der MQTT-Broker auf einer Schnittstelle installiert ist, von dem verschiedene Netzwerke erreichbar sind und die Schnittstelle selbst für jedes Netzwerk eine IP-Adresse verwendet (wie in der Abbildung), für jedes Netzwerk eigene Authentifizierung verwendet werden.

Ziele dieses Szenariums sind:

  • Lokaler Listener (localhost) ohne Anmeldung
  • Externer Listener mit Anmeldung

Konfiguration

Bearbeiten

In der globalen Konfiguration wird zunächst eingerichtet, dass für jeden Listener eigene Einstellungen vorgenommen werden. Dies ist eine globale Konfiguration, die in einer eigenen Datei eingestellt werden sollte.

Globale Konfiguration

Bearbeiten

Grundsätzlich erfolgt die Konfiguration unter /etc/mosquitto/mosquitto.conf. Hier wird mit der Anweisung include_dir [pfad] ein Pfad angegeben, in der zusätzliche Konfigurationsdateien zu finden sind. Dies sollte auch genutzt werden, da diese Konfigurationsdatei /etc/mosquitto/mosquitto.conf bei Paket-Akualisierungen überschrieben werden können.

Zusätzliche globale Einstellungen werden daher in der Datei /etc/mosquitto/conf.g/global.conf vorgenommen.

Dort wird folgender Eintrag zugefügt:

per_listener_settings true

Damit wird eingestellt, dass für jeden Listener eigene Einstellungen vorgenommen werden.

Lokaler Listener

Bearbeiten

Für jeden Listener wird eine eigene Konfigurationsdatei angelegt. Die Einstellung des lokalen Listener (/etc/mosquitto/conf.d/local.conf) besteht aus zwei Zeilen:

listener 1883 127.0.0.1
allow_anonymous true

Die Konfiguration bedeutet:

listener
Diese Instanz soll auf Port 1883 und der IP-Adresse 127.0.0.1 lauschen.
allow_anonymous
Mit true sind anonyme Anmeldungen erlaubt.

Externer Listener

Bearbeiten

Für Verbindungen über die externe Schnittstelle muss die IP-Adresse des Brokers bekannt sein (z.B. 192.168.1.2). Im Konfigurationsordner wird eine neue Datei /etc/mosquitto/conf.d/extern.conf erstellt mit folgenden Zeilen:

listener 1883 192.168.1.2
allow_anonymous false
password_file /etc/mosquitto/pwfile

Die Konfiguration bedeutet:

listener
Die Instanz lauscht auf Port 1883 der (externen) IP-Adresse 192.168.1.2.
allow_anonymous
Mit false werden keine anonymen Anmeldungen akzeptiert, sondern es muss immer zwingend Nutzername und Passwort verwendet werden.
password_file
Pfad zur Passwort-Datei

Externer Listener mit TLS

Bearbeiten

Die Angabe der IP-Adresse ist optional. Wird nur der Port angegeben, dann werden Verbindungen über alle Netzwerkinterfaces auf diesem Port akzeptiert. In diesem Beispiel wird dann eine TLS-Verbindung auf Port 8883 akzeptiert:

listener 8883
tls_version tlsv1.1 tlsv1.2
psk_file /etc/mosquitto/pskfile.txt
cafile /etc/mosquitto/ca_certificates/ca.crt
keyfile /etc/mosquitto/certs/mqtt.key
certfile /etc/mosquitto/certs/mqtt.crt

Die einzelnen Zeilen bedeuten:

listener 8883
Es wird ein neuer Port 8883 auf allen verfügbaren Netzwerkschnittstellen angebunden.
tls_version
Über diese Verbindung können sowohl TLS-Versionen 1.1 und 1.2 aufgebaut werden. Jede Version muss explizit angegeben werden; es gibt noch keine Funktion, eine Mindestversion anzugeben.
psk_file
Pfad zur Datei mit den Pre-Shared-Keys
cafile
Pfad zu Zertifikat der CA.
keyfile
Pfad zum privaten Schlüssel, mit dem der MQTT-Broker die Verschlüsselung durchführt.
certfile
Pfad zum Zertifikat des privaten Schlüssels, unterzeichnet von der CA, dessen selbst-signiertes Zertifikat oben angegeben ist.

Ausblick

Bearbeiten

Mit der zentralen Einstellung per_listener_setting können für einen Broker verschiedene Zugänge definiert werden. So kann ein Zugang über die interne Schnittstelle anonym erfolgen, da nur gesicherte Prozesse auf der Maschine laufen (sollten). Aus dem lokalen Netzwerk lassen sich Verbindungen ohne TLS-Verschlüsselung, aber mit Passwort entgegennehmen. Eine zusätzliche Instanz kann Verbindungen aus einem ungesicherten Netzwerk mit TLS-Verschlüsselung entgegennehmen.