MQTT-Broker einrichten/ Multiple Listener
Beschreibung
BearbeitenDer 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
BearbeitenIn 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
BearbeitenGrundsä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
BearbeitenFü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
BearbeitenFü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
BearbeitenDie 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
BearbeitenMit 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.