Aktionen

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.


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:

ClipCapIt-180126-103813.PNG

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.
ClipCapIt-180126-104156.PNG
  • Entpackt das Zip-Arhciv mit Noobs. Der Inhalt sollte etwa so aussehen:
ClipCapIt-180126-104332.PNG
  • 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):

Für die Version 4.0.x
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
Important.png
Hinweis: Version 3.0 ist in Raspbian Stretch bereits vorhanden. Dann lasst die Quellen einfach weg


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:

Zabbix General Proxys.png

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.

Important.png
Hinweis: Wenn Ihr statt der IP-Adresse einen Namen verwenden wollt müsst Ihr diesen Namen auf euren DNS Server anlegen




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
ClipCapIt-180201-104636.PNG

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.

Important.png
Hinweis:Ich verbinde in diesem Beispiel die Geräte mit dem Zabbix-Server. Es geht natürlich auch zu einem anderen Linux-Server




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
ClipCapIt-180201-122323.PNG

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.


Kommentare

Loading comments...