STRATO Linux VServer mit Webserver im Rettungssystem

Maintenance Seite

Ich kann den STRATO vServern in ein Rettungssystem starten, welches leider keinen Webserver enthält.
Das Rettungssystem ist Praktisch, da ich über dieses Alternative Betriebssystem an alle Daten die auf dem Server abgelegt sind gelangen kann, auch wenn mein selbst verwaltetes Betriessystem auf dem Server nicht mehr funktioniert. Die Besucher meiner Seite erfahren leider nicht das ich meinen Server grade warte.
Um den potentiellen besuchern meiner Seite jedoch zeigen zu können das meine Seite durchaus noch vorhanden, nur grade in einem Wartungsfenster ist, ist ein solcher sehr wünschenswert.

Der einfache versuch via „apt update && apt install lighttps“ führt jedoch leider zu ein paar nicht sehr aussagekräftigen Fehlermeldungen.

Es fehlen jedoch einfach nur ein paar Benutzer, genauer die Benutzer _apt, der Benutzer postfix und der Benutzer www-data.

Im Anschluss kann der Webserver einfach installiert werden.:

Im Anschluss bearbeite ich die Datei /etc/lighttpd/lighttpd.conf und füge am ende die folgenden 4 Zeilen an.:

Die Raute # in der Zeile ‚#  „mod_rewrite“,‘ muss entfernt werden, so das die erste Zeile jedwede Anfragen an die Datei maintenance.php im Ordner /var/www/html/ umleiten kann.
Die verbleibenden drei Zeilen ermöglichen es dem Webserver PHP-Scripte auszuführen.

Die Datei /var/www/html/maintenance.php gibt in meinem Beispiel den HTTP StatusCode 503 (Vorübergehend nicht verfügbar; Server überlastet, ausgefallen oder in Wartung) und einen kurzen Wartungstext aus.:

Zu guter letzt muss der Webserver nur noch neu gestartet werden, und es wird die Wartungsseite angfezeigt.

Textdateien mit Windows & DOS Zeilenumbrüchen für Linux korrigieren

Shellscripte mit Windows / DOS Zeilenumbrüchen funktionieren leider nur eingeschränkt unter Linux. Die einfache Zeile „wget bla“ in einer Textdatei mit DOS Zeilenumbrüchen führt zu der Fehlermeldung das die Datei „bla%0D“ nicht gefunden wurde.
Dies entsteht da die Linux Zeilenumbrüche nur aus einem Zeilenumbruch-Zeichen (newline[\n]) bestehen. Unter DOS und Windows steht am ende jeder Zeile vor dem Zeilenumbruch-Zeichen noch ein Wagenrücklauf-Zeichen (carriage return [CR, \r, 0x0d}). (Merkhilfe für die Reihenfolge beim Zeilenumbruch return)

Ich habe mit mehrere Beispiele herausgesucht wie die Zeilenumbrüche korrigiert werden können.

Die Original Datei:

Der Inhalt der Datei:

Die mir bekannten Varianten die Zeilenumbrüche in der Datei zu korrigieren:

dos2unix (Der Standard weg um die Zeilenumbrüche umzuwandeln!)

Umwandlung mit Hilfe von sed (stream editor):

Wenn es auch kein sed auf dem System geben sollte geht auch tr:

oder awk:

und in Perl:

im Editor vi und vim geht es mit folgender Eingabe:
:%s/\r//g
oder
:1,$ s/^M//

Es gibt noch viele weitere Möglichkeiten!
Ich freue mich über Deinen Kommentar, welche Möglichkeit Du gefunden hast die Zeilenumbrüche zu korrigieren!

git als static binary compilieren

GIT

Was ist eine „static binary“?

Während der Übersetzung eines Quellcodes in ein ausführbares Programm verknüpft der Compiler die ausführbare Datei des Programms, um später bei der Ausführung des Programms Arbeitsspeicher zu sparen, mit „shared dynamic libraries“.

Diese Bibliotheken sind eine Sammlung von Funktionen welche von mehreren Programmen geteilt verwendet werden um bestimmte Aufgaben zu zu erfüllen. Durch die gemeinsame Nutzung dieser Bibliotheken kann der Arbeitsspeicher des Computers geschont werden, da nur eine Kopie der Bibliothek für viele verschiedene Programme im Speicher geladen sein muss. Um ein unerwartetes Verhalten von Programmen zu vermeiden, ist es manchmal unumgänglich das Programm mit einer bestimmten Version einer Bibliothek zu Übersetzen. Auch um die Portabilität eines Programms zu verbessern ist es wichtig die Abhängigkeit vom vorhanden sein einer dynamischen Bibiothek zu vermeiden. In Linux Systemen sorgt ein Paketmanager dafür, dass Versionsabhängigkeiten korrekt erfüllt werden. Wenn Du auf einem Computer arbeitest über den Du keine Administrative Kontrolle besitzt kannst Du die Version der verwendeten Bibliothek nicht bestimmen oder eine aktualisiert verhindern.
Programme können, wenn sie mit „shared dynamic libraries“ übersetzt wurden nur auf andere Computer übertragen werden auf der, die gleiche Prozessorarchitektur und die gleichen Bibliotheken verfügbar sind.
Falls die Bibliotheken des Computers auf den das Programm übertragen wurde aktualisiert werden, eine Bibliothek entfernt wird oder eine der Bibliotheken auf dem Zielrechner werden kompromittiert oder durch bösartige Versionen ersetzt. Hier kommt das bauen einer „static binary“ ins Spiel.   Wie wird GIT als „static binary“ übersetzt?

in diesem Beispiel gehe ich davon aus das auf der NAS, entsprechend meiner Anleitung, bereits mit dem hier notwendigen Buildsystem ausgestattet wurde. Im Anschluss kann die entstehende GIT Binärdatei auf allen identischen ARM Prozessoren verwendet werden.
Die aktuellste GIT Version kann auf http://git-scm.com gefunden werden.

Die Folgenden 3 Schritte sind auszuführen:

1) Lade den GIT Quellcode herunter, entpacke die tar.gz-Datei und wechsle in das GIT Buildverzeichnis:

2) Setze die Compilervariablen und konfiguriere ihn mittels ./configure. Hierbei kannst du ein  separates Verzeichnis zum übersetzen angeben.:

3) übersetze GIT:

…und installiere GIT in das Zielverzeichnis

4) Prüfe anschließend das deine neue GIT-Version wie erwartet funktioniert

Inotify: Dateien überwachen

007-Tux Logo

Du kannst in Linux Systemen die Veränderungen an Dateien im Dateisystem mit inotify überwachen.

Um, sobald Dateien verändert wurden ein .tar.gz-Archiv zur Datensicherung zu erstellen oder die veränderte Datei auf einen anderen Server hochladen, oder auch an ein Filter / Beautifier zu übergeben oder auch einfach nur um auf meinem NAS eine LED anschalten ist inotify das Werkzeug auf das alle die es noch nicht kennen gewartet haben.

Ich bin schon vor einigen Jahren auf ein Problem gestoßen für das inotify die richtige Lösung gewesen wäre. Damals konnte ich nir nur eine Endlosschleife schreiben die immer wieder alle Dateien in meinen Verzeichnissen durchgegangen ist, keine schöne Lösung und endlose Festplattenzugriffe.
Diese Endlosschleife gefiel meinem damaligen Provider garnicht, da diese zu häufig auf die zu überwachenden Dateien Zugriff und die Festplatten am einschlafen hinderten und die Lebensdauer der Festplatten reduzierte.
Damals konnte ich die Schleife einfach mit einer längeren pause() zügeln, bin bald auf einen Cronjob gewechselt der noch seltener lief.

Auf meines eigenen NAS und meinen eigenen Servern bin ich jedoch nicht auf eine Schleife oder Cronjobs angewiesen! Mit einem Inotify Event kann ich die Änderungen direkt im Dateisystem abpassen und die gewünschte Anktion direkt nach der änderung starten.

Inotify-Events
KürzelFormat
ACCESSZugriff auf die Datei
ATTRIBMetadaten geändert
CLOSE_WRITEzum Schreiben geöffnete Datei geschlossen, sie muss nicht geändert worden sein
CLOSE_NOWRITEEine Datei wurde geschlossen nachdem sie schreibgeschützt geöffnet wurde
CREATENeue Datei angelegt
DELETEDatei gelöscht
DELETESELFÜberwachtes Verzeiuchnis gelöscht
MODIFYDatei modifiziert
MODIFYSELFÜberwachtes Verzeichnis modifiziert
MOVEDFROMDatei aus dem überwachten Verzeichnis verschoben
MOVEDTODatei in das überwachte Verzeichnis verschoben
OPENDatei geöffnet

Um zum Beispiel das WordPress Verzeichnises auf neue Dateien zu überwachen kann ich folgendes Snippet nutzen:

Dirch dieses Snippet werden alle im WordPressverzeichnis  neu erstellten Dateien ausgegeben.

In meinem Verzeichnis vor allem viele Dateien wp-content/temp-write-test-1492771373. (Die Zahl an ende ändert sich bei jedem Aufruf)
Jedoch werden auch alle Updates, Uploads, Plugin und Theme Installationen und auch all die neuen Dateien an die ich grade nicht denke.

Um herauszufinden welche Dateien „angefasst“ werden wird nur der Parameter „-e create“ auf „-e access“ geändert:

Inotify ist unter Linux ein sehr nützliches Werkzeug, auch für die Fehleranalyse. 😉

Reverse SSH Tunnel

Tunnel aus der anderen Richtung

Seit der Deaktivierung extern erreichbarer IPv4 Adressen, von den Providers Dual-Stack Lite oder DS-Lite genannt, bei meinem und auch vielen anderen Internetzugängen lassen sich die heimischen Computer und Router nicht mehr ohne weiteres mittels OpenSSH erreichen.

Die Alternativen, wie Beispielsweise einen VPN Tunnel und die teilweise recht obskuren Shell sharing-Dienste (Nach aufruf einer URL habe zugriff auf die Shell als der Benutzer der die Shell freigegeben hat, ohne Passwort, ohne Key), überzeugen mich einfach nicht. Besonders zur Administration meines heimischen Servers und der NAS verlange ich einfach mehr vertraulichkeit von meiner Verbindung.

In diesem Blogbeitrag zeige ich Schritt für Schritt wie ein reverser, mit anderen Worten umgekehrter, SSH Tunnel errichtet werden kann.

Revers SSH-Tunnel? Das ist wenn Bob eine Verbindung zur Shell des Computers von Alice herstellen möchte, der Computer von Alice ist jedoch wegen einem NAT oder einer Firewall nicht erreichbar ist. Alice muss dann zuerst eine Verbindung zu Bobs Computer herstellen und in dieser die Verbindung zu ihrem eigene Computer mitbringen.

Für mein Beispiel nehmen wir an, das der Computer von Alice die IP-Adresse 10.0.0.2 und der Computer von Bob die IP-Adresse 192.168.0.2 hat, und zwar eine Verbindung von Alice zu Bob, jedoch umgekehrt keine Verbindung möglich ist.

1.) SSH Verbindung von Alice zu Bob herstellen. (Vom Zielcomputer zu dem Computer auf dem eine Verbindung auf die Shell eigentlich hergestellt werden soll)

Der Port 49152 den ich hier verwende ist ein beliebiger, auf Bobs Computer nicht verwedeter Port.

2.) Nun kann Bob eine SSH-Verbindung zum Computer von Alice über den jetzt aufgebauten SSH-Tunnel herstellen.

Wenn die von Alice hergestellte Verbindung zu Bob jedoch abbricht verliert auch Bob seine Verbindung zu Alice.
Bob sollte aus diesem Grund due Konfiguration seines SSH-Servers so anpassen, das die Verbindung nicht wegen eines Timeout getrennt wird.

Die Daten /etc/ssh/sshd_config kann zu diesem Zweck wie folgt angepasst werden.:
TCPKeepAlive no
ClientAliveInterval 30
ClientAliveCountMax 100

DOSBox MS-DOS Installation

Ich will eine DOSBox mit MS-DOS 6.22. Wieso? Weil es geht *g*

1.) Diskettenabbilder von MS-DOS 6.22 erstellen.

Mein USB-Diskettenlaufwerk wird von Linux als sdb erkannt (dmesg zeigt es)

mit dem folgenden Befehl erstelle ich nacheinander die drei Abbilder meiner MS-DOS 6.22 Disketten.

anschließend habe ich die 3 Disketten-images, MSDOS622_D1.img, MSDOS622_D2.img und MSDOS622_D3.img der Original MS-DOS Datenträger.

Da ich keine Rechte an MS-DOS halte biete ich diese Images NICHT zum Download an. Einen Versand dieser Dateien via EMail kommt für mich genauso wenig in Frage. Ich Bitte von weiteren Anfragen abzusehen!

2.) 504 MB Festplattenimage erzeugen.

Die Maximale Größe der Festplatte eines klassischen DOS-PCs ist 504 MiB groß. Größere Datenträger können mit MS-DOS 6.2, und auch mit den damaligen Festplattencontrolern nicht genutzt werden.

Die spezifikation einer solchen Festplatte lautet:
1024 Cylinder
16 Heads
63 Sektoren

Ich habe diese Festplattenkonfiguration dem PC-Guide unter der folgenden Adresse entnommen.: http://www.pcguide.com/ref/hdd/bios/sizeMB504-c.html

Die Berechnung der Sektoren der Festplatte erfolgt nach dem Schema:
Sektoren = Cylinder * Heads * Sectoren
1024 * 16 * 63 = 1032192 Sektoren

Mit Hilfe von dd erstelle ich die 504 MiB (528 MB) große Festplatte DOS.img:

3.) DOSBox installieren und konfigurieren

Die Installation erfolgt unter Debian und Ubuntu mit der folgenden Befehlszeile und dauert nur wenige Sekunden.:

Mit Hilfe der folgenden Befehlzeile finde ich heraus welche Konfigurationsdatei beim Start von DOSBox verwendet wird.:

An das Ende der Konfigurationsdatei kommt für das MS-DOS-Setup der Befehl die Festplatte einzubinden und die Disketten zur verfügung zu stellen.
Die boot Zeile enthält meine 3 MS-DOS Disketten.
Der Wechsel der Disketten erfolgt mit der Tastenkombination [Strg]+[F4].

Die Option -size enthält die oben, beim anlegen der Festplatte festgelegten Parameter: Blockgröße (der bs= Parameter vom dd), Sektoren, Heads und Cylinder.

Beim Start von dosbox wird automatisch von der ersten Diskette gestartet und die Festplatte erst partitioniert und nach dem Neustart, dosbox beendet sich und muss neu gestartet werden, wird die Festplatte formatiert, Nach dem Start der Installation kann, sobald das Setup nach der nächsten Diskette verlangt einfach mit der Tastenkombination [Strg]+[F4] zur nächsten Diskette gewechselt und mit [Enter] das Setup fortgesetzt. Wenn das MS-DOS Setup fertig ist und neu starten möchte tauschen wir den Autostartbereich der DOSBox zu dem folgenden Inhalt.:

Jetzt haben ich ein DOSBox das, aus meinem Benutzerordner das Festplatten-Image DOS.img startet.

Bitte spielt nicht mit den Logdateien

Vor kurzem durfte ich erleben das Festplatten ohne guten grund voll belegt waren, da Administratoren auf die Idee kamen im Log Verzeichnis die Logfiles zu komprimieren.

Bitte ändert die Dateien im LogVerzeichnis nicht! Der Logrotate Dienst wird die Dateien nicht mehr finden und die Datei bleibt für immer dort liegen.

Um Logfiles zu rotieren benutzt logrotate!

Der Aufruf für das rotieren der Logfiles lautet:

Postfix, maximale größe der EMails festlegen

In Postfix kann die maximale Größe von zu verarbeitenden EMails übder die Konfigurationsvariable „message_size_limit“ festgelegt werden.

Postfix wird alle EMails ablehnen die größer als der festgelegte Wert von „message_size_limit“ ist. Der Vorgabewert von message_size_limit ist 10240000 (nahezu 10 Megabyte).

In der Postfix Konfigurationsdatei wird dieses Limit, zumindest unter debian nicht aufgeführt. Es kann direkt in der Datei /etc/postfix/main.cf, oder mit postconf hinzugefügt werden.

Die aktuelle Einstellung von Postfix kann mit dem folgenden Befehl angezeigt werden:

Mit der Eingabe von „postconf“, ohne zusätzliche Parameter, wird die gesammte Postfix konfiguration ausgegeben werden. Durch den Zusatz des „message_size_limit“ wird nur diese eine Option ausgegeben. Die ausgabe des obig angegebenen Befehl zeigt die folgende Zeile:

message_size_limit = 10240000

Um den zugewiesenen Wert zu Ändern kann mit der folgenden Eingabe ein abweichender Wert zugewiesen werden. Um herauszufinden kann mit dem folgenden Shellscript eine beliebige anzahl MB in Bytes, die Angabe in der Postconf erfolgt in Bytes, umgerechnet werden.

Nach der Eingabe auf der Shell zum Beispiel 20 eingeben und Enter drücken, als Ausgabe erfolgt 20971520. (Das Script  im Anschluss mit Strg und C abbrechen) Diesen Wert weisen wir jetzt mit postconf dem message_size_limit zu:

postconf message_size_limit=20971520

Hiermit wird in die letzte Zeile der Datei /etc/postfix/main.cf die Zeichenfolge „message_size_limit=20971520“ angefügt und alle eventuell zuvor in der Dastei vorkommenden Zuweisungen „message_size_limit=“ entfernt.

Im Anschluss muss noch der Dienst Postfix die neue Konfiguration lesen. Dies erfolgt durch die eingabe von:

service postfix reload

Im Anschluss gilt die neue Option und entsprechend größere EMails können angenommen werden.

Alle TCP/UDP Ports prüfen

Ich suchte im Netz eine Möglichkeit in einem Fremden Netzwerk die erlaubten offenen Ports zu entdecken, leider fand ich keine „out of the box“ Lösung im Internet und baute mir die hier dokumentierte Lösung.

Der Netzwerk Computer ist in der folgenden Konfiguration mit meinem Testserver verbunden.:
nmap-netzwerk für den Netzwerkscan
Auf der Laptop Seite hinterlege ich einen neuen SSH Private Key übertrage einen zugehörigen Public aus dem Server in die Datei ~/.ssh/authorized_keys:

Auf der zu testenden Seite legte ich mir dieses kleine Shellscript ab, das nach und nach Netcat lokal auf verschiedene Ports lauschen lässt und im Anschluss versucht die Ports von der Serverseite aus zu erreichen.:

Um Netcat an UDP-Ports senden, oder auf UDP Ports lauschen zu lassen kann die Option -u mit angegeben werden.

Diese Methode dauert selbstverständlich ewig und ist nur anwendbar wen wenige Ports zu durchsuchen sind und nicht wie im Beispielscript angegeben alle 65535.

script: Terminal Sessions aufnehmen

Um eine Terminal Session aufzuzeichnen kann das häufig vorinstallierte „typescript“ verwendet werden. Typescript nimmt alles auf das in einer Terminal Sitzung angezeigt wird. Die Befehle script & scriptreplay zeichnen eine Terminalsitzung auf, und spielen sie auch wieder ab.

Besonders zu empfehlen sind diese beiden Befehle zur Dokumentation oder um dritten eine Anleitung zukommen zu lassen.

Eine Aufnamesitzung kann durch eingabe des folgenden Komandos gestartet werden:

Es wird hierbei in zwei Dateien gesichert.

In die Datei recordfile werden alle Steuerzeichen geschrieben, in die Datei timefile wird ein Zeitindex für die Ausgaben gespeichert.

Nach dem Aufruf von script startet es im Hintergrund, ohne eine Ausgabe im Terminal zu verursachen. Alle folgenden Ausgaben werden aufgezeichnet.

Um die Aufname zu beenden und die Ausgabedateien fertigzustellen reicht ein Druck auf die Tasten [Strg] und D.

Um eine Aufnahme zu einem Späteren Zeitpunkt abzuspielen kann diese wiedergabe , wie im folgenden Beispiel, mit scriptreplay gestartet werden:

Aufnahmen von Terminalsitzungen können auch mit fortgeschritteneren Werkzeugen wie ttyrecshelr oder timerec angesfertigt werden. Die Anwendung erfolgt ähnlich, jedoch benötigen diese Werkzeige keine Zeitdatei. Sie speichern die Ausgabe jedoch in einer Binärdatei und sind sehr selten bereits vorinstalliert.