Raspberry Pi als Zabbix-Proxy - Zabbix Proxy auf Raspberry Pi mit Raspbian installieren
Aus znilwiki
Changelog:
- 21.02.2014: Erste Version des Artikels
- 21.02.2015: Artikel aktualisiert auf Zabbix 2.4.3
- 26.02.2015: Artikel aktualisiert auf Zabbix 2.4.7
- 02.11.2015: Benötigte Pakte angepasst an kommende Zabbix Version 3.0.0
- 05.02.2016: Angepasst an Zabbix Version 3.0.0rc1
- 19.02.2016: Angepasst an Zabbix Version 3.0.0 LTS
- 27.04.2016: Angepasst an Zabbix Version 3.0.2
- 22.06.2016: Angepasst an Zabbix Version 3.0.3
- 24.10.2017: Ramdisk!
- 22.02.2018: Installation aus den Paketquellen
- 26.01.2018: Umstellung der Anleitung auf Raspbian Stretch + Installation aus den Quellen + Datenbank in RAM-Disk
- 23.01.2019: Anpassung auf Zabbix 4.0.x (Es gibt wieder ein Repo!)
Material
Das hier ist nur eine Beispielkonfiguration - wie ich diese auch bei einem Kunden einsetze. Gerade die "teure" - und für einen Zabbix-Proxy überdimensionierte microSD Karte wurde vor allen wegen der haltbarkeit gewählt. Bei der Größe dauert es einfach lange bis da mal ein Block wieder überschrieben wird, dementsprechend länger sollte diese halten. In meiner Firma sind uns die microSD-Karten oft nach ca. einem Jahr gestorben, privat mit meinen großen Karten hatte ich dagegen nie Probleme.
Und nein, ich bekommen keine Provision für die Links.
- Raspberry Pi 2 oder 3 (wegen 1 GB RAM), z.B. Link Raspberry
- Gehäuse, Kühlkörper und Netzteil z.B. Link Gehäuse
- microSD Karte 32GB (kleiner oder größer geht auch), z.B. Link microSD
Zudem sollte eurer PC oder Notebook über einen Kartenleser für microSD Karten verfügen.
Für die Erst-Konfiguration einen Monitor mit HDMI-Kabel, eine USB-Tastatur und USB Maus
Grundinstallation
Raspbian installieren
Ihr ladet euch NOOBS herunter:
https://www.raspberrypi.org/downloads/noobs/
Ich empfehle die normale Variante, nicht die Lite - gerade wenn Ihr in Firmennetzwerken unterwegs seit. Noobs (bzw. Linux) zickt rum wenn euer DHCP Server z.B, auch Routen verteilt und bekommt dann keine Internetverbindung. Mit der normalen Version könnt Ihr immer Raspbian installieren, auch ohne Internetverbindung.
Die microSD Karte muss mit FAT32 formatiert sein. Das könnte ihr leicht prüfen in dem Ihr im Datei-Explorer auf das Laufwerk mit der microSD Karte geht und per rechte Maustatste die Eigenschaften aufruft:
Steht dort nicht FAT32 empfehle ich genau einen Weg die Karte zu formatieren:
- Ladet den SD Memory Card Formatter" von der offiziellen Webseite der SD Association' herunter und installiert diesen:
https://www.sdcard.org/downloads/formatter_4/
- Startet das Programm (fordert Admin-Rechte an) und Formatiert die Karte - beim Programmstart sollte eure Karte bereits ausgewählt sein.
- Entpackt das Zip-Arhciv mit Noobs. Der Inhalt sollte etwa so aussehen:
- Kopiert diese Daten auf die microSD Karte
- Karte dann in den Raspberry stecken, Monitor, Tastatur, Maus, ggf. Netzwerkkabel und Netzteil verbinden (Netzteil zuletzt!)
- Nach einer Weile erscheint das NOOBS Installationsmenü
- zunächst mit 2 Einträgen. Sollte es eine Netzwerkverbindung mit gültigen DHCP geben so erscheinen nach einer Weile weitere Einträge. Ggf. kommt auch eine Fehlermeldung das er diese eben nicht laden konnte.
- Wählt als erstes unten die Sprache aus - mit Deutsch wird auch gleich die Tastatur auf Deutsch umgestellt
- Wählt den ersten Eintrag Rasbian [RECOMMENDED] aus
- Wählt oben links Installieren aus und wartet einfach. Es dauert abhängig davon
- ob es ein Raspberry Pi 2 oder 3 ist
- der Geschwindigkeit der microSD Karte
Falls der Raspberry statt per LAN über WLAN angebunden werden soll - klickt oben rechts auf das WLAN-Symbol, dort könnt Ihr ein sichtbares auswählen und konfigurieren.
Es folgt der Neustart des Systems und er bootet durch bis zum Desktop.
Da ich das alles nicht brauche schalten ich dies alles ab:
- Links oben auf die Himbeere klicken
- Einstellungen => Raspberry-Pi-Konfiguration
- System:
- Das Passwort ändern per Klick auf den entsprechenden Button
- Den passenden Hostnamen angeben
- Automatische Anmeldung deaktivieren
- Schnittstellen:
- SSH Aktiviert
- Leistung:
- GPU Speicher auf 16 MByte
- Lokalisierung:
- Zeitzone festlegen auf Europe / Berlin
- WiFi-Land auf DE Germany
Es folgt ein Neustart. Diesmal sollte er nur bis zu einer Text-Anmeldung durchbooten.
Man kann sich ab jetzt schon per SSH anmelden - als Benutzer pi
.
Oder lokal:
Benutzer: pi Kennwort: Wir zuvor geändert - ansonsten ist es: raspberry
Fest IP-Adresse einstellen
Wir melden uns am Raspberry Pi an und wechseln zum root:
sudo -i
Ab dem Stretch Realease von Raspbian wird die IP-Adresse in folgender Datei festgelegt (welche wir bearbeiten):
nano /etc/dhcpcd.conf
Fügt dort die folgenden Zeilen ein / ändert die vorhandenen:
interface eth0 static ip_address=10.100.20.166/24 static routers=10.100.20.1 static domain_name_servers=10.100.50.50 8.8.8.8
Falls Ihr die WLAN-Schnittstelle einstellen wollt: einfach wlan0
statt dem eth0
nehmen (oder zusätzlich).
Speichern und den Raspberry neu starten:
reboot
root wiederherstellen
Ich persönlich arbeite immer direkt als root auf den Geräten (immer dieses sudo ...).
Damit der sich - zunächst lokal - wieder anmelden kann braucht der nur ein Passwort:
sudo passwd root
und dann 2 x das neue Kennwort.
Außerdem bevorzuge ich die farbige Darstellung des Bash-Promptes (wie beim Benutzer pi) sowie die Nutzung von Aliasen wie ll:
sudo cp /home/pi/.bashrc /root/ nano /root/.bashrc
und die folgenden Zeilen anpassen:
# some more ls aliases alias ll='ls -l' alias la='ls -A' alias l='ls -CF'
root Anmeldung per SSH
Per SSH-Key
Der root kann sich bereits per SSH anmelden - aber nicht mit einem Passwort. Ich nutze PuTTY bzw. KiTTY und so hinterlege ich einfach den entsprechenden Schlüssel.
Eine genaue Anleitung wie Ihr das einrichtet findet Ihr bei Bedarf hier
Ubuntu_16.04.x_2-Faktor_bei_SSH_mit_Google_Authenticator_einrichten#R.C3.BCckversicherung_mit_SSH-Key
Falls Ihr den Key schon habt:
sudo -i mkdir ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys2 chmod 600 ~/.ssh/authorized_keys2
und dann den Key in die Datei einfügen:
nano ~/.ssh/authorized_keys2
Nun kann man sich - per SSH-Key - direkt an dem Raspberry per SSH anmelden.
Per Passwort
Ich schreibe hier mal ganz dick:
NICHT EMPFOHLEN
aber Ihr wisst ja was Ihr macht:
sudo nano /etc/ssh/sshd_config
und die folgende Zeile finden und entsprechend ändern:
#PermitRootLogin prohibit-password ändern zu PermitRootLogin yes
Danach Raspberry neu starten und es sollte gehen.
Updates einspielen
- wieder anmelden als root
- Updates suchen für Betriebssystem: (aktualisiert den Katalog aus den Update-Quellen)
apt update
- Updates einspielen:
apt upgrade -y
- Nach Update überflüssige Pakete entfernen:
apt autoremove -y
Firmware Updates
rpi-update
und abwarten + Neustart
Benötigte Programme für Zabbix installieren
Die folgende Pakete werden nicht automatisch installiert, das fehlen erzeugt zumindest Log-Einträge:
apt install -y snmp-mibs-downloader
Zabbix Proxy installieren
Inzwischen installiere ich Zabbix immer direkt aus den Repository https://repo.zabbix.com
Und auch für ARM-Prozessoren + Debian gibt es inzwischen entsprechende Installationsdateien.
Wir fügen die Paketquellen hinzu (Rasbian Stretch):
wget wget https://repo.zabbix.com/zabbix/4.0/raspbian/pool/main/z/zabbix-release/zabbix-release_4.0-2+stretch_all.deb dpkg -i zabbix-release_4.0-2+stretch_all.deb apt update
Und nun den Proxy mit SQLite Unterstütung
apt install -y zabbix-proxy-sqlite3 zabbix-agent zabbix-sender zabbix-get
Die Konfigurationsdateien liegen nun unter
/etc/zabbix/
Der Zabbix-Benutzer ist auch schon angelegt, die Startsskripte für systemd liegen an den richtigen Orten.
RAM-Disk für die Datenbank
Der Proxy sammelt die Daten aus seinem Bereich und leitet diese zentral an den Zabbix-Server weiter. Trotzdem wird jeder Wert zunächst in eine lokale Datenbank geschrieben und dann gesendet. Per Default werden die Werte gleich wieder aus der Datenbank gelöscht, bei Verbindungsproblemen nach einer Stunde. Das kann man dann im Log sehen, dort gibt es entsprechende Wartungseinträge:
483:20180131:141236.892 housekeeper [deleted 3981 records in 0.032466 sec, idle for 1 hour(s)]
Der Proxy ist also ständig dabei Werte in die Datenbank zu schreiben, einmal die Stunde räumt er wieder auf. Beim vermehrten Einsatz von Raspberry Pi als Zabbix-Proxy sind uns die microSD-Karten nun immer so nach einem Jahr gestorben. Das hängt sicherlich zum einen mit der Größe der microSD-Karte zusammen, zum anderen mit der Anzahl der Items die über den Proxy laufen.
Die Datenbank selbst erreicht dabei nach einiger Zeit eine feste Größe, in der Regel nur ein paar MByte.
In Verbindung mit Zabbix weist die Datenbank des Zabbix-Proxy zwei Besonderheiten auf:
- Sie ist eigentlich unwichtig - die Daten werden nur zwischen gepuffert falls die Verbindung zum Server unterbrochen wird
- Wird der Zabbix-Proxy mit SQLite genutzt so legt er diese Datenbank inklusive Schema automatisch an - falls diese nicht vorhanden ist
Die Idee ist nun die Datenbank einfach in eine RAM-Disk zu legen. Ein Raspberry Pi 2 (512MByte) oder 3/3+ (1024MByte) kann Problemlos 100Mbyte hierfür abzwacken.
Und die Logs legen wir ausch gleich mit hinein.
100 MByte ist in der Praxis wahrscheinlich viel zu groß - aber dafür auch (fast) niemals zu klein.
nano /etc/fstab
und folgende Zeile anhängen:
tmpfs /var/ramdisk tmpfs nodev,nosuid,relatime,size=100M 0 0
Danach den Ordner erstellen:
mkdir /var/ramdisk
und die Rechte setzen
chmod 0777 /var/ramdisk
Mit
mount -a df -h
können wir testen ob die RAM-Disk angelegt wird.
Führt danach auch noch mal einen Reboot durch und prüft ob diese danach vorhanden ist.
Zabbix Proxy konfigurieren
Wir öffnen die Konfigurationsdatei
nano /etc/zabbix/zabbix_proxy.conf
und passen mindestens die folgenden Zeilen an:
Server=IP oder DNS Name des Zabbix-Servers an den gemeldet werden soll # Hostname -> unter diesem Namen müssen wir den Proxy auch auf dem Hauptserver anlegen! Hostname=zabbixproxy # Timeout für Befehle erhöhen. So lange warten der Proxy auf Antworten von Skripten, Checks und Agenten Timeout=30 # Neues 3.4 Feature - RemoteCommands funktionnieren nun auch hinter Proxys EnableRemoteCommands=1 LogRemoteCommands=1 # Datenbank und Log in die RAM-Disk (Wenn nicht gewünscht die Zeilen nicht ändern) LogFile=/var/ramdisk/zabbix_proxy.log LogFileSize=4 DBName=/var/ramdisk/zabbixproxy.db
Automatischen Start beim Booten einrichten
systemctl enable zabbix-proxy.service
Start von Zabbix-Proxy Testen
systemctl start zabbix-proxy
In der RAM-Disk müsste es nun die Log-Datei sowie die Datenbank geben:
ls -l /var/ramdisk/
Ausgabe:
3501:20180131:160550.657 Starting Zabbix Proxy (active) [TestPiProxy]. Zabbix 3.4.4 (revision 74338).
3501:20180131:160550.657 **** Enabled features ****
3501:20180131:160550.657 SNMP monitoring: YES
3501:20180131:160550.657 IPMI monitoring: YES
3501:20180131:160550.657 Web monitoring: YES
3501:20180131:160550.657 VMware monitoring: YES
3501:20180131:160550.657 ODBC: YES
3501:20180131:160550.657 SSH2 support: YES
3501:20180131:160550.657 IPv6 support: YES
3501:20180131:160550.657 TLS support: YES
3501:20180131:160550.657 **************************
3501:20180131:160550.658 using configuration file: /etc/zabbix/zabbix_proxy.conf
3501:20180131:160550.658 cannot open database file "/var/ramdisk/zabbixproxy.db": [2] No such file or directory
3501:20180131:160550.658 creating database ...
3501:20180131:160551.019 current database version (mandatory/optional): 03040000/03040005
3501:20180131:160551.019 required mandatory version: 03040000
3501:20180131:160551.057 proxy #0 started [main process]
3502:20180131:160551.059 proxy #1 started [configuration syncer #1]
3504:20180131:160551.061 proxy #3 started [data sender #1]
3506:20180131:160551.064 proxy #5 started [http poller #1]
3503:20180131:160551.071 proxy #2 started [heartbeat sender #1]
3505:20180131:160551.073 proxy #4 started [housekeeper #1]
3509:20180131:160551.074 proxy #8 started [history syncer #2]
3513:20180131:160551.078 proxy #12 started [task manager #1]
3514:20180131:160551.080 proxy #13 started [poller #1]
3507:20180131:160551.081 proxy #6 started [discoverer #1]
3511:20180131:160551.086 proxy #10 started [history syncer #4]
3517:20180131:160551.087 proxy #16 started [poller #4]
3508:20180131:160551.091 proxy #7 started [history syncer #1]
3510:20180131:160551.093 proxy #9 started [history syncer #3]
3512:20180131:160551.101 proxy #11 started [self-monitoring #1]
3515:20180131:160551.102 proxy #14 started [poller #2]
3518:20180131:160551.102 proxy #17 started [poller #5]
3516:20180131:160551.111 proxy #15 started [poller #3]
3519:20180131:160551.112 proxy #18 started [unreachable poller #1]
3523:20180131:160551.120 proxy #22 started [trapper #4]
3524:20180131:160551.121 proxy #23 started [trapper #5]
3520:20180131:160551.141 proxy #19 started [trapper #1]
3525:20180131:160551.151 proxy #24 started [icmp pinger #1]
3521:20180131:160551.152 proxy #20 started [trapper #2]
3522:20180131:160551.161 proxy #21 started [trapper #3]
3502:20180131:160551.749 received configuration data from server at "test.leitungsen.de", datalen 3401
Falls da etwa steht wie:
3586:20180131:160848.872 cannot send heartbeat message to server at "ecetest.leitungsen.de": proxy "TestPiProxy" not found 3585:20180131:160849.468 cannot obtain configuration data from server at "ecetest.leitungsen.de": empty string received
Naja, wir müssen den Proxy auf unserem Zabbix-Server unter
Administration - Proxies
noch anlegen - und zwar bitte genau mit dem gleichen Namen wie in der zabbix_proxy.conf
unter Hostname=
angegeben - dann ist der Fehler weg.
Bei Erfolg sollte das dann so aussehen:
An den Sekunden unter 'Last seen (age)' sehen wir die letzte Kontaktaufnahme.
Wenn da überhaupt etwas steht hatten wir Erfolg!
Agent konfigurieren und starten
Den Proxy selbst wollen wir auch überwachen.
Auch diese muss - als Host - auf dem Zabbix-Server angelegt werden. Der Hostname muss in der Konfigurationsdatei hinterlegt sein.
Per Default versucht der Agent es mit der Rückgabe aus dem Befehl Hostname:
hostename
Ausgabe:
PiProxy01
Anpassung der KOnfiguration:
nano /etc/zabbix/zabbix_agentd.conf
Änderungen:
# Der Name des Host auf dem Zabbix-Server Hostname=PiProxy01 # Logfile in die RAM-Disk LogFile=/var/ramdisk/zabbix_agentd.log LogFileSize=1 # Timeout für Abfragen / Scripte etc. Timeout=30 # Sonderzeichen in den Item-Keys erlauben UnsafeUserParameters=1 # Befehle auf Zuruf ausführen EnableRemoteCommands=1 LogRemoteCommands=1
Den automatischen Start beim Boot aktivieren:
systemctl enable zabbix-agent.service
und den Agenten starten:
systemctl start zabbix-agent.service
Die Logdatei zeigt den Status
cat /var/ramdisk/zabbix_agentd.log
Reboot Test
Startet des System einmal neu
reboot
und prüft ob
- Die Ramdisk angelegt wurde
- Der Zabbix-Proxy gestartet ist, die Datenbank und die Log-Datei angelegt hat
- Der Agent gestartet ist und die Log-Datei angelegt hat
Empfang von SNMP-Traps einrichten
Damit der Proxy auch SNMP-raps entgegen nimmt muss dieser genauso wie der Server entsprechend konfiguriert werden.
Ich habe mich auch hier wieder für die Ablage der Daten in der RAM-Disk entschieden.
fehlende Pakete nachinstallieren
Wir Installieren ggf. die benötigten Pakete nach
apt install -y snmp snmpd snmptt snmp-mibs-downloader snmptrapd
snmptrapd aktivieren und konfigurieren
Wir bearbeiten die Datei
nano /etc/default/snmpd
und ändern die Zeile
SNMPDRUN=yes
in
SNMPDRUN=no
Dann die Datei
nano /etc/default/snmptrapd
und ändern die Zeile
TRAPDRUN=no
in
TRAPDRUN=yes
Nun Konfigurieren wir den Dienst noch:
nano /etc/snmp/snmptrapd.conf
und fügen die folgenden Zeilen ans Ende:
traphandle default /usr/sbin/snmptt disableAuthorization yes
snmptt konfigurieren
Zunächst die .ini Datei zum bearbeiten öffnen:
nano /etc/snmp/snmptt.ini
und die folgende Zeilen ändern (Denkt dran: STRG + W ruft die Suche auf):
mode = standalone translate_log_trap_oid = 2 net_snmp_perl_enable = 1 date_time_format = %H:%M:%S %Y/%m/%d log_file = /var/ramdisk/zabbix_traps.tmp log_system_enable = 1 mibs_environment = ALL
Dann die .conf Datei - wir sichern zunächst die Original-Datei (auch wenn wir die wahrscheinlich nie wieder brauchen) durch umbenennen:
mv /etc/snmp/snmptt.conf /etc/snmp/snmptt.conf.orig
und erstellen eine neue, leere Datei:
nano /etc/snmp/snmptt.conf
mit folgendem Inhalt:
EVENT general .* "General event" Normal FORMAT ZBXTRAP $aA $ar severity:$s $Fn$+*
Das stammt alles nahezu 1:1 von http://lab4.org/wiki/Zabbix_Monitoring_SNMP_Traps_empfangen
Nun noch die Dienste neu starten:
systemctl restart snmpd.service && systemctl restart snmptrapd.service && systemctl restart snmptt.service
logrotate für /tmp/zabbix_traps.tmp einrichten
Unter Umständen läuft unser Zabbix-Proxy lange ohne Neustart. Ohne Neustart wird jedoch die Datei
/var/ramdisk/zabbix_traps.tmp
nicht gelöscht bzw. verkleinert. Gerade wenn viele Einträge in der Datei landen kann dadurch unsere RAM_Disk vollaufen.
Deshalb nutzen wir logrotate um die Größe der Datei zu begrenzen.
Mit großer Wahrscheinlichkeit ist das Programm bereits installiert - ansonsten installiert Ihr es mit
apt install -y logrotate
nach.
Nun noch die Konfigurationsdatei für unsere /tmp/zabbix_traps.tmp
nano /etc/logrotate.d/zabbix_traps
und folgenden Inhalt einfügen:
/var/ramdisk/zabbix_traps.tmp { su root root create 664 root root hourly size 5M compress notifempty missingok maxage 30 rotate 1 }
Damit schaut er jede Stunde nach der Datei. Logrotate arbeite arbeitet aber eigentlich nur einmal Täglich. Will man die stündliche Ausführung so müssen wir noch folgenden Befehl ausführen:
cp /etc/cron.daily/logrotate /etc/cron.hourly/.
Nun sollte er einmal die Stunde die Datei ggf. behandeln, er behält eine alte Version so das maximal 10 MByte zusammenkommen sollten.
Zabbix-Proxy konfigurieren
Die Konfigurationsdatei zum Bearbeiten öffnen:
nano /etc/zabbix/zabbix_proxy.conf
und folgende Zeilen suchen und ändern bzw. Kommentarzeichen davor entfernen:
SNMPTrapperFile=/var/ramdisk/zabbix_traps.tmp StartSNMPTrapper=1
Danach müssen wir den Zabbix-Proxy Dienst neu starten:
systemctl restart zabbix-proxy.service
Trapper-Datei anlegen
Im Log wird er nun meckern:
3327:20180201:135742.603 cannot stat SNMP trapper file "/var/ramdisk/zabbix_traps.tmp": [2] No such file or directory
Die Datei würde erst beim ersten eingetroffenden Trap erstellt. Deshalb machen wir das von Hand:
touch /var/ramdisk/zabbix_traps.tmp
und diesen Befehl nehmen wir auch in die Crontab mit auf damit es die Datei immer gibt:
crontab -e @reboot mount -a & sleep 5 & touch /var/ramdisk/zabbix_traps.tmp
Der mount
steht da nur damit es die Ramdisk dann auch schon sicher gibt.
Windows-Freigabe für Agenten-Dateien einrichten
Vorwort
Die Dateien für die Verteilung des Agenten lege ich regelmäßig auf dem Zabbix-Server bzw. Zabbix-Proxy ab.
Ja, ich richte hier eine "Jeder Vollzugriff" - Freigabe ein - meinen AgentAutoUpdate lasse ich am liebsten mit SYSTEM Rechten laufen (wegen UAC-Kontrolle) - und so gibt es kein Problem mit den Zugriffsberechtigungen.
Wenn Bedenken bestehen (zu recht) kann die Freigabe auch auf "readonly" gesetzt werden. Dann kann das Installationsskript aber auch kein Log dorthin schreiben.
Die einfachste Lösung aus meiner Sicht ist:
- Zunächst wie hier beschrieben mit Vollzugriff enrichten
- Von einem Windows-Rechner aus kann auf die Freigabe zugegriffen und die notwendigen Dateien dorthin kopiert werden
- Wenn nach Tests alles läuft können die Rechte im Ordner per
chmod
auf "Nur Lesen" gesetzt werden, "Schreiben" dann nur noch für den Log-Ordner so fern vorhanden.
Einrichtung Freigabe
Wenn die Installation nachträglich erfolgt - erst einmal Updaten!
apt update apt upgrade
Nun installieren wir Samba - damit erstellt man Windows-Freigaben unter Linux:
apt install samba samba-common-bin
das dauert einen Moment - und danach können wir Samba konfigurieren.
Konfiguration erfolgt über ein zentrale Datei:
nano /etc/samba/smb.conf
In dieser ändern wie folgende Zeilen (wie immer: mit STRG + W kann man in nano suchen)
workgroup = ZNIL ; NetBIOS Domänenname in euerer Umgebung, könnt Ihr auch auf WORKGROUP lassen wins support = no wins server = 192.168.1.1 ; Falls es einen WINS-Server bei euch im Netzwerk gibt, geben wir diesen hier an
ganz am Schluss fügen wir folgende Zeilen hinzu:
[agent] comment = Zabbix Agents path = /share/zabbix/agent guest ok = yes read only = no
dann speichern und verlassen.
Nun müssen wir den Ordner noch anlegen:
mkdir -p /share/zabbix/agent chmod 777 /share/zabbix/agent
und den Dienst von Samba neu starten:
systemctl restart smbd
Ab jetzt können wir über
\\IP-Adresse-Zabbix-Proxy\agent
von Windows aus auf die Freigabe zugreifen und die Dateien dort ablegen.
Probleme beim Zugriff auf die Freigabe - Windows 10 / Windows Server 2016
Die Freigabe erlaubt nun eigentlich den Zugriff ohne Benutzername und Passwort.
Das kann sich Windows 10 einfach nicht mehr vorstellen und will unbedingt ein Passwort nutzen.
Dazu hier der Microsoft-Artikel
Lösung 1:
Wenn Windows nach den Anmeldedaten fragt nutzt Ihr die Daten den Benutzer pi
Benutzername: pi Passwort: raspberry (oder das von euch neu gesetzte)
Lösung 2:
Ihr legt einen extra Benutzer für den Zugriff an, in diesem Beispiel heißt der Benutzer agent:
useradd -M -s /sbin/nologin agent passwd agent smbpasswd -a agent smbpasswd -e agent
Lösung 3:
Ihr richtet die Gruppenrichtlinie entsprechend des obigen Microsoft-Artikel ein.
Lokal geht das mit
gpedit.msc
und ändert die folgende Richtlinie:
Computerkonfiguration => Administrative Vorlagen => Netzwerk => LanMan-Arbeitsstation => Unsichere Gastanmeldungen aktivieren
Die Passwortabfrage poppt dann immer noch auf - aber einfach einen beliebigen Buchstaben als Benutzernamen angeben, Passwort leer lassen und es klappt.
Skripte können dann wieder ohne Abfrage direkt auf die Freigabe zugreifen.
Dauerhafte SSH-Verbindung des Raspberry zum Zabbix-Server
In einem Projekt von uns werden die Raspberry Pi wie zuvor beschrieben vorbereitet und dann versendet. Die Geräte werden dann im lokalen LAN einfach angeschlossen und beziehen eine Adresse per DHCP. Viele Geräte sind auch mit einem LTE-Stick ausgestattet (Der Huawei E3372 LTE USB Stick funktioniert super) und senden Ihre Daten darüber zum Zabbix-Server.
Das Problem ist das man nun nicht von außen auf die Geräte zugreifen kann - sei es für Tests oder Updates.
Ich hatte mich schon OpenVPN beschäftigt - da kam der passende Titel in der c't: https://www.heise.de/ct/ausgabe/2018-2-Heimserver-hinter-DS-Lite-oder-CG-NAT-erreichbar-machen-3930006.html
In dem Artikel verbindet sich das Gerät einfach per SSH mit dem Server und baut so einen SSH-Tunnel mit Remote Forwarding auf. Dabei nimmt der Client (= der Raspberry) lokale Ports mit in den Tunnel. Diese sind dann über den Server zu erreichen. In dem nachfolgenden Beispiel wird der lokale Port 22 auf den Port 42022 auf dem Server gemappt. Man kann also auf den Client zugreifen indem man eine SSH Sitzung auf den Server Port 42022 öffnet und landet dann direkt auf dem Raspberry.
Für jedes Gerät muss dann natürlich ein anderer Port verwendet werden.
Nachteil: Geht nur als root Benutzer.
Vorbereitung Server
Der muss über eine öffentliche IP-Adresse erreichbar sein, ein DNS-Name schadet auch nicht.
Der Port 22 muss von außen erreichbar sein.
Folgende Änderungen müssen wir vornehmen:
nano /etc/ssh/sshd_config
und folgende Zeilen ändern bzw. ggf. hinzufügen:
# Anmeldung des Root-Benutzers mit SSL-Schlüssel PermitRootLogin prohibit-password # Einwahl RaspberryPis GatewayPorts yes ClientAliveInterval 10 ClientAliveCountMax 3
Eventuell steht bei euch statt prohibit-password
ein without-password
. Beides ist wohl scheinbar gültig.
Nach der Änderung müsst Ihr den SSH-Dienst einmal neu starten
systemctl restart sshd.service
Vorbereitung Raspberry
Der Raspberry sollte über seine Netzwerkverbindung den Port 22 des Zabbix-Servers erreichen können (neben dem Port 10051).
Als nächstes brauchen wir auf dem Raspberry einen privaten und öffentlichen Schlüssel für die Verbindung.
Den erstelle ich einfach mit
sudo -i ssh-keygen -t rsa
Die Pfade einfach so übernehmen, keine(!) Passphrase angeben.
Das sudo steht an dieser Stelle als Sicherheit - Ihr müsst das unbedingt als root durchführen!
Den Inhalt der Datei mit dem öffentlichen Schlüssel anzeigen lassen:
cat /root/.ssh/id_rsa.pub
Beispielausgabe:
ssh-rsa AAAAB3NzaC1yc2EAAAADmEE8eYiYtcqi8kFRXVIe/rhgngumy6uhn1u0ZPEfOJCPW9YEmMoUD1pf2BLk95JW9XHXiPI78NWmzHMDp9o1/3mG0kIr1tFxQQvgtdkvsm5VZ6rrlEOmQXS3II/mMEyXI7R+QzhHx7IMktxnYPctcLK4YivGkHE7asTrlIjhw9zCexXv6VBNglSxmp9caIauAQABAAABAQDSfynFutouGgVT58wmf95xgUEuC4+ikkFvv86WRZ5+nhFUv/A5BvfGNHOZwyjCNqIL+aDjeDGIyzxBgmGa1mC8K002LPitYPFcULzQIqnRFIxo0A6oM3EHj15Ahds4izxPKLKAvrV2hRosECluwDO9 root@PiProxy01
Diesen Text (nein euren, nicht den aus dem Beispiel hier!) müsst Ihr nun auf dem Zabbix-Server in die Datei
nano /root/.ssh/authorized_keys2
einfügen - einfach als neue Zeile an das Ende.
Erste Tests
Nun sollten wir und bereits vom Raspberry aus mit dem Zabbix-Server verbinden können:
Ggf. zum root wechseln:
sudo -i
und mit eurem Zabbix-Server verbinden:
ssh IP_oder_DNS_eures_Zabbix-Server
Beispiel:
root@PiProxy01:~/.ssh # ssh zabbix.testdomain.de
The authenticity of host 'zabbix.testdomain.de (12.34.56.78)' can't be established.
ECDSA key fingerprint is SHA256:fxvJr9cMVcIo4HnvCZKwciAXdlmNHBR2QPgRj/v29ew.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'zabbix.testdomain.de,12.34.56.78' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-112-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
24 Software-Pakete können aktualisiert werden.
6 Aktualisierungen sind Sicherheitsaktualisierungen.
Last login: Thu Feb 1 11:42:09 2018 from 82.198.211.227
Prima, wenn das klappt habt Ihr alles richtig gemacht!
Mit
exit
die Verbindung wieder beenden und nun das ganze noch einmal - aber mit Remote Forwarding:
ssh -R 42022:localhost:22 root@zabbix.testdomain.de
Die Verbindung wird genauso wie zuvor aufgebaut. Nur haben wir jetzt den Port 22 auf Port 42022 ab Zabbix-Server gemappt.
Verbindet euch nun z.B. mit PuTTY auf
interne_IP_Zabbix-Server:42022
Und Ihr landet auf dem Raspberry!
Sobald Ihr die SSH Sitzung zwischen dem Raspberry und dem Zabbix-Server wieder beendet ist auch das Port-Mapping wieder weg.
Beendet die SSH Sitzung für den nächsten Schritt auf jeden Fall!
Automatische Verbindungsaufnahme einrichten
Jetzt konfigurieren wir das der Raspberry nach jedem Booten und nach jedem Abbruch die Verbindung sofort wieder neu aufbaut.
Dazu nutze ich autossh was Ihr erst noch installieren müsst:
apt install -y autossh
Den Start von autossh inklusive der Parameter legen wir als Dienst an:
nano /etc/systemd/system/autossh-tunnel.service
mit folgendem Inhalt:
[Unit]
Description=AutoSSH tunnel service SSH to 42022
After=network.target
[Service]
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -o ServerAliveInterval=12 -o ServerAliveCountMax=3 -R 42022:localhost:22 -N root@zabbix.testdomain.de
[Install]
WantedBy=multi-user.target
Jetzt erzählen wir dem systemd das wir an seinen Dateien was geändert haben:
systemctl daemon-reload
richten den automatischen Start ein
systemctl enable autossh-tunnel.service
und starten diesen:
systemctl start autossh-tunnel.service
Jetzt prüfen wir auf 2 Arten ob es geklappt hat:
systemctl status autossh-tunnel.service
Ausgabe:
● autossh-tunnel.service - AutoSSH tunnel service SSH to 42023 Loaded: loaded (/etc/systemd/system/autossh-tunnel.service; disabled; vendor preset: enabled) Active: active (running) since Thu 2018-02-01 12:32:23 CET; 6s ago Main PID: 4591 (autossh) CGroup: /system.slice/autossh-tunnel.service ├─4591 /usr/lib/autossh/autossh -M 0 -o ServerAliveInterval=12 -o ServerAliveCountMax=3 -R 42022:localhost:22 -N root@zabbix.testdomain.de └─4594 /usr/bin/ssh -o ServerAliveInterval=12 -o ServerAliveCountMax=3 -R 42023:localhost:22 -N root@zabbix.testdomain.de Feb 01 12:32:23 PiProxy01 systemd[1]: Started AutoSSH tunnel service SSH to 42023. Feb 01 12:32:23 PiProxy01 autossh[4591]: port set to 0, monitoring disabled Feb 01 12:32:23 PiProxy01 autossh[4591]: starting ssh (count 1) Feb 01 12:32:23 PiProxy01 autossh[4591]: ssh child pid is 4594
und Ihr könnt wieder den Zugriff per PuTTY testen.
Anschließend führt einen Reboot durch und prüft ob sich das System wieder von alleine verbunden hat.