fail2ban und dynamische IP-Adressen

fail2ban und dynamische IP-Adressen

fail2ban ist ein sehr, sehr praktisches Werkzeug (http://www.fail2ban.org). Und jeder, der fail2ban regelmäßig nutzt hat sich selbst schon einmal ausgesperrt. Gut dem, der eine statische IP hat und diese via ignoreip auf die Whitelist gesetzt hat (http://www.fail2ban.org/wiki/index.php/Whitelist). Pech hingegen für mich, der bei der deutschen Tel... unter Vertrag ist, privat einen DSL Anschluss hat und nicht bereit ist die extrem hohen Kosten für einen Vertrag mit statischer IP zu zahlen.

Dynamische IP-Adresse

Das Problem dabei ist, dass dynamische IP-Adressen sich so dann und wann ändern. Nur was trägt man in einer Witelist ein die statischer Natur ist? So wie von fail2ban verwendet?

Was ich hingegen habe ist einen passenden Eintrag ins DNS der auf meine wechselnde IP zeigt (DynDNS oder wie auch immer ihr das Kind nennen wollt). Also fix ein Skript erstellt welches im tmp-Verzeichnis die dazugehörige IP puffert. Sobald sich diese ändert wird eine passende fail2ban local Config erstellt und die komplette Config neu eingelesen. Da ich ebenfalls auf eine Leitung mit statischer IP-Adresse zugriff habe wird ignoreip eben mit diesem statischen Teil befüllt und anschließend um den dynamischen Teil erweitert.

#!/bin/bash

#
# Whitelisted eine dynamische IP in Fail2ban
#


IGNALWAYS="127.0.0.1/8 ::1 193.nn.mm.0/24"
IGNDYN="dyn.gehirn-mag.net"
IGNFILE="/etc/fail2ban/jail.d/ignoreip.local"
TMPFILE="/tmp/fail2ban-dynip"


# Suche nach aktueller IP sowie gepufferter IP
CURIP=$($(which dig) +short $IGNDYN)
[ -f $TMPFILE ] && OLDIP=$(cat $TMPFILE) || OLDIP="--unknown--"
echo "aktuelle IP: $CURIP gepufferte IP: $OLDIP"

# Falls IPs verschieden ignoreip neu schreiben
if [ $CURIP != $OLDIP ]; then
    echo -n "Ändere ignoreip: "
    echo $CURIP > $TMPFILE
    echo -e "# written by $0 ad $(date)\\n\\n[DEFAULT]\\nignoreip = $IGNALWAYS $CURIP\\n" > $IGNFILE
    $(which fail2ban-client) reload
    # Debug
    $(which fail2ban-client) --dp | mail -s "$(hostname) fail2ban-dynip $CURIP" ...@gehirn-mag.net
fi

 

Falls Du weißt welchen DNS-Server Du fragen musst kannst Du Zeile 15 entsprechend ergänzen. Sowie sich die IP ändert lasse ich mir via Email die aktuelle fail2ban Konfig senden (Zeile 26). Wer das nicht will nimmt diese Zeile einfach raus. Was jetzt noch fehlt ist der regelmäßige Aufruf. Ich selbst verwende dazu folgenden cron Eintrag welcher alle 15 Minuten läuft:

# Fail2ban: die private IP auf die Whitelist setzen
*/15 * * * * /usr/local/bin/fail2ban-ignoreip.sh 2>&1 | /usr/bin/logger -t fail2ban-dynip

Fertig, das war es 🙂

 

Skytraq GPS Datalogger

Skytraq GPS Datalogger

Ich habe mir vor einigen Jahren in der Bucht einen GPS Logger von Skytraq gekauft. Ein Gerät mit dem man einfach nur einen GPS-Track aufzeichnen kann um im nach hinein zu sehen wo man lang gelaufen oder gefahren ist. Jahre bevor es SmartPhones gab oder das erste Handy eine GPS-Antenne hatte. Mit ca. 50€ eine richtig günstige Alternative zu den teuren Sportnavis von damals. Funktionieren tut das Gerät heute noch. Nur wie lese ich die Daten unter Linux aus?

Skytraq GPS Datalogger

Skytraq GPS Datalogger

Skytraq-Datalogger

Geräte dieser Art konnte man damals wie auch heute noch in einigen Variationen bei den unterschiedlichsten Händlern finden. Die meisten sind sehr spartanisch und haben neben einem An- und Ausschalter noch ein paar Leuchtdioden. Man bekommt ein einfaches Gerät mit dem man einen GPS-Track aufzeichnen kann, des weiteren kann es noch als GPS Mouse verwendet werden. Neben dem USB-Anschluss hat mein Gerät noch die Möglichkeit Bluetooth zu verwenden.

Es gibt 3 Leuchtdioden: Eine grüne für GPS die blinkt sobald eine Position bestimmt werden konnte, eine rote Ladeanzeige und eine blaue Bluetooth LED. Unten ist ein Schiebeschalter zum an- bzw. ausschalten, oben ist die USB-Buchse.

Diese Geräte werden in den meisten Fällen mit der Software iTravel Tech PhotoTagger (http://www.itravel-tech.com/) ausgeliefert welche nur unter Windows läuft. Ob diese per wine (http://www.winehq.org) unter Linux ebenfalls funktioniert habe ich bisher noch nicht getestet.

Linux

Es sollte doch möglich sein das Gerät auch von Linux aus zu bedienen. So ein Tracker an für sich ist ja nichts außerordentlich spezielles und zunächst ein ganz normales USB-Gerät. Also einfach mal eingesteckt und nachgeschaut was passiert. lsusb brachte folgende Informationen zu Tage:

dr.disk@local:~$ lsusb
Bus 007 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Sieh an, sieh an: Ein PL2303. Der Tracker meldet sich als normaler serieller Anschluss am System. Dazu finden sich weitere Details im dmesg:

dr.disk@local:~$ dmesg | tail
[23945.432040] usb 7-2: new full-speed USB device number 4 using uhci_hcd
[23945.595067] usb 7-2: New USB device found, idVendor=067b, idProduct=2303
[23945.595073] usb 7-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[23945.595076] usb 7-2: Product: USB-Serial Controller D
[23945.595079] usb 7-2: Manufacturer: Prolific Technology Inc.
[23945.598094] pl2303 7-2:1.0: pl2303 converter detected
[23945.610122] usb 7-2: pl2303 converter now attached to ttyUSB0

Der Tracker ist verbunden als serieller Anschluss via /dev/ttyUSB0. Damit lässt sich doch schon mal was anfangen 🙂

Das lässt vermuten, dass per Bluetooth ebenfalls ein serieller Anschluss bereit gestellt wird. An meinem Rechner reichte mir jedoch die USB-Verbindung - jedoch müsste mit Bluetooth dies sinngemäß funktionieren.

Die Anschlusseinstellungen, vor allem die Baud-Rate, kann mit //stty -F /dev/ttyUSB0// ermittelt werden:

dr.disk@local:~$ stty -F /dev/ttyUSB0
speed 9600 baud; line = 0;
min = 1; time = 0;
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo

Der Logger läuft also mit 9600 Baud. Diese Info reicht fürs Erste.

GPS Mouse

Um zu testen ob bzw. welche Daten der Logger im Moment liefert verwende ich gpsd und gpsmon (http://catb.org/gpsd/). gpsd habe ich einfach mit gpsd /dev/ttyUSB0 gestartet. gpsmon erzeugte im Anschluss daran folgende Ausgaben:

tcp://localhost:2947          NMEA0183>
┌──────────────────────────────────────────────────────────────────────────────┐
│Time: n/a Lat: n/a Lon: n/a │
└───────────────────────────────── Cooked TPV ─────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────────────┐
│ GPGGA GPGSA GPRMC GPVTG GPGSV │
└───────────────────────────────── Sentences ──────────────────────────────────┘
┌──────────────────┐┌────────────────────────────┐┌────────────────────────────┐
│Ch PRN Az El S/N ││Time: 075908.000 ││Time: 075908.000 │
│ 0 ││Latitude: 0000.0000 N ││Latitude: 0000.0000 │
│ 1 ││Longitude: 00000.0000 E ││Longitude: 00000.0000 │
│ 2 ││Speed: 000.0 ││Altitude: 0.0 │
│ 3 ││Course: 000.0 ││Quality: 0 Sats: 00 │
│ 4 ││Status: V FAA: N ││HDOP: 0.0 │
│ 5 ││MagVar: ││Geoid: 0.0 │
│ 6 │└─────────── RMC ────────────┘└─────────── GGA ────────────┘
│ 7 │┌────────────────────────────┐┌────────────────────────────┐
│ 8 ││Mode: A1 Sats: ││UTC: RMS: │
│ 9 ││DOP: H=0.0 V=0.0 P=0.0 ││MAJ: MIN: │
│10 ││TOFF: ││ORI: LAT: │
│11 ││PPS: ││LON: ALT: │
└────── GSV ───────┘└──────── GSA + PPS ─────────┘└─────────── GST ────────────┘
(40) $GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02

Das sieht doch schon mal sehr schön aus! Als GPS Mouse funktioniert das Gerät bereits wunderbar. Ok, ich war in einem Gebäude, deswegen wurde keine Position ermittelt. Dies deckt sich mit der grünen Status-LED fürs GPS: Diese leuchtete noch permanent, d.h. es wurde noch keine Postion ermittelt.

Als GPS Mouse habe ich für dieses Gerät keine Verwendung. Ich bin Sportler. Von daher gesehen will ich eigentlich nur aufzeichnen wo ich war und nicht unterwegs nachschauen wo ich bin. Vielleicht ein anderes Mal, aber derzeit ist das für mich uninteressant.

Wer es etwas einfacher haben will: Ein cat /dev/ttyUSB0 zeigt den NMEA Datenstrom an (https://de.wikipedia.org/wiki/NMEA_0183). Unterm Strich sind das die gleichen Daten die beim gpsmon ganz unten ebenfalls mit durchs Bild huschen:

dr.disk@local:~$ cat /dev/ttyUSB0
,T,,M,000.0,N,000.0,K,N*02
$GPGGA,141514.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*69
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPRMC,141514.000,V,0000.0000,N,00000.0000,E,000.0,000.0,081013,,,N*79
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02
$GPGGA,141515.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*68
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPRMC,141515.000,V,0000.0000,N,00000.0000,E,000.0,000.0,081013,,,N*78
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02

skytraq-datalogger: Konfigurieren und Auslesen des Loggers

Auf der Suche nach einer Möglichkeit den Logger unter Linux zu konfigurieren und auszulesen bin ich auf skytraq-datalogger (http://code.google.com/p/skytraq-datalogger/) gestoßen.

Das Programm ist einfach gehalten und sollte sich auch auf neueren Linux-Systemen übersetzen lassen. Alternativ dazu, falls man die deb-Pakete nicht installieren will oder einen anderen Paketmanager verwendet, kann man mit alien -t <Paketname> das Paket in eine tar.gz-Datei umwandeln lassen. Die darin enthaltene skytraq-datalogger kann dann an jede beliebige Stelle kopiert werden.

Mit skytraq-datalogger --help gestartet erhält man die möglichen Optionen:

dr.disk@local:~$ ./skytraq-datalogger --help
USAGE: ./skytraq-datalogger <OPTIONS> ACTION
ACTION is one of:
--info get information about software version and configuration
--delete delete all track lists from the data logger
--dump dump track lists to STDOUT
--set-config change configuration of the data logger
--set-baud-rate configure speed of the device's serial port
--set-output-off disable output for GPS data
--set-output-nmea enable output for GPS data in NMEA format
--set-output-bin enable output for GPS data in binary format
--update-agps upload to AGPS data on the device
(needs internet connection)
OPTIONS:
--device <DEV> name of the device, default is /dev/ttyUSB0
--permanent write serial port speed to FLASH
--baud-rate set baud-rate manually
OPTIONS for configuration:
--time <SECONDS> log every <SECONDS> seconds
--max-time <SECONDS>
--dist <METERS> log every <METERS> meters
--max-dist <METERS>
--speed <KMPH> only log if faster than <KMPH> km/h
--max-speed <KMPH>
--enable-log turn on logging
--disable-log turn off logging
--mode-fifo overwrite oldest entries when no space is left
--mode-stop stop logging when no space is left

Mit --info kann man die Einstellungen sowie den noch freien Platz auslesen. Falls ein andere serieller Anschluss als ttyUSB0 verwendet wird muss dies per --device <Anschluss> mit übergeben werden.

steffen@ws-0908173:/tmp/usr/bin$ ./skytraq-datalogger --device /dev/ttyUSB0 --info
kernel version: 1.3.3 -- ODM version: 1.4.5 -- revision: 2007-12-11
log_wr_ptr: 92636
total sectors: 254
sectors left: 235
max time: 3600 s
min time: 5 s
max distance: 1000 m
min distance: 2 m
max speed: 1000 km/h
min speed: 0 km/h
datalog enable: 1
log fifo mode: 0
AGPS enabled: 0
AGPS data left: none
baud-rate: 9600 bps

Mit --dump kann der Inhalt des Speichers ausgegeben werden. Per skytraq-datalogger --dump > /tmp/test.gpx kann die Ausgabe in eine Datei umgeleitet werden. Diese Datei kann bereits von Tools wie google earth, viking oder gpsprune geöffnet werden. Jedoch sind die Tracks nicht in einzelne Bereich geschnitten.

Weitere interessante Optionen sind --erase mit dem man den Speicher wieder leeren kann bzw. --set-config mit dem die Einstellungen geändert werden.

gpsbabel: Eine Alternative zum auslesen der Tracks

Gpsbabel kann ebenfalls SkyTraq Geräte ansprechen. Infos hierzu finden sich in der Dokumentation: http://www.gpsbabel.org/htmldoc-development/fmt_skytraq.html.

  • Eine Variante mit dem die Daten als gpx ausgelesen werden kann sieht so aus:
    dr.disk@local:~$ gpsbabel -i skytraq -f /dev/ttyUSB0 -o gpx -F gpsbabel.gpx
  • Falls man die Daten auf dem Logger gleich noch mit löschen will kann dies mit erase erfolgen:
    dr.disk@local:~$ gpsbabel -i skytraq,erase -f /dev/ttyUSB0 -o gpx -F gpsbabel.gpx
  • Wer wie ich erst mal alles lesen und später nachdem die Daten das erste Mal ausgewertet sind alles löschen möchte kann die Ausgabe abschalten:
    dr.disk@local:~$ gpsbabel -i skytraq,erase,no-output -f /dev/ttyUSB0

Anstatt der Befehlszeile kann die GUI von gpsbabel analog dazu verwendet werden:

gpsbabel-gui

Datalogger via gpsbabel auslesen

Weitere Schalter zu Skytraq und gpsbabel finden sich in obiger angegebener Dokumentation. Zu gpsbabel selbst lohnt sich der Blick in dessen Doku unter http://www.gpsbabel.org/readme.html.

Trennen der Tracks

Wer mehrere Tracks auf dem Logger hat und diese trennen will kann dies zum Beispiel hiermit tun (trennt pro Tag, andere Varianten siehe gpsbabel Handbuch):
gpsbabel -i skytraq -f /dev/ttyUSB0 -xtrack,split,title="Track %D" -o gpx -F gpsbabel.gpx

Falls wie hier nicht alle Tracks in einer Datei landen sollen kann mit //start// und //stop// gearbeitet werden um einzelne Bereiche separat aus zuschneiden. Für mehrere Dateien muss dieser Befehl dann entsprechend mehrfach verwendet werden:
gpsbabel -i skytraq -f /dev/ttyUSB0 -xtrack,start=20130709,stop=20130711 -o gpx -F gpsbabel.gpx

AGPS - schnellere Initialisierung nach dem Start

Das lästigste bei diesen Geräten dürfte die lange Zeitspanne bis zur ersten Positionsbestimmung sein. Mit AGPS wird diese drastisch verkürzt. Ebenso berichten viele Benutzer, dass die Empfangsqualität dadurch deutlich besser wird. Infos zu AGPS gibt es zum Beispiel hier: https://en.wikipedia.org/wiki/Assisted_GPS.

Damit dies funktioniert muss man den Almanach im Gerät aktualisieren. Diesen Schritt sollte man regelmäßig wiederholen damit stets aktuelle Daten hinterlegt sind.

skytraq-datalogger

Die notwendigen Schritte kann man zum Beispiel mit dem skytraq-datalogger durchführen. Falls es nicht klappen sollte: Gerät aus- und wieder einschalten und nochmals probieren.

dr.disk@local:~$ skytraq-datalogger --update-agps
Downloading AGPS data from SkyTraq's FTP-server...
Uploading AGPS data to GPS device...
7% done
14% done
21% done
28% done
35% done
42% done
48% done
55% done
62% done
69% done
76% done
83% done
90% done
97% done
Upload completed.

Sparkfun Forum

Im Internet habe ich noch folgendes gefunden: https://forum.sparkfun.com/viewtopic.php?p=81423. Hier wird ein kleines c-Programm gezeigt welches ebenfalls den Almanach aktualisieren können soll. Das Tool ist sehr einfach gehalten und sollte sich leicht an die eigenen Anforderungen anpassen lassen.

Die benötigte Almanach-Datei kann zum Beispiel mit wget geholt werden:
wget ftp://skytraq:skytraq@60.250.205.31/ephemeris/Eph.dat

Windows

Unter Windows kann die mitgelieferte Software verwendet werden. Alternativ müsste zumindest der Teil mit gpsbabel ebenfalls funktionieren. Versuche ob die obigen Tools direkt oder per Cygwin laufen überlasse ich jedem selbst 😀

Diese Abmahnung wurde maschinell erstellt und benötigt keine Unterschrift

Diese Abmahnung wurde maschinell erstellt und benötigt keine Unterschrift

Bei mir kommen regelmäßig Azubis, Praktikanten oder Studenten vorbei. Das ist absolut ok so - man lernt nun mal am Besten die anderen Abteilungen bzw. Unternehmen der Gruppe kennen indem man dort mal ein paar Tage rein schnuppert. Wenn es die Zeit zulässt erzähle ich ganz gerne neben dem was wir so machen noch ein paar Dinge über den üblichen Tellerrand darüber hinaus. Gern genommene Themen sind "Email" (wir haben mehrere TB bei uns auf den Platten liegen), "Webhosting aus Adminsicht mit Hinblick auf Google Pagespeed", "Der Einfluss von langsamen DNS auf ein Firmennetzwerk", "Ethik und Moral zum Thema Monitoring"... Jetzt kommt meistens "langweilig" oder "ne, Ethik ist nicht so meins". Na wunderbar! Das Thema ist gefunden, der Einstieg bereits gemacht 😉

Zuerst einmal gehen wir dann immer der Frage nach was Monitoring überhaupt ist. Grob zusammengefasst findet man dieses hier als Einleitung auf Wikipedia (Logo und Text von hier https://de.wikipedia.org/wiki/Monitoring):

Monitoring ist die Überwachung von Vorgängen. Es ist ein Überbegriff für alle Arten von systematischen Erfassungen (Protokollierungen), Messungen oder Beobachtungen eines Vorgangs oder Prozesses mittels technischer Hilfsmittel oder anderer Beobachtungssysteme.
Ok, erfassen, messen und beobachten. Über das "wie" wollen wir uns jetzt mal etwas weniger Gedanken machen, viel interessanter ist die Frage nach dem "was".

Monitoring Allgemein

Gehen wir also zunächst mal der Frage nach was man überhaupt so alles mit einem Monitoring-System überwachen kann. Ich frage dann mal nach bzw. lenke die Diskussion in folgende Richtungen:

Dienste

Netzwerk um die Welt.

Vernetzte Dienste

Eine der häufigsten Antworten sind "Dienste" oder die "Verfügbarkeit von Diensten". Das kann sowas einfaches sein wie ein Ping auf Server, Router oder sonstige Geräte. Oder mit etwas mehr Anspruch weil via Protokoll verbunden wird um z.B. nachzusehen ob ein Mailserver artig Hallo sagt, ob ein Webserver eine Webseite ausliefert usw. Das ist ok und richtig so. Nur allzu oft wird hierbei etwas ganz wichtiges übersehen. Kurzer Exkurs: Häufig wird der Dienst alle 5 Minuten geprüft. Im Falle eines Fehlers wird der Abstand verkürzt, oftmals auf zwei Minuten. Bei 3 hintereinander aufgetretenen Fehlern wird alarmiert. Dann mal fix zusammen gerechnet was hier als worst case raus kommt: 9 Minuten. Also nach 9 Minuten wird jemand kontaktiert. Wieder eine offene Frage: Wie wird kontaktiert? Per Email, per SMS? Per Messanger (wie auch immer die heißen mögen)? Wie lange dauert es im Schnitt bis jemand auf die Nachricht reagiert und tatsächlich was tun kann? Und jetzt die einzig spannende Frage zu diesem Bild: Meint Ihr wirklich, dass bei einem produktionskritischen System wo Kunden drauf sind es um die 10 Minuten dauert bis die anrufen um sich zu beschweren, dass Sie nichts mehr arbeiten können? Exkurs Ende. Dienste überwachen ist wichtig. Nur braucht das allzu oft anzutreffende Zeitmodel wie gerade gezeigt eine dringende Überarbeitung. Es ist auf Dauer sehr ungünstig wenn die Kunden das bessere Monitoringsystem sind 😉

Hardware und Co.

Das mit den Diensten muss besser werden. Eine Möglichkeit das zu optimieren ist der Blick auf die Hardware. Was macht die CPU Auslastung? Wie voll ist die Festplatte? Wie steht es um den Arbeitsspeicher? Das sind sinnvolle Ergänzungen die einem helfen ein besseres Verständnis für die Last auf einem System zu bekommen. Und oftmals erhält man hier rechtzeitig Hinweise und kann agieren bevor was ausfällt. Ein Beispiel der von mir gerne verwendeten Hardware-Checks gibt es hier: Monitoring Linux Extended Memory.

Dienste 2.0

Schon wieder Dienste. Die hatten wir doch schon. Ja, zumindest einen Teil. Ich selbst bin riesengroßer Fan davon auch die andere Seite von den Diensten zu betrachten. Beispiel Webserver Apache: Das der Dienst verfügbar ist kann man mittels http bzw. https Anfrage an den Webserver prüfen. Kommt die erhoffte Webseite zurück ist alles gut. Nur was macht der Webserver eigentlich alles? Apache kennt einen Server Status der genau dies verrät. Ein Beispiel wie so etwas aussehen kann? Gibt es hier: https://exchange.icinga.com/dsbits/apache_serverstatus. Oder Du schaust in die angefügte Galerie: Dort sind ebenfalls ein paar Beispiele enthalten. Das habe ich unterm Strich für alles wo etwas mehr Last anliegt bzw. sehr, sehr produktionskritisch ist. Da sind neben dem Beispiel mit apache noch solche Dinge wie ISC DNS, Novell/NetIQ eDirectory, OpenLDAP, NFS-Server, GroupWise, Kopano usw. dabei. Selbst moderne Dateisysteme wie btrfs verraten einem beim genaueren Blick deutlich mehr Details zu ihren internen Vorgängen und Engpässen. Von Routern und Switchen gibt es über die VLANs kaskadierte Sichten zu den Netzwerkports. Netzwerk dicht? Ein Blick aufs Diagramm im Monitoring und sofort ist klar welche VLANs der Auslöser sind. Soviel dazu. Detailschärfe kann im Falles eines Falles das Leben so viel leichter machen. Kombiniert mit sinnvollen Limits und man wird rechtzeitig informiert bevor irgendetwas steht. Angenehmer Seiteneffekt dabei und nochmals am Beispiel apache: Der Server-Status wird ebenfalls via http/https aufgerufen. Also wenn das funktioniert, dann muss der Webserver als solches laufen. Der vorhin angesprochene Check auf http/https kann also weggelassen werden.

Fazit von Dienste 2.0: Mit geschickt gewählten Checks bleibt die Anzahl der Checks unverändert. Der Mehrwert an gewonnenen Informationen: Unbezahlbar 😉

Dienste 2.1

Was, schon wieder Dienste? Ja, bzw. ja... Zum Teil kann es lohnend sein Funktionsgruppen zu testen. Ich nenne das jetzt einfach mal so, folgende zwei Beispiele sollen erklären was ich meine: Eine der Basis-Datenbanken für eine große Softwarelösung sei die CRM-Datenbank mit den Adressdaten aller Kunden. Die ist so groß, dass die auf eigenem Blech läuft und sonst nichts macht außer CRM-DB. Über Webservices ist es möglich, dass externe Dritte Änderungen an den CRM-DB Einträgen vornehmen. Wenn es also funktioniert, dass über Webservices ein neuer Dummy-Kunde angelegt werden kann, dann muss auf dem Weg dazwischen alles funktionieren: Firewall, WAF, Webservices, die dortigen Applikationen und zu guter Letzt die CRM-DB selbst. Ein einziger Check, aber unterm Strich eine riesen große Fülle von Dingen die hierbei, wenn auch zum Teil indirekt, geprüft wurden. Geschickte Peformance-Daten hierbei erfasst und schon hat man eine Grundlage für die monatlichen SLA-Berichte an die Kunden. Monitoring kann Spaß machen. Beispiel 2: Eine Email von einem Server aus dem Internet an einen der via DNS gelisteten MX-Server übergeben und kurze Zeit später via IMAP bzw. GroupWare-Konnektor geprüft ob die Mail da ist. Bzw. Eicar-Testvirus (https://de.wikipedia.org/wiki/EICAR-Testdatei) oder GTUBE Spam-Email (https://de.wikipedia.org/wiki/GTUBE) verschickt - die sollten logischerweise nicht da sein oder in der Quarantäne wieder zu finden. So die Art. Weitere Details: Kopfkino. Mach was draus 😉

Es mag genug Szenarien geben wo so etwas sinnvoll ist. Vor allem wenn man es schafft aus den erfassten Daten noch zusätzliche Informationen wie zum Beispiel das angesprochene SLA-Reporting zu gewinnen.

Luxus

Neben dem bisher gezeigten kann ich noch mit folgenden Beispielen dienen die zum Teil für große Augen sorgen. Einfach mal ein Auflistung einiger Punkte was man so alles machen kann:

  • Für ein Email-Relay welches ausschließlich Emails im Namen von Kunden mit deren Domains versendet: Ein Check welcher prüft, dass die zugehörigen SPF-Records, sofern gesetzt, auch dieses Relay beinhaltet. Natürlich werden die Domains dynamisch ermittelt um bei Änderungen am Adresspool keine Änderung im Monitoring-System zu brauchen.
  • Gute Netzwerkdrucker haben die Möglichkeit via SNMP Daten bereits zu stellen. Toner bald leer, Papier aufgebraucht? Im ersten Fall eine Mail an die Materialwirtschaft damit rechtzeitig Nachschub bereit liegt, im zweiten Fall eine Mail an die Azubis den Papiervorrat wieder aufzufüllen. Und bei geleasten Geräten nebenbei die monatlichen Zählerstände an den Dienstleister versendet.
  • Via Montioring-API alle https-Webserver ermitteln und den SSL/TLS-Stack zu prüfen. Zum Beispiel hiermit: https://testssl.sh/. Mit geeigneter Monitoringsoftware kann der Link zum Bericht gleich noch bei den Check-Details mit eingefügt werden. Testssl kann dies darüber hinaus auch für SMTP-Server.
  • Für Webseitenentwickler ist der Pagespeed sehr wichtig. Warum externe Tools verwenden wenn man doch selbst die Time To First Byte (TTFB) überwachen kann?
  • Wir haben genügend Monitoring Checks die überprüfen wie die Hitrate eines Caches ist. Aber mal ehrlich, wer schaut da rein? Die zugehörigen Admins. Warum hier nicht gleichzeitig neben der Hitrate eine Empfehlung berechnen lassen auf welchen Wert man die dazugehörigen Einstellungen setzen müsste? Geheimnis ist das keins, die zugehörigen Formeln stehen oftmals im Handbuch des Servers. Macht das Admin Leben leichter da man nicht jedes mal selbst nach diesen Formeln die passenden Werte berechnen muss. Und dank Laufzeitdiagrammen hat man sogar noch eine Trendübersicht.

Und das waren nur ein paar Beispiele. Alles nur theoretischer Natur? Hab ich so bereits alles in der Praxis zum laufen gebracht - mehrfach zum Teil sogar. Da geht aber noch viel, viel mehr. Und bis jetzt ist das doch alles ok und alles andere als verwerflich. Was soll daran so böse sein wo man sich um Ethik und Moral Gedanken machen müsste? Nun ja, eins hat dies bisher gezeigt: Überwacht werden kann eigentlich so ziemlich alles. Und man kann richtig viel Information daraus gewinnen. Im nächsten Abschnitt gebe ich ein paar Bespiele was man sonst noch so machen könnte - wenn man wirklich wollte.

Very special Monitoring

Fangen wir mal hiermit an: In vielen mittleren und größeren Unternehmen gibt es Webproxys welche für das Surfen im Internet verwendet werden. Ohne Frage, dass Proxys eine Daseinsberechtigung haben und viele Vorteile mitbringen. Wenn dann auch noch solche Mechanismen wie Single-Sign-On (SSO) dazu kommen wird das richtig super in der Handhabe. Und im Hintergrund noch das Surfverhalten jedes einzelnen Mitarbeiters mit den gängigen Blacklists oder der firmeninternen Whitelist abgeglichen und schon hat man den "surft geschäftlich Quotient" ermittelt. Der ist über Tage hinweg zu tief? Automatische Meldung an den Abteilungsleiter und/oder ins Personalbüro.

Na und bei Email geht das sogar noch einfacher und braucht so zusätzliches Zeug wie SSO doch gar nicht. Die Absender- bzw. die Empfängeradresse ist doch eindeutig. Dazu noch rasch das Unternehmensadressbuch via passender API vom Groupware System abgerufen und abgeglichen. Und Tada: Brauchbare Zahlen über die sich jeder cholerische Personalchef freut!

Bei Dir gibt es eine elektronische Schließanlage? Na wunderbar, schon wieder genug Zahlenfutter welches mit den vereinbarten Arbeitszeiten abgeglichen werden kann.

Das folgende hatten wir mal als Aprilscherz in einer größeren Monitoringumgebung geplant. Auf jedem Arbeitsplatz lief hier Windows. Also via WMI oder Powershell-Remote von jedem Rechner ausgelesen wer angemeldet ist und ob der Bildschirmschoner läuft. Im Monitoring kann dadurch rasch geprüft werden ob es sich lohnt zu einem Kollegen los zu laufen oder ob man doch lieber noch etwas wartet. So in Analogie zur Trojan-Room-Kaffemaschine 😉 Details zu dieser gibt es zum Beispiel hier: https://de.wikipedia.org/wiki/Trojan-Room-Kaffeemaschine.

Das war noch nicht bedenklich genug? Bitte, da geht noch mehr! Aus den Informatonen lässt sich wunderbar eine effektive Arbeitszeit ermitteln. Ja, aber der Kollege könnte doch mal im Meeting sein oder am geschäftlich telefonieren... Und Du denkst das ist ein Problem? Fix im Groupware Terminkalender nachgeschaut ob ein Termin drin steht oder ob laut Telefonanlage der Anschluss gerade besetzt ist.

Apropos Telefonanlage: Du weißt ja, Anlagen zeichnen geführte Gespräche in der Anrufliste auf. Das Unternehmensweite Adressbuch hatten wir ja schon mal im Zusammenhang mit Email. Also fix die Telefonate gegen die Nummern aus dem Adressbuch abgeglichen und schwupp, schon wieder beim privat telefonieren erwischt.

Wer ein Ticketsystem verwendet kann hier zum Beispiel die Anzahl der gelösten Tickets pro Kopf ermitteln. Ok, jeder der darin arbeitet weiß, dass es Tickets gibt die rasch erledigt sind während andere schon mal etwas Hirnschmalz erfordern um gelöst zu werden. Moderne Ticketsysteme kennen aber die Quote der wieder geöffneten Tickets. Ebenso lässt die Anzahl der ausgetauschten Nachrichten je Ticket auf dessen Komplexität schließen. Also wieder eine messbare Eigenschaft über mehrere verknüpfte Werte. Fehlt noch der Bezugswert mit dem dieser Quotient verglichen wird. Da bietet sich zum Beispiel der Abteilungsschnitt an. Das hier keiner behaupten kann die Tickets der Vertriebsabteilung hätten eine andere Komplexität als die der IT-Abteilung. Und genau das ist doch der Punkt und die Lösung steckt bereits in der Behauptung drin: Dann vergleiche doch auf Abteilungsbasis. Oder was auch immer der gemeinsame Nenner bei Dir im Unternehmen ist. Ein paar Male in Folge im Monat als schlechtester Mitarbeiter gekürt oder im Jahresschnitt zu weit hinter den Kollegen zurück? Schon kommt der große Holzhammer vorbei...

Ja und für die Programmierer die sich gerade noch entspannt zurück lehnen: Meint Ihr nicht auch, dass dank Revisionskontrollsystemen sehr elegant ermitteln werden kann wie viel zum Gesamtquellcode von jedem Einzelnen beigetragen wurde? Jaha, aber das ist doch noch keine Aussage über die Qualität des Codes. Manche Zeilen sind viel härter erarbeitet als andere die locker von der Hand gehen. Das mag ja alles sein, aber schon mal was von Quellcode-Bewertungen gehört? So wie z.B. COCOMO? Siehe für allgemeines hier: https://de.wikipedia.org/wiki/COCOMO. Oder gleich noch ein passendes Tool gefällig? Das gibt es hier: https://github.com/boyter/scc. Die Best-Of Liste von unten her gelesen wird dann jeden Monat in der Toilette aufgehängt. Oder wie sagte mein alter Mathelehrer an der Oberstufe immer? "Einmal an der Tafel blamiert fördert die Arbeitsmoral!"

Fazit

"Diese Abmahnung wurde maschinell erzeugt und benötigt keine Unterschrift."  Dabei ging dieser Text doch nur der Frage nach was man denn so alles überwachen kann. Mit ein paar technischen Hinweisen wie man das umsetzen könnte. Hier wird global auf individueller Ebene entschieden ohne Rücksicht darauf ob die erfassten Daten für die gerade im speziellen betrachtete Situation überhaupt vollständig sind. Um im Bild der Zeit zu bleiben wird das Ergebnis per sozialem Netzwerk an der jeweiligen Pinnwand aufgehängt. Unbequeme persönliche Kommunikation mit Konfliktpotential? Wo denkst Du hin? Der Flame War der einem entgeht wäre zu schön gewesen. Als IT-Administrator und vor allem auch als IT-Verantwortlicher sollte man sich die richtigen Fragen stellen. Sei Dir bewusst was Du tust und kenne die Konsequenzen. Bekenne Dich zu dem was wirklich richtig ist. Sei mutig. Sage "nein" wenn es sein muss. Auch oder gerade deswegen im IT-Umfeld. Ethik und Moral.

Postfix: IPv6 oder IPv4?

Postfix: IPv6 oder IPv4?

Mal wieder ein Problem zum Thema Email und Postfix. Neulich erst SMTPUTF8, jetzt wieder etwas was sich der Admin vor Ort nach Erklärungen und Lösungen sucht.

Fortune hat einmal zu mir folgendes gesagt:

The light at the end of the tunnel may be an oncoming dragon.

Für alle diejenigen die fortune nicht kennen: https://de.wikipedia.org/wiki/Fortune_(Computerprogramm).

Achtung!

Man sollte natürlich richtig prüfen, ob die IPv6 Auflösung eventuell sogar wirklich ein Problem hat. Da die Frage aufkam hier das grobe Vorgehen dazu: In der Fehlermeldung steht eine IPv6 Adresse drin. Diese per Reverse-DNS auflösen. Der Rechnername, der hierbei raus kommt sollte via Forward-DNS wieder zur gleichen IPv6 Adresse führen. Unterm Strich genauso, wie es auch für IPv4 der Fall sein sollte. Bitte dran denken. Nur wenn das alles passt und immer noch nichts hilft, dann kann dieses vorgehen wie hier beschrieben eine sinnvolle Variante sein.

Das Spiel beginnt

Bevorzugt kommen solche Fragen ja immer am spätem Nachmittag rein. Mal wieder das Thema Email. Mal wieder auf den ersten Blick dubios: Angeblich kann ein Emailserver keine Mails an eine bestimmte Empfangsdomain senden. Als Grund wird der fehlende Reverse DNS-Eintrag angegeben. Dieser ist aber gesetzt. So auf die schnelle passt hier irgendwas nicht zusammen, der detailliertere Blick ins Protokoll muss her. Hier findet sich folgendes - stark gekürzt und anonymisiert. Du weißt schon, Datenschutz und so 😉

May  7 14:12:37 methusalix postfix/smtp[587]: 0D2B11E0027: to=<emfp@aeng.er>, relay=mail.gatew.ay[1.1.1.1]:25, delay=0.57, delays=0.02/0.01/0.33/0.21, dsn=2.0.0, status=sent (250 OK id=1hNyxZ-00061t-DZ)
May  7 14:12:37 methusalix postfix/smtp[587]: 9600B1E0028: to=<emfp@aeng.er>, relay=mail.gatew.ay[1.1.1.1]:25, delay=0.35, delays=0.01/0/0.22/0.12, dsn=2.0.0, status=sent (250 OK id=1hNyxZ-00068z-RW)
May  7 14:13:23 methusalix postfix/smtp[587]: EAE621E0028: to=<emfp@aeng.er>, relay=mail.gatew.ay[1.1.1.1]:25, delay=0.4, delays=0.01/0/0.21/0.18, dsn=2.0.0, status=sent (250 OK id=1hNyyJ-0007Tp-6X)
May  7 14:55:19 methusalix postfix/smtp[6340]: A672D1E0027: to=<emfp@aeng.er>, relay=mail.gatew.ay[1.1.1.1]:25, delay=0.65, delays=0.01/0/0.5/0.14, dsn=2.0.0, status=sent (250 OK id=1hNzct-0006QR-6i)
May  7 15:13:07 methusalix postfix/smtp[8811]: 6C1A31E0027: to=<emfp@aeng.er>, relay=mail.gatew.ay[1:1:1:1::1:1]:25, delay=0.39, delays=0.03/0.01/0.32/0.03, dsn=5.0.0, status=bounced (host mail.gatew.ay[1:1:1:1::1:1] said: 550-Inconsistent/Missing DNS PTR record (RFC 1912 2.1) 550 (methusalix.doma.in) [1:1:1:1::1]:44636 (in reply to RCPT TO command))

Aha... 4x geht es und einmal nicht. Was bei dem einen Versuch anders ist? Der war per IPv6, die anderen via IPv4. Ok, das mag ja jetzt sein: Reverse-DNS für IPv4 gesetzt, für IPv6 schlichtweg vergessen. Fix via host-Befehl im DNS abgefragt auf die IPv6 Adresse die laut Log keinen Reverse Eintrag haben soll: Oh wunder, der ist richtig auflösbar. Ab jetzt wird es seltsam. Aber wie so oft: Erstmal muss eine Lösung her. Die Suche nach der Ursache wird mal wieder hinten angestellt.

Also gut, das hier ist ganz klar ein Fall für den Blick in die Postfix Dokumentation bzw. in die aktuelle Konfiguration.

Recent Postfix SMTP clients randomly select between IPv4 and IPv6 so that mail won't get stuck when one of the two is down.

Wietse Zweitze Venema
Programmierer und Physiker

smtp_address_preference = any ist wie es sich gehört richtig gesetzt. Das macht so einfach mit am meisten Sinn und wird in der Dokumentation letztendlich genauso empfohlen. inet_protocols brauche ich gar nicht zu kontrollieren, muss auf any stehen. Sonst hätte es gar nicht die beiden unterschiedlichen Zustellvarianten geben dürfen. Um jetzt zu verstehen was da passiert sollte man die Doku kennen oder sich an das im Block links angeführte Zitat von Wietse erinnern.

Somit ist die Lösung für dieses Rätsel fix gefunden: Für diese eine Empfangsdomain sollte der Emailausgang ausschließlich auf IPv4 festgelegt werden. Nur kennt Postfix keine inet_protocol_map in der man dies festlegen könnte. Es ist also mal wieder die Frage nach etwas Kreativität um eine passende Lösung mit Postfix Mitteln entsprechend abzubilden.

Und der Weg zum Ziel ist unterm Strich mal wieder ganz einfach: Man definiert in der master.cf einen weiteren smtp Dienst welcher als Option das oben bereits erwähnte inet_protocols = ipv4 hat. Im zweiten Schritt noch fix einen passenden Eintrag für die Zieldomain in der transport Tabelle gesetzt welche genau diesen Dienst verwendet und voilà: Ziel erreicht.

Die Umsetzung

Die folgenden Beispiele zeigen an reinen Textdateien unter /etc/postfix die passende Konfiguration für die Empfängerdomain gehirn-mag.net. Wer dort bereits eine transport-Tabelle hat kann diese selbstverständlich nutzen. Wer ein Datenbank- oder LDAP-Backend hat kann diese Lösung sinngemäß übertragen. Hier aber, der Einfachheit wegen, das Beispiel an den "blanken" Textdateien. Und Du solltest logischerweise die Empfängerdomain richtig anpassen 🙂

Die erste Datei die geändert wird ist /etc/postfix/master.cf. Hier wird ein weiterer Dienst eingetragen. Eine Zeile analog zur ersten gibt es bereits. Wichtig ist, dass zu Beginn am Anfang und am Ende smtp steht und kein smtpd. Diese kopiert ihr, ändert den Namen (Zeile 2, Spalte 1) und fügt darunter den Inhalt der Zeile 3 ein.

Als nächstes ist /etc/postfix/main.cf dran. Hier ist zu prüfen ob es eine transport_maps Zeile gibt. Falls nicht fügt Ihr diese einfach ein.

Und zu guter Letzt ist die transport Tabelle /etc/postfix/transport selbst. Hier ist der Eintrag für die Zieldomain zu setzen, dass diese unseren neuen IPv4 smtp Dienst verwendet.

smtp      unix  -       -       y       -       -       smtp
smtp-ipv4 unix  -       -       y       -       -       smtp
    -o inet_protocols=ipv4
transport_maps = hash:/etc/postfix/transport
gehirn-mag.net           smtp-ipv4:

Nun müsst Ihr noch via postmap /etc/postfix/transport diese für postfix übersetzen und mit postfix reload den Mailserver neu starten. Postfix versendet nun für Eure Zieldomain alle Mails dorthin via IPv4 anstatt frei zu wählen was er jetzt verwenden könnte.

Und fertig!

Was eine Lösung. Ist das wirklich elegant gemacht auf diese Art und Weise? Ja, das ist Sie. Auf ihre ganz spezielle Art. Einen eigenen Dienst in der master.cf anzulegen macht man eigentlich öfters. Am häufigsten wohl als Ziel für irgendwelche Postfachsysteme wie IMAP/POP3 oder Groupware-Systeme. Wenn man diese externe Domain mit der sinngemäßen gleichen Logik betrachtet ist das schon sehr ähnlich: Ein Postfachspeicher welcher Emails via SMTP annimmt und obwohl er eine IPv6 Adresse hat kann der Dienst aber nur IPv4. Ich betreue Postfix Umgebungen bei denen aufgrund von der Vielzahl und der Größe der dahinter liegenden Groupware Lösungen die transport-Tabelle länger ist bei vielen anderen Installationen die virtual-Tabelle. Da erlebt man noch ganz andere Dinge...

In größeren Emailumgebungen ist man gefühlt nie am Ende mit der Konfiguration angekommen. Man mag sich in dem zu Beginn angesprochenen Tunnel fühlen. Sobald die Ursache aber sauber erfasst wurde ist die Lösung des Problems rasch erledigt und das Ende des Tunnels naht. Bis zum nächsten Anruf 😉

Aber morgen kontaktiere ich erstmals den Emailadmin auf der anderen Seite und frage nach den Gründen für diese Fehlermeldung - Feierabend für heute.

Quellen

  • GNU Bild: Wikimedia - kann aber genauso gut auf gnu.org direkt gezogen werden
  • Wietse Bild: Wikimedia - public domain
Das xn--mrchen-bua vom Punycode…

Das xn--mrchen-bua vom Punycode…

Ich erzähl euch mal eine kurze Geschichte: Heute am späten Nachmittag ereilte mich der Hilferuf eines befreundeten Emailadmins. Einer seiner Mailserver, zugegen einer auf dem recht wenig los ist, nimmt keine Emails mehr an. "Relay Access Denied" steht da im syslog drin. Ok, etwas genauer darauf geschaut: Das trifft nur auf die Emails zu die von Gmail kommen. Alles andere, wenn mal was vorbei kommt, läuft "richtig" durch. Eine Besonderheit der Empfangsdomain: IDN, Punycode, SMTPUTF8 und kein ASCII. Oder, ganz anders ausgedrückt "German umlaut in the domain name". Seit RFC-6530...6533 soll das ja kein Thema mehr sein. Siehe z.B. hier: https://tools.ietf.org/html/rfc6531 - das ist wohl das RFC wo der interessanteste Teil zu den Grundlagen von SMTPUTF8 drin steht.
 
In der Postfix-Doku ist ganz gut erklärt warum Postfix sich schwer damit tut zu erahnen ob eine Domain jetzt UTF8 oder ASCII ist und was das für Seiteneffekte mit sich ziehen kann. Siehe hierzu http://www.postfix.org/SMTPUTF8_README.html#detecting sowie die darauf folgenden Abschnitte. Unterm Strich sollte das aber keine große Hürde darstellen - mag man meinen.
 
Per telnet fix nachgeschaut:
telnet <bla.blubb> 25
Trying 253.254.255.256..
Connected to <bla.blubb>.
Escape character is '^]'.
220 <bla.blubb> ESMTP Try me, beat me!
ehlo duda
250-<bla.blubb>
250-PIPELINING
250-SIZE 31457280
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
quit
221 2.0.0 Bye
 
Alles gut, SMTPUTF8 steht mit drin. Und ja, im Postfix Log steht die Emailadresse je nach Modul mal als UTF8 oder als ASCII drin - siehe oben, der Link zum Readme. Aber irgendwie, Relay Access Denied. Trotz allem. Hm... Während die Gedanken sich so winden: Kleiner Online-Konverter gefällig mit dem der Titel dieses Textes zurück nach ASCII übersetzt werden kann? Bitte schön, gibt es hier: http://unicode.org/cldr/utility/idna.jsp. Aber zurück zum eigentlichen Thema, wir waren beim Hm... stehen geblieben. Dort läuft noch ein amavisd-new-milter. Ob der was damit zu tun haben kann? Laut https://www.ijs.si/software/amavisd/release-notes.txt nein, der soll alles richtg können (Achtung, bei dem Link hab ich gerade ein SSL-Zertifkatsfehler ignorieren müssen). Fix via telnet nachgeprüft - lief hier auf dem üblichem Amaivs-Port 10024: SMTPUTF8 taucht in der Liste erwartungsgemäß auf.
 
Bleibt noch der letzte Beteiligte in der Kette: Dovecot LTMP. Kann der mit SMTPUTF8 umgehen? Eine eindeutige Aussage dazu habe ich nicht gefunden. Also falls Ihr was finden solltet wo eindeutig drin steht "ja, das geht" oder "nein, das geht (noch?) nicht": Nur her damit!
 
Jetzt mal ernsthaft und das ganze Bild nochmals komplett betrachtet: Andere Emails kommen an. Und die haben kein Problem mit dem Umlaut in der Domain. Nur die von Gmail nicht. Ggf. auch noch von ein paar weiteren, da ist bloß bisher noch nichts aufgefallen. So muss Gmail hier als stellvertretendes Beispiel dienen. Was macht in diesem Falle hier Gmail anders als der Rest? Das Internet schweigt sich aus. Nur wenig lässt sich finden wo das exakt gleiche Problem beschrieben wird. Lösungen fehlen aber. Gefühlte tausende Logzeilen von Postfix im Debug Modus später und zwar das Problem immer weiter eingekreist auf das oben beschriebene aber keine Lösung gefunden. Doch Moment mal: Das Problem ist doch wohl der Natur, dass die Ursache im Umlaut, also SMTPUTF8 liegen muss. Es ist ja nun mal so, dass einige Emails ankommen obwohl die Domain einen Umlaut hat. Was ist wohl bei denen anders als bei denen die nicht ankommen? So langsam wird es zwingend logisch was bei denen anders sein muss. Na, schon die passende Idee dazu? Ich hab es einfach gleich mal ausprobiert und in die main.cf von Postfix folgendes eingetragen: "smtputf8_enable = no". Per telnet geprüft: SMTPUTF8 fehlt. Und siehe da: Die Emails von Gmail kommen an. Da jetzt kein SMTPUTF8 mehr angeboten wird übergibt Google die Mails in ASCII-Darstellung. Und schon klappt alles wie erwartet. Google scheint, wenn es die Gegenseite anbietet, doch tatsächlich SMTPUTF8 zu nutzen. Und ist damit wohl noch einer der wenigen die das so tun.
 
Freundlicherweise hab ich ja noch ein paar Appliances von namhaften Herstellern im Angebot wo man via telnet auf den SMTP-Port mal rasch prüfen kann was die so tun: Kein SMTPUTF8. Ok, die werden wohl wissen warum. Das weiß ich jetzt ebenfalls.
 
Aber irgendwie bleibt ein ungutes Gefühl bei der ganzen Sache. Die Durchdringung von Umlautdomains ist wohl doch noch nicht so weit wie man denken mag. Wirklich toll ist das nicht. Ich freue mich schon, oder auch nicht, wenn der erste Kunde kommt der bei diesem Mailhoster aus Redmond liegt. Wo dem Namen nach die Kunden das ganze Jahr lang jeden Tag im Büro verbringen. Und wenn dann dieser Kunde sagt er hat eine Umlaut-Domain: An dem Tag hab ich vermutlich Urlaub...
 
 
VM unter VMware ESXi in anderen Datastore umziehen

VM unter VMware ESXi in anderen Datastore umziehen

Eine bereits vorhandene VM soll innerhalb eines einzelnen ESXi-Servers in einen anderen Datastore umziehen. Da der ESXi ohne zugehöriges vCenter betrieben wird ist hier Handarbeit angesagt.

Ein denkbarer Lösungsansatz wäre sich via SSH zu verbinden und die Daten zwischen den Datastores via cp zu kopieren (bzw. mit mv zu verschieben). Der alternative Weg über die vmdkfstools spart jedoch reichlich Zeit. Darüber hinaus kann die Zielplatte via thin-provisioning bereit gestellt werden.

Beim Schreiben dieser kurzen Anleitung habe ich VMware ESXi 6.7.0 verwendet. Dies funktioniert sinngemäß aber genauso auf älteren Versionen.

Prolog

Notwendige Arbeitsschritte

  1. VM anhalten - egal ob über Betriebssystem in VM oder dem virtuellen Ausschalteknopf
  2. ggf. Snapshots zusammen fassen. Wenn man diese eh nicht mehr braucht spart das einfach nur Zeit diese bereits jetzt zusammen zu fassen (rechte Maustaste auf VM/Snapshots/Snapshots verwalten und hier entfernen)
  3. Registrierung der VM aufheben (rechte Maustaste auf VM/Registrierung aufheben)
  4. Zugriff via SSH ermöglichen (Host/Verwalten/Dienste/SSH starten)
  1. Login via ssh
  2. Neues Verzeichnis für die Ziel-VM anlegen: mkdir "/vmfs/volumes/<Ziel Datastore>/Some VM"
  3. Alle Platten wie folgt übernehmen: vmkfstools -i "/vmfs/volumes/<Quell Datastore>/<VM Name>/<Platte>.vmdk" -d thin "/vmfs/volumes/<Ziel Datastore>/<VM Name>/<Platte>
    VM.vmdk"
  4. Alle übrigen Dateien außer den vmdk-Daten kopieren: find "/vmfs/volumes/<Quell Datastore>/<VM Name>" -maxdepth 1 -type f
    -print | grep -v ".vmdk" | while read file; do cp "$file"
    "/vmfs/volumes/<Ziel Datastore>/<Ziel VM>"; done
  5. Snapshots während der Vorbereitung nicht aufgelöst? Dann sollten jetzt die Snapshot vmdk Delta-Daten kopiert werden: find "/vmfs/volumes/<Quell Datastore>/<VM Name>" -maxdepth 1 -type f
    -print | grep
    [0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]
    | grep ".vmdk" | while read file; do cp "$file"
    "/vmfs/volumes/<Ziel Datastore>/<VM Name>"; done
    Aber Achtung: Dies kann durchaus dauern. Das kommt auf die Anzahl der Snapshots und deren Größe drauf an 😉
  1. VM registrieren. Sofern noch via SSH verbunden geht dies so: vim-cmd solo/registervm "/vmfs/volumes/<Ziel Datastore>/<VM Name>/<VM Name>.vmx"
    Ansonsten geht dies auch über die UI: Speicher/<Ziel Datastore>/Datenspeicherbrowser und hier die passende vmx-Datei suchen, rechte Maustaste/VM registrieren
  2. VM starten (Die Frage nach kopiert oder verschoben sinngemäß richtig beantworten)
  3. Testen
  4. Falls alles ok: Alte VM löschen, z.B. via Datenspeicherbrowser oder via SSH mit rm -rf "/vmfs/volumes/<Quell Datastore>/<VM Name>"
  5. Ggf. den Zugriff via SSH wieder deaktivieren.
Einmal Emails in Kopano Unterordner bitte

Einmal Emails in Kopano Unterordner bitte

Kopano ist eine wunderbare Collaboration-Lösung welche mich schon seit vielen Jahren begleitet und welche ich bereits bei vielen zufriedenen Kunden erfolgreich installiert habe. Nur eins hat mich über die Jahre immer und immer wieder gestört: Benutzer werden per LDAP verwaltet, Berechtigungen, Adressbücher usw. ebenso. Nur die Zuordnung von Emailadressen an Ordner damit Mails an diese Adressen immer in den entsprechenden Ordner landen anstatt im Posteingang wird stiefmütterlich behandelt.

Lösungsansätze

Natürlich gibt es für dieses Problem mehrere Lösungsansätze. An dieser Stelle will ich verschiedene Lösungsansätze zeigen und diese mit einem kurzen für und wider gegeneinander stellen. Als Ausgangsbasis dient die in der Kopano Dokumentation beschriebene postfix Integration: https://documentation.kopano.io/kopanocore_administrator_manual/configure_kc_components.html?highlight=postfix#postfix-integration.

Du suchst die "ultimative" Lösung? Dann lies bitte sofort bei "Lösung 4" weiter. Du hättest gerne die Konfigurationen im Detail zu den Lösungen 1 bis 3.5? Dann melde Dich bei mir. Ich habe diese Details hier weggelassen um den Text nicht noch weiter aufzublähen.

Lösung 1: Regeln

In den Einstellungen der webapp oder deskapp können Regeln hinterlegt werden. Eine passende Regel sieht zum Beispiel so aus:

Falls die Nachricht enthält diese Wörter in den transport-headern "info@gehirn-mag.net" Folgende Aktion ausführen Nachricht in Ordner verschieben Gehirn-Mag.Net/Info

Damit die Emailadresse info@gehirn-mag.net bei mir überhaupt ankommt wird diese als kopanoAliases im LDAP eingetragen. Das funktioniert. Nur zentral verwaltet ist was anderes und da ich Fan vom LDAP bin finde ich dies wenig praktikabel. Zumal das für private Ordner ganz nett sein mag. Nur welchem Benutzer ordne ich so eine Regel sinnvoll zu wenn das Ziel ein öffentlicher Ordner sein soll? Nein, diese Lösung überzeugt mich nicht wirklich. Also auf geht es zur Lösung Nummer 2.

Details zu den Regeln gefällig? Die gäbe es hier: https://documentation.kopano.io/user_manual_webapp/settings.html#rules

Lösung 2: procmail

Die eierlegende Wollmilchsau Lösung. Mit procmail kann wirklich ein Regelwerk mit allem Schnick und Schnack erstellt werden. Ein Beispiel könnte wie folgt aussehen:

# Privat Einkaufen: Hibike, ...
:0H
* ^From:.*(newsletter@newsletter.*\\.hibike\\.com|news@news\\.bike-discount\\.de)
| /usr/bin/zarafa-dagent -p / -F "Posteingang/Newsletter/Einkaufen" steffen

Das Beispiel stammt noch aus Zeiten wo Kopano als Zarafa bekannt war und zeigt einen kurzen Einblick in meine privaten Hobbys. Aber egal, als Beispiel absolut ausreichend. Jetzt noch Postfix dazu gebracht, dass er die Mails für die im ersten Beispiel verwendete info@gehirn-mag.net Adresse an procmail übergibt oder falls fetchmail verwendet wird dort als mda eintragen. Egal, irgendwie die Mails an procmail übergeben. Wie ist hier nicht das Thema. Aber mal ehrlich: Hierfür muss ich eine Konfig-Datei im Dateisystem bearbeiten. Das ist ebenfalls nicht das was ich unter zentralem Management an einem Ort wie LDAP verstehe. Wenn ich schon Benutzer in LDAP verwalten tue, dann doch auch bitte mein Problem mit der Zustellung an Ordner.

Also das Fazit zur dieser Lösungsvariante: Toller Funktionsumfang. Was hier nicht mit einem Filter erfasst werden kann geht sonst auch nirgends. Falls die Emails von Dritten via POP3 oder IMAP abgeholt werden müssen hat dies Lösung im Zusammenspiel mit fetchmail einen ganz speziellen Charme. Aber: Eine Konfigurationsdatei anpassen zu müssen sobald sich was ändert ist nicht mein Ding. Nette Lösung, nur leider für mich alles andere als perfekt.

Lösung 3: Ein Hilfsskript verwenden

Bisher waren alle Lösungen noch weit von dem entfernt was ich Lösungsansatz via LDAP genannt hätte. Aber mit Zuhilfenahme von zusätzlichen Skripten lässt sich hier sicherlich was machen. Also fix los programmiert - die erste Fassung welche hierbei entstanden ist war fast so alt wie Zarafa selbst.

Der Gedanke dazu war wie folgt: Wenn die Email für einen öffentlichen Ordner an ein Skript übergeben wird kann dieses im LDAP nachschlagen in welchen Ordner die Email zu legen wäre. Das funktioniert, braucht aber zusätzliche Perlskripte. Ok, mit etwas Aufwand könnte man aus den zwei sicherlich eins machen. Ändert nichts daran, dass man zusätzliche Skripte braucht.

Ich habe die Skripte von damals noch auf die multi-tenancy Variante erweitert und unter https://gitlab.com/Gehirn-Mag.net/kopano-delivery-to-folders abgelegt.

Aber mal ehrlich: Das funktioniert zwar, aber der Aufwand ist hoch. Geht noch einfacher wie die folgenden Beispiele zeigen.

Zwischenlösung 3.5: Direkt in postfix

Naja, der Umweg über procmail mag viel Luxus bringen. Der über das eigene Skript die Möglichkeiten zu tun was man will. Nur braucht man dies nicht immer. kopano-dagent kann auch direkt aus postfix heraus gestartet werden. Das ist schlank, einfach und mehr braucht es in der Regel auch gar nicht.

# Info-Postfach
gehirnInfo unix - n n - - pipe
    flags=DORhu user=kopano:kopano argv=/usr/sbin/kopano-dagent admin@gehirn-mag.net -v -C -p / -F Gehirn/Info

Dies funktioniert wunderbar. Die Emailadresse admin@gehirn-mag.net muss es natürlich geben und diese muss im Ordner Gehirn/Info schreiben dürfen. Im LDAP leitet man die entsprechenden Adressen einfach nach gehirnInfo: um. Infos zum postfix pipe Prozess gibt es hier: http://www.postfix.org/pipe.8.html. Doch Moment: Das soll flexibel sein? Wohl eher nicht, der Zielpfad steht ja statisch in der master.cf mit drin. Und genau das ist der Haken an der Sache. Sollte es sich um eine "kleine" Installation handeln wo nur ein paar wenige Adressen in Ordner umgeleitet werden mag das absolut ausreichend sein. Sobald es aber mehr werden oder diese Umleitungen einer gewissen Dynamik unterliegen stößt diese Variante an Ihre Grenzen. Der Zwischenschritt ist dennoch gut und führt uns direkt zur perfekten Lösung welche sich mit minimalen Aufwand realisieren lässt.

Zuviel Log-Ausgaben im mail Log? Dann entferne das -v aus der Argumenten-Liste von kopano-dagent.

Lösung 4: Direkt in postfix mit Dynamik via LDAP

Noch mal schnell in die Doku von postfix pipe rein geschaut: "${nexthop} This macro expands to the next-hop hostname". Na das ist es doch! Also kurz die master.cf entsprechend anpassen.

# Kopano an public Ordner
kpublic unix - n n - - pipe
    flags=DORhu user=kopano:kopano argv=/usr/sbin/kopano-dagent admin@gehirn-mag.net -v -C -p / -P ${nexthop}

Das funktioniert ähnlich zur obigen Lösung unter 3.5. Nur steht als Zielordner hier das Makro ${nexthop} welches via LDAP als Wert nach "kpublic:" eingetragen wird. Auch hier sollte es die Emailadresse admin@gehirn-mag.net entsprechend mit den passenden Rechten für den Zielordner geben.

Dies funktioniert natürlich auch mit einem privaten Ordner. Dazu muss lediglich das -P durch ein -F ausgetauscht werden und die Emailadresse auf die des jeweiligen Benutzers getauscht werden. Aber Achtung: Für jeden Benutzer braucht man hier einen eigenen Eintrag in die master.cf von Postfix. Zu umständlich wenn wir es genau betrachten und somit in den Regeln des jeweiligen Kopano Benutzers besser aufgehoben.

Als LDAP-Schema verwende ich wieder das von Lösung 3: https://gitlab.com/Gehirn-Mag.net/kopano-delivery-to-folders/blob/master/sitsPostfixTable.ldif. Letztendlich kann man aber nehmen was man will bzw. ein anderes, unbenutztes Feld zweckentfremden.

dn: PTransSrc=offen@gehirn-mag.net,ou=Gehirn-Mag.Net,...
objectClass: sitsPostfixTransport
objectClass: top
PActive: TRUE
PTransDest: kpublic:Gehirn-Mag.Net/Offen
PTransSrc: offen@gehirn-mag.net

Die dazu passende LDAP Konfig Datei für postfix ldap.kopano-folders.conf:

#
# virtual LDAP Map for Kopano (PTransSrc für Ordner-Ablage)
#

server_host = ldap:///
start_tls = yes
search_base = ou=CharlieB.Schoch-IT.Solutions,dc=Schoch-IT,dc=Solutions
bind_dn = cn=postfix,...
bind_pw = ...

query_filter = (&(objectClass=sitsPostfixTransport)(PTransSrc=%s)(PTransDest=kpublic:*)(PActive=TRUE))
result_attribute = PTransDest

debuglevel = 0

Diese Datei muss dann noch in der main.cf von postfix den virtual mailbox maps hinzugefügt werden:

virtual_mailbox_maps =
  ldap:/etc/postfix/ldap.dovecot-virtual-users.conf,
  ldap:/etc/postfix/ldap.kopano-virtual-users.conf,
  ldap:/etc/postfix/ldap.kopano-folders.conf,
  ldap:/etc/postfix/ldap.kopano-groups.conf

Wie Du sehen kannst habe ich neben den Kopano-Benutzern auch noch die Gruppen aktiv und jetzt den Transport in den öffentlichen Ordner. Darüber hinaus gibt es bei mir auf diesem Server noch einen Dovecot für die reinen IMAP-Postfächer. Dieser Eintrag muss von Dir logischerweise sinnvoll angepasst werden.

Wie man dovecot und kopano-gateway auf der gleichen Adresse mit den gleichen Ports betreiben kann verrate ich Dir in einem der nächsten Blog-Beiträge 😉

Auf der Suche nach anderen Stellen im Internet die diesen Weg beschreiben habe ich die Doku von LECKERBEEFde gefunden. Zwar funktioniert die Homepage nicht mehr, aber den GitHub Eintrag gibt es noch: https://github.com/LECKERBEEFde/zarafa-deliver-mail-to-public-folder. Wie Du am Link erkennst bezieht sich diese Doku noch auf Zarafa. Das macht aber rein gar nichts, die lässt sich super einfach in Richtung Kopano umbauen. Und LECKERBEEFde verwendet ein Windows Active Directory. Da er sich nicht die Mühe gemacht hat ein spezielles Schema zu erstellen tut er, wie angesprochen, ein vorhandenes Feld für seine Zwecke "verwenden". Eine tolle Doku welche wirklich zu lesen lohnt.

Lösung 5: Kopano dagent Plugin

Wie, es gibt noch eine Lösung 5? Natürlich und die will ich Dir auch gar nicht vorenthalten. Ganz so egal ist Kopano das Thema Zustellung an den öffentlichen Ordner nämlich gar nicht. Hier mag die Einleitung etwas anderes suggeriert haben, deswegen nochmals der Hinweis: Es gibt einen Lösungsweg und der steht sogar im Handbuch: https://documentation.kopano.io/kopanocore_administrator_manual/special_kc_configurations.html#move-to-public. Dazu wird kopano-dagent über ein Plugin erweitert und eine Konfigurationsdatei entsprechend bearbeitet. Selbstverständlich funktioniert auch dies wunderbar!

Nun mein persönliches Fazit dazu: Eigentlich wollte ich die Zustellung an die öffentlichen Ordner via LDAP verwalten anstatt wie hier in einer Konfigurationsdatei. Also eine funktionierende Lösung die jedoch eine andere Strategie verwendet wie die von mir gewünschte. Die ist gut weil Sie funktioniert. Nur nichts für mich.

Du hast nur eine kleine Installation? Du editierst eine einfache Text-Konfigdatei lieber als LDIF-Daten? Du suchst eine Lösung die offiziell von Kopano angeboten wird? Dann bist Du hier genau richtig!

Fazit

Lösung 4 ist wunderbar. Sie ist schlank, einfach und schlichtweg elegant. Der zusätzliche Aufwand ist kaum nennenswert wenn man ohnehin dabei ist postfix mit Kopano zu verbinden. Einmal eingerichtet lässt sich das Verhalten komplett via LDAP beeinflussen. So macht es Spaß. Das ist schnell erledigt.

Was ich mir jetzt noch für die Zukunft wünschen würde und da schließt sich der Kreis zur Einleitung: Hinweise in der Kopano Dokumentation wie man dies macht wären super, richtig nett wäre die Erweiterung des Kopano LDAP Schemas um ein passendes Feld. Aber: Genau genommen ist diese Lösung schnell im Internet recherchiert oder durch das Studium der postfix Dokumentation rasch hergeleitet. Der Mehraufwand ist kaum nennenswert. Die Kopano Dokumentation ist meiner Meinung nach eher als Lösungsansatz zu verstehen da es zu viele verschiedene Umgebungen mit ihren ganz besonderen Eigenschaften gibt. Diese kleine zusätzliche postfix Anpassung fällt somit unterm Strich kaum ins Gewicht.

Und vergessen wollen wir nicht, dass es sehr wohl einen Kopano-Lösungsweg gibt. Nur finde ich persönlich, dass dieser nicht ganz in die Zeiten von LDAP-Bäumen, egal ob openLDAP, eDir oder Windows AD passt.

Darüber hinaus zeigt sich meiner Meinung nach noch ein ganz anderer wichtiger Aspekt: Kopano wirbt immer damit wie gut die Lösung in bestehende Strukturen integriert werden kann. Integration bedeutet Schnittstellen zu haben. Diese sind entsprechend dokumentiert und somit finden sich in kürzester Zeit verschiedene Lösungsansätze. Siehe oben. Das ist mal richtig toll! Leider gibt es viele andere Software da draußen wo man nicht mal einen Lösungsansatz finden würde...

Monitoring Linux Extended Memory

Monitoring Linux Extended Memory

Das Monitoring des Arbeitsspeichers eines Linux-Systems ist mühselig: Der physikalische RAM ist immer voll, die Auslagerungsdatei alleine betrachte keine wirklich genaue Aussage.

Also mal wieder Monitoring. Du merkst schon, dass ist ein Thema das mich immer wieder beschäftigt. Ein Dauerbrenner. Und immer wieder erstaunlich: Es gibt schon so viele Checks. Einige sind richtig gut. Und dennoch können einige davon noch weiter verbessert werden. Vieles fehlt dennoch. Oder die Dinge wurden nicht tief genug ausgewertet. Genauso erging es mir bei der vordergründig simplen Frage: "Wie viel des Arbeitsspeichers eines Linux-Servers ist denn tatsächlich noch frei?"

Prolog

Es ist nun mal so, dass auf einem Linux Server sobald dieser etwas zu tun hat der physikalische Arbeitsspeicher fast immer voll ist. Buffers und Festplattencache füllen, sinnvollerweise, den eigentlichen freien Speicher fast komplett aus. Eine Betrachtung der noch freien Bytes? Bringt nichts da keine sinnvolle Aussage möglich. Freie Bytes zuzüglich Buffers und Cache als Summe betrachtet? Schon besser. Aber nicht wirklich gut. Den diese Summe könnte immer noch kleiner als der belegte Bereich im Swap sein.

Eine gern genommene Notlösung da der RAM eh immer voll ist: Die reine Betrachtung des Swaps. Wenn dieser sich füllt hat der Server zu wenig RAM. Das mag für viele Systeme soweit ganz gut passen. Aber genau ist was anderes und was ist mit denen wo das so nicht stimmt? Ein Server bei dem zwar der Swap sehr voll ist, die Summe von Buffers, Festplattencache und physikalisch frei aber um etliches größer? Das kommt öfters vor als man zunächst denken mag. Stichwort "swappiness" falls Du danach suchen magst 😉

Dieser Check hat schon ein paar Jahre hinter sich, funktioniert aber immer noch sehr gut. Und da mir vor kurzem eine Frage in genau diese Richtung gestellt wurde habe ich den alten Quellcode genommen, etwas aufgehübscht, MIT-Lizenz rein und frei zur Verfügung gestellt. Und so sieht das Ergebnis in Icinga aus - inkl. dem passenden pnp4nagios Template:

extmem in icingaweb2

extmem in icingaweb2

extmem performance data

extmem performance data

Ok, das rechte Bild mit den Performance-Daten mag nicht ganz perfekt sein: Der obere Bereich des Swaps ist fast leer. Aber als Beispiel reicht es trotzdem: Unten ist der physikalische Teil aufgelistet, darüber der Swap-Bereich. Die Limit-Angabe für Warning und Critical ist möglich und betrachtet das prozentuale Verhältnis zwischen "belegt" sowie "frei" zuzüglich Buffers und Cache.

Auch dieser Check ist sicherlich alles andere als perfekt. Aber er ist deutlich näher dran als die einzelne Betrachtung von RAM und Swap. Vor allem die Darstellung der Performance-Daten in denen die Gesamtsumme des Speichers dargestellt wird lässt über längere Zeiträume betrachtet eindeutige Tendenzen erkennen. Bei den meisten von mir verwalteten Linux-Servern ist inzwischen dieser Check installiert und wird immer wieder gerne hergenommen sobald eine entsprechende Auswertung der Serverlast benötigt wird.

Hier findest Du check_extmem auf GitLab: https://gitlab.com/Gehirn-Mag.net/icinga-and-nagios-plugins/tree/master/linux/check_extmem

LSI MegaRAID Monitoring via Nagios

LSI MegaRAID Monitoring via Nagios

Vor mir steht ein Dell Server mit Linux darauf welcher ins Monitoring aufgenommen werden soll. Die üblichen Verdächtigen wie CPU, Arbeitsspeicher, Netzwerk-, Platten- und Systemlast habe ich. Die laufenden Dienste sowieso. Mir fehlt nur noch der Status vom RAID. Also bin ich auf die Suche gegangen. Mit vier Schritten zum Erfolg:

1. Verbaute Hardware ermitteln

Ein lspci verrät schon mal die erste Richtung was hier verbaut sein soll:

00:00.0 Host bridge: Intel Corporation Skylake Host Bridge/DRAM Registers (rev 07)
00:01.0 PCI bridge: Intel Corporation Skylake PCIe Controller (x16) (rev 07)
00:01.1 PCI bridge: Intel Corporation Skylake PCIe Controller (x8) (rev 07)
00:14.0 USB controller: Intel Corporation Sunrise Point-H USB 3.0 xHCI Controller (rev 31)
00:14.2 Signal processing controller: Intel Corporation Sunrise Point-H Thermal subsystem (rev 31)
00:16.0 Communication controller: Intel Corporation Sunrise Point-H CSME HECI #1 (rev 31)
00:16.1 Communication controller: Intel Corporation Sunrise Point-H CSME HECI #2 (rev 31)
00:17.0 SATA controller: Intel Corporation Sunrise Point-H SATA controller [AHCI mode] (rev 31)
00:1d.0 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #9 (rev f1)
00:1d.2 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #11 (rev f1)
00:1f.0 ISA bridge: Intel Corporation Sunrise Point-H LPC Controller (rev 31)
00:1f.2 Memory controller: Intel Corporation Sunrise Point-H PMC (rev 31)
00:1f.4 SMBus: Intel Corporation Sunrise Point-H SMBus (rev 31)
02:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)
03:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5720 Gigabit Ethernet PCIe
03:00.1 Ethernet controller: Broadcom Corporation NetXtreme BCM5720 Gigabit Ethernet PCIe
04:00.0 PCI bridge: Renesas Technology Corp. SH7758 PCIe Switch [PS]
05:00.0 PCI bridge: Renesas Technology Corp. SH7758 PCIe Switch [PS]
06:00.0 PCI bridge: Renesas Technology Corp. SH7758 PCIe-PCI Bridge [PPB]
07:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. G200eR2 (rev 01)

Aha, ein LSI MegaRAID. Also mal wieder die Suchmaschine des Vertrauens bemüht und nachgeschaut ob es irgendwas gibt zum Thema "Nagios MegaRAID". Da war nichts dabei was wirklich gefallen hätte. Meist tausende Abhängigkeiten oder dieser Controller fehlte schlichtweg in der Liste der unterstützen Modelle. Jedoch bin auf der Suche nach einem passenden Check der LSI MegaRAID Storcli begegnet: https://www.broadcom.com/products/storage/raid-controllers/megaraid-sas-9271-8i#downloads. Das klang doch mal spannend. Fix installiert und aufgerufen mittels /opt/MegaRAID/MegaCli/MegaCli64 -CfgDsply -aALL -nolog (gekürzte Ausgabe):

# /opt/MegaRAID/MegaCli/MegaCli64 -CfgDsply -aALL -nolog
                                     
==============================================================================
Adapter: 0
Product Name: PERC H730 Adapter
Memory: 1024MB
BBU: Present
Serial No: 1234567
==============================================================================
Number of DISK GROUPS: 1

DISK GROUP: 0
Number of Spans: 1
SPAN: 0
Span Reference: 0x00
Number of PDs: 2
Number of VDs: 1
Number of dedicated Hotspares: 0
Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 931.0 GB
Sector Size         : 512
Is VD emulated      : No
Mirror Data         : 931.0 GB
State               : Optimal
Strip Size          : 64 KB
Number Of Drives    : 2
**snip**

Ok, bei Dell heißt der wohl PERC H730 Adapter. Soll auch recht sein 😉 Aber mit der Ausgabe lässt sich doch mal was anfragen. Der Status vom RAID wird etwas weiter unten als "Optimal" angegeben. Ich hab nur einen RAID-Verbund, also fix diese Ausgabe durch grep gejagt und mit einer kurzen, passenden Statusmeldung versehen.

2. NRPE command erstellen

Da dieser Server via NRPE geprüft wird also fix die nrpe.cfg um folgende Zeile erweitert:

command[check_megaraid]=[ $(echo $(sudo /opt/MegaRAID/MegaCli/MegaCli64 -CfgDsply -aALL -nolog | grep "^State" | cut -d: -f2)) == "Optimal" ] && (echo "RAID Status Optimal"; exit 0) || (echo "RAID Problem"; exit 2)

3. Via sudo die passenden Rechte geben

NRPE läuft bei mir unter der User-Kennung nagios. MegaCLI lässt sich aber nur via root wirklich sinnig aufrufen Also per sudo aufrufen und dazu noch via visudo folgende Zeile eingefügt:

nagios ALL=(ALL) NOPASSWD: /opt/MegaRAID/MegaCli/MegaCli64 -CfgDsply -aALL -nolog

4. Testen, einbauen und fertig

Ein erster Check via Konsole vom Monitoring-Server aus:

# /usr/lib/nagios/plugins/check_nrpe -H 10.16.23.61 -c check_megaraid
RAID Status Optimal

Sieht gut aus! Also noch fix ins eigentliche Monitoring eingebaut - hier ist es egal ob Nagios, Icinga, Shinken oder was auch immer verwendet wird: Solange es Naigos-Checks via NRPE prüfen kann sollte sich die Prüfung des LSI MegaRAIDs leicht einfügen lassen. So sieht es dann final bei mir in Icinga2 aus:

Nagios Check LSI MegaRAID

Nagios Check LSI MegaRAID

Einfach, schlicht, funktionell. Für meine Zwecke völlig ausreichend. Wie dieses Beispiel zeigt geht es oftmals auch ohne extra CheckCommand welches noch vorher in bash, Python oder was auch immer erstellt hätte werden müssen. Das spart Zeit.

Und morgen ist noch der IPMI dran um den allgemeinen Systemstatus zu ermitteln.

Cleveres einbinden der Festplatte vom heimischen Router

Cleveres einbinden der Festplatte vom heimischen Router

Ich habe zuhause an unserem Internet-Router eine USB-Platte angeschlossen welche als einfache Datenablage oder zum Datenaustausch zwischen den Familienmitgliedern dient. Zwar könnte ich mich von Linux aus jedes mal auf diese Platte sehr leicht von Hand über den grafischen Dateibrowser verbinden, dass bringt aber nichts an der Konsole. Hier muss also eine komfortablere Lösung her.

Ich hätte einen entsprechenden Eintrag unter /etc/fstab aufnehmen können für diese Freigabe. Jedoch funktioniert dies nur wenn ich mit meinem Notebook wirklich zuhause bin. Unterwegs gäbe es entsprechende Fehler da die Platte nicht erreichbar ist. Ok, die fstab Option noauto hätte eine Besserung gebracht. Nur müsste ich hierfür die Platte jedes mal vor Benutzung von Hand einbinden. Das geht sicherlich noch besser. So in der Art, dass die Platte nur dann verbunden wird sobald ich tatsächlich zuhause bin. Also die Suchmaschine meines Vertrauens angeworfen um erste Hinweise zur Lösung zu suchen. Fündig geworden bin ich in der man page von mount:

_netdev
The filesystem resides on a device that requires network access
(used to prevent the system from attempting to mount these
filesystems until the network has been enabled on the system).

Na das passt doch wunderbar! Die fertige Zeile für die fstab sieht dann wie folgt aus:

# Mein privater Router
//router/nas /media/router cifs rw,vers=1.0,_netdev,user=<user>,password=<password>,uid=steffen,gid=steffen 0 0

Zusätzlich habe ich noch vers=1.0 angegeben um auf die CIFS-Version 1.0 zu wechseln da dies deutlich weniger Probleme bei meinem Router macht. Wer das Passwort für die Freigabe lieber an einer anderen Stelle als in der fstab stehen haben möchte sollte sich in der man page von mount.cifs die Option credentials ansehen. In der selben Datei finden sich auch weitere, ausführlichere Erklärungen zur vorher festgelegten Version.

Diese Lösung funktioniert genauso wie erhofft: Sobald ich zuhause bin ist unter meiner Benutzerkennung die Platte des Routers eingebunden. Bin ich unterwegs fehlt diese - ohne jegliche Fehlermeldungen von nicht erreichbaren Netzlaufwerken. So soll es sein 🙂