<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>thomas-leister.de</title><link>https://thomas-leister.de/feeds/osbn/</link><description>Das persönliche Weblog zu den Themen Linux, Server und freier / offener Software</description><generator>Hugo -- gohugo.io</generator><language>de</language><managingEditor>thomas.leister@mailbox.org (Thomas Leister)</managingEditor><webMaster>thomas.leister@mailbox.org (Thomas Leister)</webMaster><lastBuildDate>Sat, 07 Sep 2019 12:11:00 +0200</lastBuildDate><atom:link href="https://thomas-leister.de/feeds/osbn/" rel="self" type="application/rss+xml"/><item><title>Restic mit Hetzner Storagebox nutzen</title><link>https://thomas-leister.de/restic-hetzner-storagebox/</link><pubDate>Sat, 07 Sep 2019 12:11:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/restic-hetzner-storagebox/</guid><description>&lt;p&gt;Die flexiblen und günstigen Storage Boxes von Hetzner eigenen sich wunderbar für Backups von Servern und Desktoprechnern. Ich nutze sie, um verschlüsselte Sicherungen meiner Server geografisch getrennt und sicher aufzubewahren. Das Backup-Tool Restic spielt dabei über das SFTP-Protokoll wunderbar mit dem Cloudspeicher zusammen.&lt;/p&gt;
&lt;p&gt;Bevor die StorageBox mit Restic verknüpft werden kann, muss die Box zunächst vorbereitet werden, sodass auf sie via SFTP zugegriffen werden kann. In den StorageBox Einstellungen muss das SSH-Protokoll zur Datenübertragung aktiviert sein. Alle anderen Zugriffsmethoden wie z.B. Samba können deaktiviert bleiben.&lt;/p&gt;
&lt;p&gt;Danach wird die StorageBox lokal gemoutet, um alle weiteren Vorbereitungen zu treffen.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /mnt/storagebox
sshfs u123456@u123456.your-storagebox.de: /mnt/storagebox/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;(&lt;code&gt;u123456&lt;/code&gt; muss hier und in den folgenden Kommandos durch die eigene Userkennung ersetzt werden!)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Gebt das Passwort für die StorageBox ein. Das Passwort kann in den Einstellungen der StorageBox eingesehen bzw. geändert werden.&lt;/p&gt;
&lt;p&gt;Für eine Authentifizierung des Servers an der StorageBox soll ein SSH-Key genutzt werden. Damit der passende Public Key an der StorageBox registriert werden kann, muss ein &lt;code&gt;.ssh&lt;/code&gt; Verzeichnis und die &lt;code&gt;authorized_keys&lt;/code&gt; Datei angelegt werden.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /mnt/storagebox/.ssh
touch /mnt/storagebox/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="einen-neuen-host-registrieren"&gt;Einen neuen Host registrieren&lt;/h2&gt;
&lt;p&gt;Nun wird auf dem zu sichernden Server ein neuer SSH-Key für den root-User generiert. Achtet darauf, für den Key &lt;em&gt;kein Passwort&lt;/em&gt; anzulegen - schließlich soll der Key einmal während des Backupprozesses automatisch und ohne Passworteingabe verwendet werden.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ssh-keygen -t ed25519
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In der SSH-Konfigurationsdatei &lt;code&gt;/root/.ssh/config&lt;/code&gt; des Servers wird folgende Konfiguration hinterlegt:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Host u123456.your-storagebox.de
User u123456
Port 23
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Konfiguration wird später einen konfortableren Zugriff ermöglichen, weil alle nötigen Verbindunsparameter aus der Konfiguration gelesen werden können.&lt;/p&gt;
&lt;p&gt;Der Public Key des neu generierten SSH-Schlüsselpaars wird nun an der StorageBox registriert:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat ~/.ssh/id_ed25519.pub &amp;gt;&amp;gt; /mnt/storagebox/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Für die Backups dieses Hosts wird ein neues Verzeichnis angelegt, welches das Backuparchiv enthalten soll:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /mnt/storagebox/host1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die StorageBox kann nun wieder unmounted werden:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;fusermount -u /mnt/storagebox
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="backupscript-erstellen"&gt;Backupscript erstellen&lt;/h2&gt;
&lt;p&gt;Das Backupscript soll die Informationen über den Speicherort aus Umgebungsvariablen lesen, die in einer Datei namens &lt;code&gt;resticenv.sh&lt;/code&gt; gelesen werden. Die Definition der Umgebungsvariablen ließen sich zwar auch direkt in dem Backupscript definieren, doch die getrennte Definitionsdatei ermöglicht einen bequemeren Umgang mit Restic, falls einmal manuelle Eingriffe oder ein Restore nötig sein sollten.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;resticenv.sh&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash
export RESTIC_REPOSITORY=&amp;#34;sftp:u123456.your-storagebox.de:host1&amp;#34;
export RESTIC_PASSWORD=&amp;#34;meinbackuparchivpassword&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ein Backupscript &lt;code&gt;backup.sh&lt;/code&gt; für Restic könnte beispielsweise so aussehen:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash
### Restic Passwort und Speicherort einlesen
source resticenv.sh
### Restic ausführen
restic backup \
/var/www \
/home \
/etc \
/root
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bevor Restic / &lt;code&gt;backup.sh&lt;/code&gt; erstmalig ausgeführt werden kann, muss das Backuparchiv in der StorageBox initialisiert werden. Dazu werden die Verbindungsparameter zum Archiv via &lt;code&gt;source&lt;/code&gt; eingelesen und ein &lt;code&gt;restic init&lt;/code&gt; ausgeführt:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;source resticenv.sh
restic init
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Das Restic-Archiv ist nun einsatzbereit und &lt;code&gt;backup.sh&lt;/code&gt; kann regelmäßig ausgeführt werden.&lt;/p&gt;</description></item><item><title>Der Yubikey im Praxiseinsatz</title><link>https://thomas-leister.de/yubikey-in-der-praxis/</link><pubDate>Wed, 01 Aug 2018 15:47:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/yubikey-in-der-praxis/</guid><description>&lt;p&gt;Seit ein paar Jahren besitze ich einen &lt;a href="https://www.yubico.com/product/yubikey-neo/"&gt;Yubikey Neo&lt;/a&gt; - einen USB- und NFC-kompatiblen Hardware Security Token, den ich in Kombination mit regulären Passwörtern zum Schutz von Zugangsdaten und Account einsetze. In einem &lt;a href="https://thomas-leister.de/authentifizierungsverfahren-des-yubikeys-erklaert/"&gt;früheren Beitrag&lt;/a&gt; habe ich bereits die verschiedenen Betriebsmodi des Yubikeys beschrieben. In diesem Beitrag will ich einen kleinen Einblick geben, wie ich mit dem Yubikey arbeite und wofür ich ihn einsetze.&lt;/p&gt;
&lt;h2 id="einsatzzwecke"&gt;Einsatzzwecke&lt;/h2&gt;
&lt;p&gt;In der letzten Jahren haben sich die Einsatzmöglichkeiten für Yubikeys im speziellen und Hardwaretokens im allgemeinen etwas verbessert. Während Zwei-Faktor-Authentifizierung vor allem im Consumer-Bereich so gut wie gar nicht zu finden war, kann man sich bei größeren Softwarekonzernen und einigen Security-Tools mittlerweile sicher anmelden.&lt;/p&gt;
&lt;h3 id="absicherung-logins"&gt;Absicherung Logins&lt;/h3&gt;
&lt;h4 id="mit-u2f"&gt;Mit U2F&lt;/h4&gt;
&lt;p&gt;U2F ist vor allem für das Web entwickelt. Die Verbreitung lässt zwar immer noch zu Wünschen übrig (man sagt, die Implementierung sei wohl recht komplex), aber ein paar der von mir genutzten Services unterstützen das moderne, einfach zu nutzende Verfahren bereits. Dazu gehört neben GitHub und Google auch die frei verfügbare &lt;a href="https://gitea.io"&gt;Git-Hostingsoftware &amp;ldquo;Gitea&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id="mit-totp"&gt;Mit TOTP&lt;/h4&gt;
&lt;p&gt;Der von mir am meisten eingesetzte Mechanismus ist TOTP: Einfach deshalb, weil er von viel mehr Diensten unterstützt wird, als das neuere U2F. Zu den von mir genutzten Anbietern gehören core-networks.de, Hetzner Online, bitcoin.de, servercow.de und Mastodon. Auch Google und GitHub habe ich zusätzlich über TOTP abgesichert - wer weiß schon, wann ich das nächste mal vor einem Rechner sitze, der kein U2F versteht &amp;hellip; ;-)&lt;/p&gt;
&lt;h3 id="absicherung-passwortdatenbank"&gt;Absicherung Passwortdatenbank&lt;/h3&gt;
&lt;p&gt;Die Absicherung meines Passwortsafes geschieht über den Challenge-Response-Mechanismus des Yubikeys. Über USB oder NFC wird eine sog. &amp;ldquo;Challenge&amp;rdquo; an den Key übertragen. Der Key trägt ein Secret in sich, und ist damit in der Lage, die Challenge zu beantworten und das korrekte Ergebnis zurückzusenden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unter Linux nutze ich den Yubikey-kompatiblen Passwortmanager &lt;a href="https://keepassxc.org/"&gt;KeePassXC&lt;/a&gt;&lt;/strong&gt;. Er ist eine Neuimplementierung von KeePass und verfügt im Vergleich zu seinem Vorgänger über einige erweiterte Funktionen. Meine vorherige KeePassX-Datenbank konnte ich in KeePassXC öffnen und einen neuen Masterschlüssel festlegen: Eine Kombination aus Passwort und Challenge-Reponse-Verfahren mit dem Yubikey. Die Einrichtung ist selberklärend.&lt;/p&gt;
&lt;p&gt;Damit ich auch unterwegs Zugriff auf wichtige Zugangsdaten habe, nutze ich &lt;strong&gt;auf meinem Android-Smartphone die App &amp;ldquo;&lt;a href="https://github.com/PhilippC/keepass2android"&gt;Keepass2Android&lt;/a&gt;&amp;rdquo;&lt;/strong&gt;. Sie unterstützt ebenfalls das Challenge-Reponse-Verfahren. In der neuesten Beta-Version (Stand Juli 2018) auch über NFC mit dem Yubikey. Erwähnenswert bzgl. der Einrichtung ist, dass die Schlüsselableitung mittels Argon2-Verfahren durchgeführt werden muss. Die Einstellung kann in der KeePassXC-Anwendung in den Verschlüsselungseinstellungen der Datenbank festgelegt werden. Wird ein anderer Algorithmus genutzt, ist KeePass2Android nicht in der Lage, mittels Yubikey/NFC zu entschlüsseln.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://thomas-leister.de/yubikey-in-der-praxis/images/keepassxc.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;KeePassXC Screenshot&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="ein-backup-des-yubikeys-erstellen"&gt;Ein Backup des Yubikeys erstellen&lt;/h2&gt;
&lt;p&gt;Da eine der wichtigsten Eingenschaften eines Hardware Security Tokens ist, nicht kopierbar zu sein, muss man ein paar Umwege gehen, wenn man bei Verlust ein weiteres Exemplar in der Hinterhand haben will.&lt;/p&gt;
&lt;p&gt;Bei U2F und TOTP gilt: Man registriert sich einfach mit beiden Keys. Bei U2f ist das einfacher, weil man beim Anbieter einfach einen weiteren Key hinterlegt. Bei TOTP meistens etwas aufwändiger, denn normalerweise wird hier nur ein Secret einmalig herausgegeben und die Einrichtung eines weiteren Geräts wird nicht unterstützt. Das bedeutet, man muss wie folgt vorgehen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bei dem betreffenden Service einloggen.&lt;/li&gt;
&lt;li&gt;Evtl. vorhandene 2-Faktor-Authentifizierung deaktivieren&lt;/li&gt;
&lt;li&gt;2FA neu einrichten: Secret als Zeichenkette oder QR-Code auf beiden Keys simultan einrichten&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Was die Challenge-Response-Funktion angeht, ist der Prozess je nach aktueller Nutzung mehr oder weniger aufwendig. Die schlechte Nachricht vorweg: &lt;strong&gt;Wer bereits einen Yubikey mit Challenge Response im Einsatz hat, muss den Mechanismus zuvor überall deaktivieren&lt;/strong&gt; - zumindest gilt das für die meisten Anwendungen, da sie nur einen Key unterstützen.&lt;/p&gt;
&lt;p&gt;Damit man beide Keys nutzen kann, muss das interne Secret bei beiden Keys nämlich dasselbe sein. Nun hat man natürlich nicht die Möglichkeit, einfach zu kopieren - das heißt: Wir müssen ein neues Secret für beide Schlüssel setzen. (Und deshalb kann man sich mit einem evtl. vorher genutzten Key nicht mehr einloggen!)&lt;/p&gt;
&lt;p&gt;Das &lt;a href="https://www.yubico.com/products/services-software/download/yubikey-personalization-tools/"&gt;Yubikey Personalization Tool&lt;/a&gt; unterstützt die Einrichtung ein und desselben Secrets auf mehreren Schlüsseln. Eine Anleitung gibt es hier: &lt;a href="https://www.yubico.com/wp-content/uploads/2016/06/YubiKey_Identical_Credentials_ConfigGuide_en.pdf"&gt;https://www.yubico.com/wp-content/uploads/2016/06/YubiKey_Identical_Credentials_ConfigGuide_en.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sobald auf beiden Keys dasselbe Secret vorhanden ist, kann einer der Keys wieder mit allen Anwendungen verknüpft werden, die mit dem Challenge-Response-Verfahren arbeiten. Der zweite Key wird danach ebenso funktionieren.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Mit meinem Yubikey kann ich mittlerweile meine wichtigsten Zugänge absichern. Vor allem die Kombination von KeePassXC und dem Yubikey im Challenge-Response-Modus gefällt mir gut. Ich würde mir jedoch noch mehr Support für die U2F-Anmeldung im Web wünschen. Alle modernen Browser sind bereits kompatibel - jetzt liegt es nur noch an den Web Services, U2F in ihren Loginsystem zu verankern.&lt;/p&gt;</description></item><item><title>Mein Mini Backup NAS mit Rock64 Single Board Computer</title><link>https://thomas-leister.de/mini-backup-nas/</link><pubDate>Thu, 19 Jul 2018 13:57:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/mini-backup-nas/</guid><description>&lt;p&gt;Nach meinem Umzug nach Passau habe ich leider nicht mehr die schnelle Internetverbindung, die ich ich vorher hatte. Das betrifft vor allem den Uplink. Ärgerlich, wenn das früher genutzte NAS im Elternhaus steht, und die Bandbreite beim Hochladen über das Internet so gering ist, dass man Backupvorgänge immer wieder frustriert abbrechen muss, um überhaupt noch im Internet surfen zu können.&lt;/p&gt;
&lt;p&gt;Um das Problem zu entschärfen, habe ich beschlossen, ein weiteres, aber deutlich kleineres NAS für meine Wohnung zu bauen. Es sollte keine Speichererweiterung darstellen, sondern lediglich Backups meines Laptops beherbergen. Im Folgenden will ich euch die Komponenten meines NAS und das Resultat vorstellen.&lt;/p&gt;
&lt;p&gt;Anforderungen an das neue System waren:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Geringer Stromverbrauch&lt;/li&gt;
&lt;li&gt;Geringe Lärmemissionen (kleine Wohnung, Nähe zum Bett)&lt;/li&gt;
&lt;li&gt;Geringe Anschaffungskosten (immer noch Student &amp;hellip;)&lt;/li&gt;
&lt;li&gt;Hohe Performance (Backups sollen möglichst schnell von der Bühne gehen)&lt;/li&gt;
&lt;li&gt;Die Möglichkeit, das System auch für andere Zwecke einsetzen zu können (DNS, VPN, &amp;hellip;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;
&lt;p&gt;Auf meiner Suche nach einer Hardware-Basi für meine Eigenbau-NAS-Lösung bin ich auf das &lt;strong&gt;Pine Rock64 Board&lt;/strong&gt; gestoßen. Das kurze &lt;a href="https://www.youtube.com/watch?v=jsCgXQjaviM"&gt;SBC Vergleichsvideo&lt;/a&gt; von &lt;em&gt;ExplainingComputers&lt;/em&gt; zeigt verschiedene Single Board Computer im Hinblick auf ihre NAS-Tauglichkeit. Das Rock64 Board hat mir vor allem wegen des USB 3.0 Anschlusses und der Gigabit Ethernet Schnittstelle gut gefallen. Beide Schnittstellen können gleichzeitig intensiv genutzt werden, ohne dass die eine Schnittstelle die andere Ausbremst (wie es bei den meisten anderen Single Board Computern der Fall ist). Häufig hängen Ethernet und USB an einem (USB 2.0) Bus, sodass die Leistung stark reduziert wird, wenn beides genutzt wird. Vor allem bei NAS-Anwendungen ist das hinderlich, denn so kann man keine der beiden Schnittstellen voll ausschöpfen.&lt;/p&gt;
&lt;p&gt;Beim Rock64 ist das anders: Die Schnittstellen sind an verschiedene USB-Hosts angebunden und müssen sich die Bandbreite daher nicht teilen. Ethernet und USB 3.0 können damit unabhängig voneinander voll ausgelastet werden.&lt;/p&gt;
&lt;p&gt;Für den Datenspeicher habe ich mich für eine &lt;strong&gt;1 TB SSD von Crucial&lt;/strong&gt; entschieden. Eine SSD sollte es vor allem wegen des Strombedarfs und des Lärmpegels sein. Zudem sollte bei diesem NAS auf ein RAID zur Datenabsicherung verzichtet werden. Um dennoch ein zuverlässiges System zu erhalten, empfiehlt sich der Einsatz eines nichtmechanischen Datenspeichers. Und nicht zuletzt sorgt eine SSD natürlich für ein angenehm schnelles System. Der Flaschenhals des NAS sollte am Gigabit-Ethernet liegen - nicht am Datenspeicher.&lt;/p&gt;
&lt;p&gt;Zusammen mit einem USB-Festplattengehäuse und einem zum Rock64 passenden Acrylglasgehäuse lässt sich ein einfaches und leistungsfähiges, aber optisch durchaus ansprechendes NAS bauen.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://thomas-leister.de/images/mini-backup-nas/rock64-nas.jpg" alt="Rock64"&gt;&lt;/p&gt;
&lt;h3 id="teileliste-und-preise"&gt;Teileliste und Preise&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;* Pine
* Pine Rock64 Board 4 GB | ~ 38,00 €
* Pine Rock64 Kühlkörper (optional) | ~ 0,40 €
* Steckernetzteil EU | ~ 6,00 €
* Acrylgehäuse Rock64 | ~ 6,80 €
* Versand aus China nach Europa | ~ 10,00 €
* Samsung EVO Plus Micro SDXC 64 GB Class 10 U3 | ~ 20,00 €
* ICY BOX Case 2,5 Zoll SATA USB 3.0 Festplattengehäuse | ~ 18,00 €
* 1000GB Crucial MX500 2.5&amp;#34; (CT1000MX500SSD1) | ~ 210,00 €
--------------------------------------------------------------------------------------------
Gesamtkosten: 309,20 €
(Stand: Juli 2018)
&lt;/code&gt;&lt;/pre&gt;&lt;div class="tip"&gt;
SD-Karte und Arbeitsspeicher sind höher dimensioniert als nötig, weil ich vorhabe, das Board nicht nur als NAS, sondern auch für den Betrieb anderer, kleiner Dienste zu nutzen. Wer das Rock64 Board nur als NAS einsetzen will, ist auch mit der günstigeren 1 GB-Version des Rock64 und einer kleineren SD-Karte gut beraten.
&lt;/div&gt;
&lt;h2 id="software"&gt;Software&lt;/h2&gt;
&lt;p&gt;Ursprünglich hatte ich vor, das NAS mit FreeBSD zu betreiben. Einerseits wegen des nativen ZFS-Supports, aber auch, um in der Praxis mehr in den Kontakt mit FreeBSD zu kommen. Leider gab es zum Zeitpunkt des Zusammenbaus noch kein FreeBSD-Image für das Rock64 Board, sodass ich mich stattdessen für die schlanke &lt;strong&gt;Linuxdistribution &lt;a href="https://dietpi.com/"&gt;DietPi&lt;/a&gt;&lt;/strong&gt; entschieden habe, die auf Debian aufbaut. Die Distribution ist speziell auf Single Board Computer getrimmt, sehr schlank und unterstützt das Rock64 Board offiziell.&lt;/p&gt;
&lt;p&gt;Meine Entscheidung habe ich nicht bereut: Standardmäßig ist nur das nötigste Installiert. Probleme mit Treibern oder ähnlichem konnte ich bisher nicht finden.&lt;/p&gt;
&lt;p&gt;Meine Backups mache ich übrigens mit dem Backup-Tool &amp;ldquo;&lt;a href="https://restic.readthedocs.io"&gt;Restic&lt;/a&gt;&amp;rdquo;. Als Zugang zum Backup-NAS genügt mir daher ein ganz normaler SSH-Zugang. Der Zugriff auf den Speicher erfolgt dann via SFTP.&lt;/p&gt;
&lt;h2 id="leistung"&gt;Leistung&lt;/h2&gt;
&lt;h3 id="ssd"&gt;SSD&lt;/h3&gt;
&lt;p&gt;Lesen von SSD via USB 3.0:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;hdparm -tT --direct /dev/sda
/dev/sda:
Timing O_DIRECT cached reads: 588 MB in 2.00 seconds = 293.31 MB/sec
Timing O_DIRECT disk reads: 992 MB in 3.00 seconds = 330.25 MB/sec
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Schreiben auf die SSD via USB 3.0:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.80873 s, 282 MB/s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Datenraten fallen in Verbindung mit dem Rock64 SBC geringer aus als bei direkter Nutzung am Laptop:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://thomas-leister.de/images/mini-backup-nas/ssd-laptop-performance.png" alt="Graph: SSD Performance am Laptop"&gt;&lt;/p&gt;
&lt;p&gt;Möglicherweise ist der USB-Controller des Rock64 nicht so leistungsfähig wie der meines Laptops und kann deshalb keine höhere Bandbreite erreichen. Bei der Nutzung des NAS fällt die geringere Leistung allerdings nicht ins Gewicht, da hier die Ethernet-Schnittstelle mit einer theoretischen maximalen Datenrate von 120 MB/s der limitierende Faktor ist.&lt;/p&gt;
&lt;h3 id="ethernet"&gt;Ethernet&lt;/h3&gt;
&lt;p&gt;Die Gigabit-Schnittstelle erreicht die praktisch zu erwartende Maximalleistung von ~940 MBit/s. Gemessen habe ich mittels &lt;code&gt;iperf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;iperf -c 192.168.178.100 -r
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 192.168.178.100, TCP port 5001
TCP window size: 196 KByte (default)
------------------------------------------------------------
[ 5] local 192.168.178.28 port 46066 connected with 192.168.178.100 port 5001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0-10.0 sec 1.09 GBytes 938 Mbits/sec
[ 4] local 192.168.178.28 port 5001 connected with 192.168.178.100 port 42658
[ 4] 0.0-10.0 sec 1.08 GBytes 923 Mbits/sec
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Im Upload werden also &lt;strong&gt;~ 938 MBit/s&lt;/strong&gt; erreicht, im Download sind es &lt;strong&gt;~ 923 MBit/s&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="sd-karte"&gt;SD-Karte&lt;/h3&gt;
&lt;p&gt;Lesen:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;hdparm -tT --direct /dev/mmcblk1
/dev/mmcblk1:
Timing O_DIRECT cached reads: 46 MB in 2.08 seconds = 22.17 MB/sec
Timing O_DIRECT disk reads: 68 MB in 3.04 seconds = 22.35 MB/sec
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Schreiben:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 61.1467 s, 17.6 MB/s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nicht nur die SSD, sondern auch die SD-Karte erreicht an Rock64 eine geringere Leistung, als an meinem Laptop. So konnte ich die SD-Karte am Laptop mit 44 MB/s lesen. Das ist schade, aber nicht weiter tragisch. Denn die Zugriffe auf die SD-Karte halten sich während des Betriebs ohnehin in Grenzen und spielen bei Backupvorgängen keine Rolle. Mit dem System lässt sich trotzdem relativ flüssig arbeiten (Softwareinstallation, Konfiguration, &amp;hellip;).&lt;/p&gt;
&lt;h3 id="sftp"&gt;SFTP&lt;/h3&gt;
&lt;p&gt;Die Übertragung einer großen Datei von meinem Laptop auf die NAS-SSD via SFTP lief mit &lt;strong&gt;~ 67 MB/s&lt;/strong&gt;. Nicht besonders schnell, wenn man die vorherigen Einzelmessungen von Ethernet-Schnittstelle und SSD berücksichtigt. Ein Grund für die eher mäßige Leistung könnte Overhead durch das SFTP-Protokoll und/oder die Verschlüsselung der Datenübertragung sein.&lt;/p&gt;
&lt;p&gt;Einiger Quellen im Netz zufolge scheint SFTP tatsächlich nicht besonders gut für schnelle Dateiübertragungen zu sein. Zum einen wegen der Verschlüsselung/Entschlüsselung, zum anderen wegen seines Designs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.cerberusftp.com/hc/en-us/articles/203333215-Why-is-SSH2-SFTP-so-much-slower-than-FTP-and-FTPS-"&gt;Cerberus FTP - Why is SSH2 SFTP so much slower than FTP and FTPS?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://daniel.haxx.se/blog/2010/12/08/making-sftp-transfers-fast/"&gt;Daniel Stenberg: Making SFTP transfers fast&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich habe verschiedene Cipher für die Datenübertragung ausprobiert - keiner davon brachte eine Verbesserung im Vergleich zum Standardcipher &lt;code&gt;AES256-GCM&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="samba"&gt;Samba&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Schreiben einer Datei auf ein Samba Share: ~ 56 MB/s
Lesen eines Samba Shares: ~ 64 MB/s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Warum die Leistung auch im Samba-Betrieb vergleichsweise gering ist, konnte ich bisher nicht herausfinden. Der YouTube-User &lt;em&gt;ExplainingComputers&lt;/em&gt; konnte (unter Windows) beispielsweise mit etwa 93 MB/s mittels Samba Share auf eine SSD schreiben.&lt;/p&gt;
&lt;p&gt;Möglicherweise kann eine höhere Leistung durch Optimierung der Konfiguration erreicht werden.&lt;/p&gt;
&lt;h3 id="nfs-v4"&gt;NFS v4&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Die Datenübertragung mittels NFS (Version 4) war mit Abstand die schnellste&lt;/strong&gt;: Die Gigabit-Anbindung konnte hiermit voll ausgenutzt werden. Datenraten von ~ &lt;strong&gt;118 MB/s&lt;/strong&gt; wurden so erreicht.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://thomas-leister.de/images/mini-backup-nas/nfs-datenrate.png" alt="NFS Screenshot"&gt;&lt;/p&gt;
&lt;p&gt;Zu beachten ist allerdings, dass die Datenübertragung hier (wie auch beim Samba-Share) standardmäßig unverschlüsselt abläuft. Wer die Verschlüsselung über die Kerberos-Erweiterung aktiviert, muss auch hier mit drastischen Performanceeinbußen rechnen &lt;a href="https://wiki.ubuntuusers.de/Kerberos/NFS_mit_Kerberos_sichern/#Vergleichstest"&gt;NFS mit Kerberos: Vergleichstest&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Ich bin mit meinem neuen NAS insgesamt zufrieden. Die Einzelleistungen der Komponenten sind für meine Zwecke für sich genommen völlig ausreichend. Schade zwar, dass SD-Karte und SSD nicht so schnell arbeiten, wie sie es an einem ausgewachsenen x86-Laptop tun, aber darüber kann ich hinwegsehen. Im Betrieb fällt das kaum ins Gewicht.&lt;/p&gt;
&lt;p&gt;Etwas ärgerlich ist, dass ich mit dem eigentlich fokussierten SFTP nicht so schnell auf den Speicher zugreifen kann, wie ich mir das ausgemalt hatte. 67 MB/s sind zwar schon ganz gut, aber dennoch würde ich ich die Ethernet-Verbindung gerne ganz ausreizen. Das gelingt mir aktuell nur mit einer ungesicherten NFS-Verbindung. Weil ich meine Daten nur ungern unverschlüsselt (auch über eigene) Netze übertrage, werde ich mich erst einmal mit der eingeschränkten Leistung abfinden.&lt;/p&gt;
&lt;p&gt;In nächster Zeit werde ich nach Möglichkeiten suchen, die Leistung bei SFTP-Übertragungen zu erhöhen. Vielleicht finde ich auch eine andere Art der schnellen und sicheren Datenübertragung - oder ich entscheide mich doch für ungesichertes NFS in Kombination mit einer Ende-zu-Ende Absicherung meiner Daten. Sollte ich zu einem Ergebnis kommen, das mit gefällt, wird das in diesem Beitrag natürlich ergänzt.&lt;/p&gt;
&lt;p&gt;Ansonsten peile ich noch an, die Daten auf dem NAS auf mein älteres, größeres NAS zu replizieren. Idealerweise natürlich Nachts, wenn ich die Internetverbindung selbst nicht nutze. So hätte ich zum einen einen schnellen lokalen (Zwischen?) Speicher, und müsste zum anderen nicht auf Geo-Replizierung verzichten.&lt;/p&gt;</description></item><item><title>TeamViewer für das CLI: Terminal-Sessions freigeben</title><link>https://thomas-leister.de/terminal-sessions-teilen/</link><pubDate>Tue, 26 Dec 2017 16:19:00 +0100</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/terminal-sessions-teilen/</guid><description>&lt;p&gt;Ein Kunde wollte mir kürzlich bei meiner Arbeit über die Schulter schauen, um einen Serverfehler und dessen Behebung live nachvollziehen zu können. Mein erster Gedanke ging in Richtung TeamViewer und Co. Ich könnte doch meinen Desktop einfach für ihn freigeben - oder gibt es eine bessere Alternative? Bei meiner Recherche habe ich ein paar Wege gefunden, meine Kommandozeile ohne TeamViewer freizugeben.&lt;/p&gt;
&lt;h2 id="freigabe-mit-screen"&gt;Freigabe mit Screen&lt;/h2&gt;
&lt;p&gt;GNU Screen dürfte vielen Linux-Administratoren bekannt sein. Es wird häufig genutzt, um länger andauernde Prozesse im Terminal außerhalb einer laufenden SSH-Sitzung weiter laufen zu lassen. Gewollte oder ungewollte Verbindungsabbrüche beenden die Ausführung eines CLI-Tools im Vordergrund nicht, denn die Sitzung ist vom SSH-Login entkoppelt. Der Benutzer kann sich jederzeit wieder zu seiner virtuellen Konsolensitzung verbinden oder sich von ihr trennen.&lt;/p&gt;
&lt;p&gt;Aber auch zum Teilen von Sitzungen eignet sich Screen. Ich gehe davon aus, dass beide Teilnehmer sich mit demselben Benutzer via SSH zum Server verbinden. Nun soll eine Screen-Terminalsitzung erstellt und mit dem zweiten Teilnehmer geteilt werden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;User 1 erstellt eine neue Screen-Sitzung:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;screen -S sharedsession
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;User 2 verbindet sich zu dieser Sitzung:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;screen -x sharedsession
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Beide Benutzer können sich via CTRL-A + D jederzeit wieder von der Session loslösen. Ein &amp;ldquo;exit&amp;rdquo; beendet die Sitzung auf beiden Seiten. Wird die SSH-Verbindung zum Server über verschiedene Benutzer hergestellt, müssen weitere Einstellunen gesetzt werden. Das Vorgehen ist am Ende dieser Seite erklärt: &lt;a href="http://wiki.networksecuritytoolkit.org/index.php/HowTo_Share_A_Terminal_Session_Using_Screen"&gt;http://wiki.networksecuritytoolkit.org/index.php/HowTo_Share_A_Terminal_Session_Using_Screen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Leider unterstützt Screen keinen Readonly-Modus - Beide Teilnehmer sind gleichberechtigt und können Kommandos ausführen.&lt;/p&gt;
&lt;h2 id="freigabe-mit-tmux"&gt;Freigabe mit Tmux&lt;/h2&gt;
&lt;p&gt;Auch mit Tmux ist eine Freigabe schnell eingerichtet:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;User 1 erstellt eine tmux-Sitzung:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;tmux new-session -s sharedsession
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;User 2 schaltet sich auf:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; tmux attach-session -t sharedsession
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wieder sind beide Benutzer gleichberechtigt. Benutzer 2 kann sich allerdings auch im &amp;ldquo;Read only&amp;rdquo;-Modus zur Sitzung verbinden. Er kann dann keine Eingaben vornehmen:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;tmux attach-session -r -t sharedsession
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Via CTRL-B + D kann sich jeder der Teilnehmer von der Sitzung loslösen. Ein &amp;ldquo;exit&amp;rdquo; beendet die Sitzung.&lt;/p&gt;
&lt;h2 id="freigabe-via-ssh-und-webinterface-mit-tmate"&gt;Freigabe via SSH und Webinterface mit Tmate&lt;/h2&gt;
&lt;p&gt;Der meiner Meinung nach schönste Weg zur Freigabe führt über das Tool &amp;ldquo;&lt;a href="https://tmate.io/"&gt;tmate&lt;/a&gt;&amp;rdquo;. Es ist eine Ableitung von tmux und erlaubt u.A. die Freigabe über eine HTML5-Webseite: Der Eingeladene bekommt einen Link, über den er entweder aktiv an der Sitzung teilnehmen kann oder nur passiv zusehen kann. Neben der Website kann auch via SSH zugegriffen werden. Nachteil: tmate ist nicht in allen Standardrepositories der gängigen Linuxdistributionen enthalten. Notfalls ist das Tool aber auch schnell selbst kompiliert. Die notwendigen Schritte sind auf der tmate-Website dokumentiert: &lt;a href="https://tmate.io/"&gt;https://tmate.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://thomas-leister.de/images/2017/12/26/tmate.png" alt="Tmate Screenshot"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;User 1 erstellt eine tmate-Sitzung (entweder lokal oder auf dem Server):&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;tmate
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;User 1 lässt sich die Links zur Sitzung ausgeben und gibt den gewünschten Link weiter&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;tmate show-messages
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;User 2 öffnet den Link zur Website oder verbindet sich via SSH.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;ldquo;Read only&amp;rdquo;-Modus, Normaler modus, HTML5-Website und SSH-Zugriff sind beliebig kombinierbar. So sollte für jeden Anwendungszweck etwas dabei sein.&lt;/p&gt;</description></item><item><title>Fedora 27: ED25519 OpenSSH Keys nach Benutzung entsperrt lassen</title><link>https://thomas-leister.de/fedora-ssh-keys-entsperren-keychain/</link><pubDate>Sun, 17 Dec 2017 12:12:00 +0100</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/fedora-ssh-keys-entsperren-keychain/</guid><description>&lt;p&gt;Leider kommt der Gnome Keyring nach wie vor nicht mit ED25519-SSH-Schüsseln zurecht. Das heißt: Standardmäßig muss bei jeder Verwendung eines SSH-Keys das dazugehörige Passwort erneut eingegeben werden. Mit dem Tool &amp;ldquo;Keychain&amp;rdquo; kann der Prozess vereinfacht werden: Auf meinem Fedora-Rechner ist die Eingabe des Passworts für einen Schlüssel von nun an nur noch bei der ersten Verwendung notwendig.&lt;/p&gt;
&lt;p&gt;Installation des &amp;ldquo;Keychain&amp;rdquo; Tools:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install keychain
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wird Keychain gestartet, sucht es nach einer bereits laufenden ssh-agent-Instanz, welche SSH-Keys in einem entsperrten Zustand zwischenspeichern kann. Existiert eine solche Instanz, verknüpft es die laufende Shell-Instanz mit diesem Agent. Läuft kein solcher Agent-Prozess, wird einer gestartet. Damit nicht bei jedem Start eines Shell-Fensters (z.B. Gnome Terminal) das Startkommando für Keychain manuell eingegeben werden muss, kann in der &lt;code&gt;~/.bashrc&lt;/code&gt; Datei ein Autostart-Eintrag angelegt werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;eval $(keychain --eval -Q --quiet)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Da ich nicht die Bash verwende, sondern die Zsh-Shell, habe ich stattdessen folgende Zeile zu meiner Zsh-Konfiguration &lt;code&gt;~/.zshrc&lt;/code&gt; hinzugefügt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;### Start Keychain
eval `keychain -q --eval --quiet`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In der SSH-Konfiguration unter &lt;code&gt;~/.ssh/config&lt;/code&gt; habe ich eine weitere Zeile hinzugefügt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AddKeysToAgent yes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Diese Zeile konfiguriert SSH so, dass einmal verwendete Schlüssel an den SSH-Agent übermittelt werden, sodass sie dort zwischengespeichert werden können.&lt;/p&gt;
&lt;div class="tip"&gt;
&lt;p&gt;&lt;strong&gt;Übrigens:&lt;/strong&gt; Üblicherweise werden dem Keychain-Kommando schon beim Start die zu entsperrenden Keys mitgegeben:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;eval $(keychain --eval -Q --quiet ~/.ssh/id_ed25519)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In diesem Fall ist die Konfiguration von SSH (zur Übermittlung des Keys) nicht notwendig. Allerdings hat diese Variante den unangenehmen Nebeneffekt, dass man beim Öffnen eines Terminal-Fensters sofort mit der Entsperrung eines Keys belästigt wird - auch, wenn man erst einmal gar nicht vor hat, einen der hinterlegten Keys zu nutzen. Daher übergebe ich Keychain zunächst keine Schlüssel. Keychain hat dann nur die Aufgabe, einen zentralen SSH-Agent mit allen Shell-Instanzen zu verknüpfen. Das Hinzufügen von Keys zum Agent geschieht bei mir über die zusätzliche SSH-Konfiguration.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Um die neuen Einstellungen zu übernehmen, müssen alle Terminal-Fenster bzw. Shell-Instanzen geschlossen und neu geöffnet werden. Beim Start sollte Keychain sichergestellt haben, dass ein SSH Agent läuft und mit der jeweiligen Shell verknüpft ist. Wird nun beispielsweise eine SSH-Anmeldung an einem fremden Rechner durchgeführt, wird nach dem Passwort für den Schlüssel gefragt. Nach Beendigung der Session und einem weiteren SSH-Befehl muss das Passwort nicht mehr eingegeben werden. Das gilt auch für alle weiteren, geöffneten Shell-Instanzen.&lt;/p&gt;
&lt;p&gt;Wer das Setup etwas sicherer gestalten möchte, kann Keychain anweisen, den ssh-agent-Prozess mit einer Timeout-Flag zu starten. Zwischengespeicherte Keys werden dann nur für einen beschränkten Zeitraum im Speicher belassen (timeout in Minuten):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;eval $(keychain --eval -Q --quiet --timeout 30)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nach Ablauf des Timeouts ist eine erneute Passworteingabe erforderlich. Eine manuelle Sperrung aller Keys kann bei Bedarf mit folgendem Kommandos durchgeführt werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;keychain --clear
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;Das hier vorgestellte Setup ermöglicht mir einen ähnlich bequemen Umgang, wie er mir mit meinen RSA-Schlüsseln über den Gnome-Schlüsselmanager möglich war. Die Verwendung von technisch überlegenen ED25519-Schlüsseln bedeutet nun keine Beeinträchtigung meines Workflows mehr. Das ständige Eintippen von langen, komplexen Passwörtern hat damit ein Ende.&lt;/p&gt;</description></item><item><title>Einen zentralen Mailserver (Mail-Gateway) mit weiteren Hosts nutzen</title><link>https://thomas-leister.de/zentralen-mailserver-mit-weiteren-servern-nutzen/</link><pubDate>Tue, 12 Sep 2017 14:30:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/zentralen-mailserver-mit-weiteren-servern-nutzen/</guid><description>&lt;p&gt;Wer bereits ein Mail-System für den Versand und Empfang von E-Mails aufgesetzt hat, weiß, dass das je nach Funktionsumfang viel Arbeit sein kann. Wenn nicht nur ein Host E-Mails verschicken soll, sondern mehrere, kann es sich lohnen, einen zentralen Mailserver als &amp;ldquo;Mail-Gateway&amp;rdquo; zu nutzen. Das bedeutet: Für den Versand von E-Mails in das Internet und den Empfang aus dem Internet ist nur dieser eine Mailserver zuständig. Alle weiteren Hosts (&amp;ldquo;externe Hosts&amp;rdquo;) benötigen keine aufwendige Mailserver-Konfiguration, sondern kommen mit einer Minimalkonfiguration aus, welche es ihnen erlaubt, beim Versand auf das Gateway zurückzugreifen. DKIM, SPF und weitere Versand-spezifische Merkmale müssen dann nur auf dem Gateway eingerichtet und gewartet werden.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://thomas-leister.de/images/2017/09/12/mailserver-gateway.png" alt="Mailserver Gateway"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Gateway&amp;rdquo;: Der Server, auf dem das Mailsystem eingerichtet ist.&lt;/li&gt;
&lt;li&gt;Host&amp;quot; / &amp;ldquo;externer Host&amp;rdquo;: Ein Server, der für den Mailversand den Mailserver nutzen soll.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="tip"&gt;
Im folgenden setze ich voraus, dass das Mail-Gateway nach meiner &lt;a href="https://thomas-leister.de/mailserver-debian-stretch/"&gt;Mailserver-Anleitung&lt;/a&gt; aufgesetzt ist. Prinzipiell funktioniert es aber ähnlich auch mit anderen Gateways
&lt;/div&gt;
&lt;h2 id="postfix-grundkonfiguration-auf-dem-externen-host"&gt;Postfix-Grundkonfiguration auf dem externen Host&lt;/h2&gt;
&lt;h3 id="externen-mailempfang-auf-den-hosts-abschalten"&gt;Externen Mailempfang auf den Hosts abschalten&lt;/h3&gt;
&lt;p&gt;Ẁenn ein Host nur für den Versand verwendet wird, kann der smtpd-Teil von Postfix abgeschaltet werden. In der Datei &lt;code&gt;/etc/postfix/master.cf&lt;/code&gt; werden smtpd und ggf. submission-Teil einfach auskommentiert:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
#smtp inet n - - - - smtpd
#smtp inet n - - - 1 postscreen
#smtpd pass - - - - - smtpd
#dnsblog unix - - - - 0 dnsblog
#tlsproxy unix - - - - 0 tlsproxy
#submission inet n - - - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
#smtps inet n - - - - smtpd
# -o syslog_name=postfix/smtps
# -o smtpd_tls_wrappermode=yes
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="eine-maincf-nur-für-den-nachrichtenversand"&gt;Eine main.cf nur für den Nachrichtenversand&lt;/h3&gt;
&lt;p&gt;In der &lt;code&gt;/etc/postfix/main.cf&lt;/code&gt; müssen nur wenige Einstellungen festgelegt werden. Diese werden je nach Art des Setups (im Folgenden) erweitert.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;myhostname = host1.mydomain.tld
inet_protocols = all
inet_interfaces = 127.0.0.1, 10.8.0.1
##
## Mail-Queue Einstellungen
##
maximal_queue_lifetime = 1h
bounce_queue_lifetime = 1h
maximal_backoff_time = 15m
minimal_backoff_time = 5m
queue_run_delay = 5m
##
## TLS Einstellungen
###
tls_ssl_options = NO_COMPRESSION
tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
### Ausgehende Verbindungen (SMTP Client)
smtp_tls_security_level = dane
smtp_dns_support_level = dnssec
smtp_host_lookup = dns, native
smtp_tls_note_starttls_offer = yes
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_ciphers=high
smtp_tls_CAfile =/etc/ssl/certs/ca-certificates.crt
smtp_tls_loglevel = 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;(Bitte anpassen!)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="fall-1-externer-host-mit-statischer-ip-adresse"&gt;Fall 1: Externer Host mit statischer IP-Adresse&lt;/h2&gt;
&lt;p&gt;Hosts, die über eine statische IP-Adresse (also eine immer gleich bleibende Adresse) erreichbar sind, kann sehr einfach der Zugriff auf das Gateway erlaubt werden. Dazu wird z.B. Host1 mit der IP-Adresse &lt;code&gt;10.8.0.1&lt;/code&gt; &lt;strong&gt;in der Konfiguration des Gateways&lt;/strong&gt; in &lt;code&gt;mynetworks&lt;/code&gt; (main.cf) aufgenommen, z.B. so:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
10.8.0.1/32
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anwenden der neuen Einstellungen auf dem Mail-Gateway &lt;code&gt;mail.mysystems.tld&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl reload postfix
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auf dem externen Host &lt;code&gt;host1.mydomain.tld&lt;/code&gt; wird Postfix via &lt;code&gt;relayhost&lt;/code&gt; angewiesen, sämtliche Mails, die nicht lokal zugestellt werden können, an das Gateway weiterzureichen. Die Datei &lt;code&gt;/etc/postfix/main.cf&lt;/code&gt; auf dem Host wird dazu um folgende Zeilen erweitert:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;##
## Alle E-Mails an nicht-lokale Empfänger an das Gateway weiterleiten
##
relayhost = mail.mysystems.tld
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anwenden der Einstellungen auf dem externen Host &lt;code&gt;host1.mydomain.tld&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl reload postfix
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="fall-2-externer-host-mit-dynamischer-ip-adresse-zb-homeserver"&gt;Fall 2: Externer Host mit dynamischer IP-Adresse (z.B. Homeserver)&lt;/h2&gt;
&lt;p&gt;Wenn ein Host über keine statische IP-Adresse verfügt, wie es z.B. bei den meisten Homeservern der Fall ist, muss zu einem etwas komplizierteren Setup gegriffen werden. In diesem Fall kann der Host nicht über die IP-Adresse autorisiert werden, sodass wir auf die normale SMTP-Authentifizierung zurückgreifen. Letztendlich ist die Postfix-Instanz auf dem Host für das Gateway also nichts weiteres als ein ganz normaler E-Mail-Client. Daher muss das Gateway auch über den &lt;strong&gt;Submission Port 587 angesprochen werden - nicht über Port 25!&lt;/strong&gt;. Fügt die folgende Zeile am Host in der &lt;code&gt;/etc/postfix/main.cf&lt;/code&gt; an:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;relayhost = [mail.mysystems.tld]:587
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Für die Authentifizierung wird außerdem der folgende Block unten angefügt:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;##
## Authentifizierung am Relayhost
##
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_passwd
smtp_sasl_security_options = noanonymous
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Postfix-Instanz auf dem Host meldet sich wie ein normaler MUA (Mail user Agent) an, und muss daher auch ein entsprechendes Mailkonto auf dem Mail-Gateway besitzen, z.B. &lt;code&gt;host3@mysystems.tld&lt;/code&gt;. Die dazugehörigen Zugangsdaten werden in die Datei &lt;code&gt;/etc/postfix/relay_passwd&lt;/code&gt; eingetragen:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[mail.mysystems.tld]:587 host3@mysystems.tld:meinpasswort
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Via&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;postmap /etc/postfix/relay_passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;wird eine Datenbank-Datei erzeugt, die von Postfix gelesen werden kann. Bei jeder Änderung an &lt;code&gt;relay_passwd&lt;/code&gt; muss dieses Kommando erneut ausgeführt werden.&lt;/p&gt;
&lt;p&gt;Eine Besonderheit gibt es bei dieser Art des Setups noch: Da Postfix einen normalen Benutzer-Account für die Verbindung zum Gateway nutzt, ist er auch den Beschränkungen unterworfen, die für solche Accounts gelten. So dürfen Benutzer gemäß meines Mailserver-Setups nur E-Mails in ihrem eigenen Namen versenden. Damit soll Adressfälschung bei ausgehenden E-Mails verhindert werden. Der Host dürfte also nur E-Mails mit dem Absender &lt;code&gt;host3@mysystems.tld&lt;/code&gt; erzeugen. Alles andere würde vom Gateway blockiert werden. Nun senden einige Tools wie z.B. mdadm aber standardmäßig im Namen &lt;code&gt;root@host3.mydomain.tld&lt;/code&gt; - der Versand würde scheitern.&lt;/p&gt;
&lt;p&gt;Die Lösung für das Problem ist ein Neu-Schreiben des &amp;ldquo;Envelope-From&amp;rdquo;: E-Mails, die vom Host ausgehen, werden so umgeschrieben, dass deren Absender immer &lt;code&gt;host3@mysystems.tld&lt;/code&gt; lautet. Damit wird das Problem umgangen. Zum Umschreiben wird die Einstellung &lt;code&gt;sender_canonical_maps&lt;/code&gt; genutzt. Fügt das folgende Snippet unten an die &lt;code&gt;main.cf&lt;/code&gt; an:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;###
### Adressen von Absendern, z.B. root@host3.mydomain.tld müssen nach host3@mysystems.tld umgeschrieben werden
### Für außenstehende Systeme darf es nur host3@mysystems.tld als Absender geben.
###
sender_canonical_maps = hash:/etc/postfix/rewrite_from
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;hellip; und erzeugt eine neue Datei &lt;code&gt;/etc/postfix/rewrite_from&lt;/code&gt; mit folgendem Inhalt:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;@host3.mydomain.tld host3@mysystems.tld
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Auch diese Datei wird via &lt;code&gt;postmap&lt;/code&gt; in eine für Postfix lesbare Datenbank umgewandelt.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;postmap /etc/postfix/rewrite_from
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anwenden der Einstellungen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl reload postfix
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="lokale-mailzustellung-auf-externen-hosts-verhindern-und-mails-weiterleiten"&gt;Lokale Mailzustellung auf externen Hosts verhindern und Mails weiterleiten&lt;/h2&gt;
&lt;p&gt;Standardmäßig werden E-Mails, die beispielsweise an den lokalen &amp;ldquo;root&amp;rdquo;-User eines externen Hosts gehen, nicht über das Gateway geschickt. Benachrichtigungsmails bzgl. RAID-Status, APT-Status und Mails von weiteren Softwarepaketen bleiben dann lokal in &lt;code&gt;/var/mail/root&lt;/code&gt; liegen und geraten in Vergessenheit. Durch ein Umschreiben des Empfängers von selbst erzeugten Mails können diese Systemmails aber abgegriffen und an eine beliebige, andere Mailadresse weitergeleitet werden. Dazu wird in &lt;code&gt;/etc/postfix/main.cf&lt;/code&gt; auf dem jeweiligen Host folgendes unten angefügt:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;###
### Lokale Empfänger *@host1 (z.B. &amp;#34;root&amp;#34;) umschreiben
### damit Mails nicht in /var/mail/root abgelegt werden, sondern an beliebigen Empfänger weitergeleitet werden.
###
recipient_canonical_maps = hash:/etc/postfix/rewrite_local_to
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die zugehörige Datei &lt;code&gt;/etc/postfix/rewrite_local_to&lt;/code&gt; wird mit folgendem Inhalt angelegt:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;@host1.mydomain.tld postmaster@mysystems.tld
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Damit würden sämtliche Mails an lokale Nutzer des Hosts an &lt;code&gt;postmaster@mysystems.tld&lt;/code&gt; weitergeleitet werden. Wer das Umschreiben des Empfängers beschränken will, kann statt &lt;code&gt;@host1.mydomain.tld&lt;/code&gt; auch vollständige Adressen wie z.B. &lt;code&gt;root@host1.mydomain.tld&lt;/code&gt; angeben.&lt;/p&gt;
&lt;p&gt;Nach dieser Konfigurationsänderung ist es notwendig, die passende Datenbankdatei für Postfix zu erzeugen und den Dienst neu zu starten:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;postmap /etc/postfix/rewrite_local_to
systemctl reload postfix
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Das Postmap-Kommando muss nach jeder Änderung in der Datei &lt;code&gt;rewrite_local_to&lt;/code&gt; wiederholt werden!&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="setup-testen"&gt;Setup testen&lt;/h2&gt;
&lt;p&gt;Auf den Hosts kann das Verhalten von Postfix überprüft werden, indem eine kleine Testmail verschickt wird:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;quot;Testmail an eine beliebige E-Mail-Adresse&amp;quot; | mail -s &amp;quot;Testmail&amp;quot; postmaster@mysystems.tld
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ob auch E-Mails an den lokalen &amp;ldquo;root&amp;rdquo; User eines Hosts erfolgreich eingesammelt und weitergeleitet werden, kann hiermit überprüft werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;quot;Testmail an den lokalen root-User&amp;quot; | mail -s &amp;quot;Testmail&amp;quot; root
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Systemd: Service-Start von Netzwerk-Interface abhängig machen</title><link>https://thomas-leister.de/systemd-service-wenn-netzwerk-interface-bereit/</link><pubDate>Mon, 11 Sep 2017 12:46:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/systemd-service-wenn-netzwerk-interface-bereit/</guid><description>&lt;p&gt;In meinem &lt;a href="https://thomas-leister.de/hosts-wartungsnetz-peervpn/"&gt;letzten Beitrag&lt;/a&gt; habe ich mein PeerVPN-Setup zur Realisierung meines Wartungsnetzes vorgestellt. Wenige Stunden später musste ich feststellen, dass ich bei meinem Setup etwas wichtiges nicht bedacht hatte: Bei einem Server-Neustart versuchen die Dienste, die nur über das Wartungsnetze 10.8.1.0/24 erreichbar sein sollen, sich an das srvnet0-Interface zu binden. Das schlägt allerdings fehl, denn der Docker-Container mit dem PeerVPN-Node startet erst wesentlich später, und die srvnet0-Schnittstelle existiert bis zu diesem Zeitpunkt noch nicht. Das wird mit Fehlermeldungen und nicht verfügbaren Diensten bestraft. Die Lösung ist, diese Dienste warten zu lassen, bis srvnet0 verfügbar ist.&lt;/p&gt;
&lt;h2 id="ein-neues-systemd-target-einführen"&gt;Ein neues Systemd-Target einführen&lt;/h2&gt;
&lt;p&gt;Da der Zeitpunkt der srvnet0-Verfügbarkeit ein wichtiger Anker für weitere Abhängigkeiten ist, habe ich mich entschieden, auf meinen Systemen ein neues Systemd-Target &lt;code&gt;/etc/systemd/system/srvnet0.target&lt;/code&gt; einzuführen:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[Unit]
Description=target is active if srvnet0 interface is available
Requires=sys-subsystem-net-devices-srvnet0.device
After=sys-subsystem-net-devices-srvnet0.device
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sobald die srvnet0-Schnittstelle verfügbar ist, wechselt der Status des Targets auf &amp;ldquo;active&amp;rdquo;, und alle vom Target abhängigen Dienste werden nun ebenfalls gestartet. Der Docker-Container mit PeerVPN wird bereits durch den automatisch startenden Docker-Daemon gestartet, denn als &amp;ldquo;restart&amp;rdquo;-Policy wurde für diesen Container &amp;ldquo;always&amp;rdquo; angegeben. Darum müssen wir uns also nicht kümmern.&lt;/p&gt;
&lt;h2 id="weitere-dienste-vom-target-abhängig-machen"&gt;Weitere Dienste vom Target abhängig machen&lt;/h2&gt;
&lt;p&gt;Nun, da das neue Target definiert ist, und den Zeitpunkt markiert, an dem die VPN-Schnittstelle verfügbar ist, muss dieses nur noch in die Service-Definitionen als Requirement aufgenommen werden:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;After=srvnet0.target
Requires=srvnet0.target
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Es ist allerdings ratsam, diese Definition nicht in bereits bestehenden Unit-Files zu ergänzen, sondern stattdessen eine weitere Konfigurationsdatei zu erzeugen, welche ein bestehendes Unit-File automatisch ergänzt. Soll beispielsweise der Unbound-Resolver (Service: &lt;code&gt;unbound.service&lt;/code&gt;) auf die srvnet0-Schnittstelle warten, so wird ein Verzeichnis &lt;code&gt;/etc/systemd/system/unbound.service.d/&lt;/code&gt; angelegt, und darin eine Datei &lt;code&gt;unbound.conf&lt;/code&gt;. Diese enthält folgenden Inhalt:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[Unit]
After=srvnet0.target
Requires=srvnet0.target
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Systemd führt alle Unit-Files inkl. Ergänzungsdateien dann automatisch zusammen. Konflikte bei Paket-Upgrades durch manuell veränderte Unit-Files werden somit verhindert und Anpassungen bleiben von den Standardkonfigurationen sauber getrennt.&lt;/p&gt;
&lt;p&gt;Die neue Systemd-Konfiguration wird nun neu geladen:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nach einem Reboot kann überprüft werden, ob Target und abhängiger Service erfolgreich gestartet wurden:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl status srvnet0.target
systemctl status unbound.service
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Beide Kommandos sollten in grüner Farbe &amp;ldquo;active&amp;rdquo; zeigen.&lt;/p&gt;
&lt;div class="tip"&gt;
Die srvnet0-Schnittstelle ist übrigens schon verfügbar, &lt;em&gt;bevor&lt;/em&gt; Traffic durch das VPN geschickt werden kann. Bis die Kommunikation zwischen den Nodes funktioniert, können noch ein paar Sekunden vergehen. Anwendungen können jedoch schon vorher Ports auf dieser Schnittstelle belegen.
&lt;/div&gt;
&lt;p&gt;Weitere Services können vom Target abhängig gemacht werden, indem für sie ebenfalls ein neues, passend benanntes Verzeichnis mit der oben stehenden Konfiguration angelegt wird. (Neuladen der Systemd-Konfiguration nicht vergessen!)&lt;/p&gt;</description></item><item><title>Ein Wartungsnetz für meine Server-Infrastruktur mit PeerVPN und Docker</title><link>https://thomas-leister.de/hosts-wartungsnetz-peervpn/</link><pubDate>Tue, 05 Sep 2017 14:14:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/hosts-wartungsnetz-peervpn/</guid><description>&lt;p&gt;In meinem Beitrag &amp;ldquo;&lt;a href="https://thomas-leister.de/dezentrales-server-vpn-peervpn/"&gt;Dezentrales HA Servercluster-VPN mit PeerVPN&lt;/a&gt;&amp;rdquo; habe ich euch PeerVPN vorgestellt - einen kleinen Peer-to-Peer VPN-Server, der sich wunderbar eignet, um seine Hosts miteinander zu vernetzen. Ich betreibe selbst mehrere Server an verschiedenen Standorten, die direkt miteinander Daten austauschen. So kommuniziert beispielsweise jeder Host mit einem zentralen Munin-Server, um Statusupdates zu senden. Auch Icinga-Daemons laufen auf den Hosts und prüfen verschiedene lokale Dienste. Das Ergebnis wird an das Icinga-Backend geschickt.&lt;/p&gt;
&lt;p&gt;All diese Kommunikation soll für die Öffentlichkeit nicht einsehbar sein, d.h.:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die Existenz von Wartungs- und Verwaltungsdiensten soll verborgen werden&lt;/li&gt;
&lt;li&gt;Die Verbindung soll verschlüsselt werden: Internet und Hoster kann im Zweifel nicht getraut werden&lt;/li&gt;
&lt;li&gt;Nur autorisierte Personen oder Maschinen sollen Zugriff auf bestimmte Dienste haben (z.B. Admin, Munin-Frontend)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ziel ist also ein &amp;ldquo;Wartungsnetz&amp;rdquo;, welches nur dem Austausch der Hosts untereinander und dem Administrator dienen soll. Dienste wie Munin-Clients, Icinga-Clients, Docker-Daemons und sonstiges werden fest an die IP-Adresse aus dem Wartungsnetz gebunden und sind damit nicht mehr über die öffentlichen IP-Adressen des jeweiligen Hosts erreichbar. Das bringt drei Vorteile mit sich:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ein aufgeräumtes Setup: Öffentliches kommt ans Internet, Privates in ein eigenes Netz.&lt;/li&gt;
&lt;li&gt;Sicherheit:
&lt;ul&gt;
&lt;li&gt;Sicherheitskritische Dienste und Dienste, die nicht für die Öffentlichkeit bestimmt sind, sind aus dem Internet nicht erreichbar.&lt;/li&gt;
&lt;li&gt;Es gibt Client-Server-Software, die nicht für den Betrieb im Internet ausgelegt ist, sondern nur für die Verwendung innerhalb eines Rechenzentrums (z.B. in dedizierten, lokalen Netzen). Auf Verschlüsselung und Authentifizierung wird hier oftmals verzichtet. Diese Software kann in einem solchen Wartungsnetz trotzdem guten Gewissens genutzt werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Komfort: Software via MySQL, Redis und weitere beherrschen zwar oft die Absicherung der Verbindung in einem Client-Server / Cluster -Setup, doch das Einbinden neuer Nodes ist nicht immer bequem. So beherrscht beispielsweise auch Munin sichere Verbindungen via TLS - dafür muss dann aber eine X.509-CA aufgebaut und gepflegt werden. Das schließt dann auch das umständliche Hantieren mit Zertifikaten ein. In einem dedizierten, sicheren Host-Netz kann auf die Munin-eigene Authentifizierung verzichtet werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Heute habe ich die vollständige Vernetzung all meiner Hosts in ein eigenes Wartungsnetz (bzw. virtuelles &amp;ldquo;lokales&amp;rdquo; Netz) in Angriff genommen. Sofort war klar, dass ich das Netz mit PeerVPN realisieren wollte, um einen Single Point of Failure zu vermeiden. Bei Installieren der Software auf dem ersten Server ist mir jedoch folgendes aufgefallen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PeerVPN ist nicht kompatibel mit OpenSSL 1.1, welches von allen Hosts verwendet wird. Das Problem lässt sich lösen, indem PeerVPN statisch mit LibreSSL gelinkt wird. Dann bekommen die LibreSSL-Bibliotheken allerdings keine automatischen Updates durch das Betriebssystem. Heißt: Updates für LibreSSL müsste ich dann manuell verfolgen, und auf jedem der Hosts bei Bedarf PeerVPN neu linken.&lt;/li&gt;
&lt;li&gt;Die Installation von PeerVPN ist nicht besonders zeitintensiv, aber die Einrichtung auf mehreren Hosts artet dann doch in Arbeit aus: Quellcode herunterladen, LibreSSL herunterladen, PeerVPN kompilieren und linken, im System integrieren, und einen Systemd-Service erstellen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das muss doch auch bequemer gehen. Und vor allem die Sache mit den Updates wollte ich eleganter gelöst haben.&lt;/p&gt;
&lt;h2 id="eine-komfortable-lösung-peervpn-im-docker-container"&gt;Eine komfortable Lösung: PeerVPN im Docker-Container&lt;/h2&gt;
&lt;p&gt;Wenn man eine einzelne Anwendung als Baustein unabhängig vom Hostsystem ausrollen will, bieten sich Linux-Container an. Ich musste sofort an einen Docker-Container denken, den ich auf jedem meiner Hosts starten kann. PeerVPN sollte im Docker-Container laufen und mittels Host-Networking allen anderen Diensten auf demselben Host den Zugriff auf das Wartungsnetz ermöglichen. Glücklicherweise hat sich &lt;a href="https://github.com/mjuenema"&gt;Markus Juenemann&lt;/a&gt; bereits Gedanken zu PeerVPN unter Docker gemacht, sodass ich seine &lt;a href="https://github.com/mjuenema/docker-alpine-peervpn"&gt;Arbeit&lt;/a&gt; aufgreifen konnte. Ein paar kleine Änderungen habe ich schließlich in einen Fork des Projekts eingebracht: &lt;a href="https://github.com/ThomasLeister/docker-alpine-peervpn"&gt;https://github.com/ThomasLeister/docker-alpine-peervpn&lt;/a&gt;
&lt;em&gt;(die meisten Änderungen sind inzwischen via Pull Request zurück in das Originalprojekt geflossen)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="vpn-deployment-auf-den-hosts"&gt;VPN Deployment auf den Hosts&lt;/h2&gt;
&lt;p&gt;Von nun an war die Verknüpfung der Hosts miteinander ein Kinderspiel. Docker und Docker-Compose waren auf den meisten Maschinen schon vorhanden. Für die Integration eines neuen Hosts in das Wartungsnetz waren nur noch 2 Schritte notwendig:&lt;/p&gt;
&lt;h3 id="1-docker-compose-file-auf-den-host-kopieren"&gt;1) Docker-Compose File auf den Host kopieren&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;version: &amp;#39;3&amp;#39;
services:
peervpn:
image: thomasleister/peervpn
container_name: &amp;#34;peervpn&amp;#34;
network_mode: &amp;#34;host&amp;#34;
cap_add:
- NET_ADMIN
restart: &amp;#34;always&amp;#34;
environment:
NETWORKNAME: srvnet
INTERFACE: &amp;#34;srvnet0&amp;#34;
PSK: &amp;#34;meintollerpresharedkey&amp;#34;
LOCAL: &amp;#34;0.0.0.0&amp;#34;
PORT: 7000
INITPEERS: &amp;#34;1.2.3.4 7000&amp;#34;
IFCONFIG4: &amp;#34;10.8.1.1/24&amp;#34;
ENABLERELAY: &amp;#34;yes&amp;#34;
ENABLEIPV6: &amp;#34;no&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(&amp;hellip; und anpassen!)&lt;/p&gt;
&lt;h3 id="2-peervpn-starten"&gt;2) PeerVPN starten&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Zur Überprüfung der Funktion kann die Ausgabe von PeerVPN beobachtet werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose logs -f peervpn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nach wenigen Sekunden können sich alle teilnehmenden Hosts über die 10.8.1.x-IP-Adressen erreichen, oder auf dem srvnet0 Interface eigene Dienste über dieses Netz verfügbar machen.&lt;/p&gt;
&lt;h2 id="automatische-updates-mit-watchtower"&gt;Automatische Updates mit Watchtower&lt;/h2&gt;
&lt;p&gt;Ein generelles Problem beim Einsatz von Docker sind fehlende, automatische Updates. So würde mein Alpine-Linux-Container mit PeerVPN nach dem ersten Pull des Images immer mit demselben Softwarestand laufen bzw. wieder gestartet werden. LibreSSL-Updates würden meinen Container nicht ohne weiteres Zutun erreichen. Ich müsste ständig selbst nachsehen, ob es Updates für Alpine Linux gibt, dann mein Image ggf. neu bauen und auf allen Hosts dieses neue Image downloaden, um dann meine PeerVPN-Container neu zu starten.&lt;/p&gt;
&lt;p&gt;Mein eigenes PeerVPN-Image auf DockerHub kann ich automatisch neu bauen lassen, wenn das Basisimage (Alpine Linux Official) sich verändert. Doch wie kommt das aktuelle PeerVPN-Image auf meine Hosts? Auch hierfür gibt es eine Lösung: &lt;a href="https://github.com/v2tec/watchtower"&gt;Watchtower&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Das Tool wird selbst als Container auf den Hosts gestartet und überwacht alle aktiven Container. Ändert sich das Image, auf dem ein Container basiert, erkennt Watchtower das, lädt das neue Image herunter und startet die entsprechenden Container neu.&lt;/p&gt;
&lt;p&gt;Neben meinen PeerVPN-Containern habe ich auf jedem der Hosts also auch einen Watchtower-Container gestartet. Der nützt mir nicht nur im Zusammenhang mit PeerVPN, sondern generell bei allen Docker-Containeranwendungen. Der zusätzliche Aufwand fiel für mich daher nicht so sehr ins Gewicht.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;version: &amp;#39;3&amp;#39;
services:
watchtower:
image: v2tec/watchtower
container_name: &amp;#34;watchtower&amp;#34;
restart: &amp;#34;always&amp;#34;
volumes:
- &amp;#34;/var/run/docker.sock:/var/run/docker.sock&amp;#34;
command: &amp;#34;--interval 300 --cleanup&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Watchtower starten:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wer nur einzelne Container auf Updates überwachen lassen will, kann den &amp;ldquo;command&amp;rdquo; Parameter z.B. wie folgt erweitern:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;command: &amp;quot;--interval 300 --cleanup meincontainer1 meincontainer2 meincontainer3&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(Übrigens: Watchtower aktualisiert nicht nur andere Container, sondern konsequenterweise auch sich selbst)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Meine Hosts sind nun allesamt miteinander sicher vernetzt. Monitoring-Tools und andere verteilte Anwendungen können nun miteinander verknüpft werden, als wären sie in einem gemeinsamen, lokalen Netz. Das nimmt einem nicht nur Arbeit bei der Konfiguration ab, sondern sorgt auch für eine striktere Trennung zwischen Administrator-Diensten und öffentlichen Diensten.&lt;/p&gt;
&lt;p&gt;Durch die Kapselung der VPN-Software in einem Docker-Container und die automatischen Updates via Watchtower muss ich mir keine Gedanken mehr um Updates und Kompatibilität mit dem Hostsystem machen. Neue Hosts sind zudem schnell in das bestehende Netz integriert.&lt;/p&gt;
&lt;p&gt;Wer ein solches Wartungsnetz auch für seine Infrastruktur nutzen will, kann gerne auf mein &lt;a href="https://hub.docker.com/r/thomasleister/peervpn/"&gt;Docker-Image&lt;/a&gt; und die oben genannten Docker-Compose-Files zurückgreifen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Übrigens: Die 10.8.1.x-Adressen der Hosts habe ich im DNS verfügbar gemacht. So könnte z.B. 10.8.1.1 auf meinhost.srvnet.domain.tld gemappt sein. Das erleichtert den Umgang mit den IP-Adressen&lt;/em&gt;&lt;/p&gt;
&lt;div class="warning"&gt;
&lt;strong&gt;Update am 11.09.2017: Ggf. starten Dienste nach einem Reboot nicht mehr&lt;/strong&gt;, weil sie versuchen, Ports auf der srvnet0-Schnittstelle zu belegen, welche zu diesem Zeitpunkt aber noch nicht existiert. Der Docker-Container mit PeerVPN benötigt etwas Zeit, bis er hochgefahren ist. Eine Lösung für dieses Problem stelle ich in diesem Beitrag vor: &lt;a href="https://thomas-leister.de/systemd-service-wenn-netzwerk-interface-bereit/"&gt;Systemd: Dienst-Start von Netzwerk-Interface abhängig machen&lt;/a&gt;.
&lt;/div&gt;</description></item><item><title>Powerwalker UPS unter Debian 9 Stretch</title><link>https://thomas-leister.de/powerwalker-ups-debian-stretch/</link><pubDate>Sun, 03 Sep 2017 17:29:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/powerwalker-ups-debian-stretch/</guid><description>&lt;p&gt;Mit der Umstellung meines &lt;a href="https://legacy.thomas-leister.de/projekt-ubuntu-nas-server-fuer-zuhause/"&gt;Homeservers&lt;/a&gt; auf Debian 9 Stretch war es auch an der Zeit, sich einmal um die daran angeschlossene Unterbrechungsfreie Stromversorgung (&amp;ldquo;UPS&amp;rdquo;: Uninterruptible Power Supply) zu kümmern. Mit dem Kauf der UPS hatte ich die &lt;a href="https://legacy.thomas-leister.de/viewpower-software-fuer-powerwalker-ups-line-interactive-unter-ubuntu-linux-installieren/"&gt;Herstellersoftware&lt;/a&gt; zur Überwachung und zum Automatischen Herunterfahren des Servers auf selbigem installiert. Nach kurzer Zeit gefiel mir die aufgeblähte und schlecht gepflegte Java-Lösung allerdings nicht mehr und ich verzichtete auf eine UPS-Softwarekomponente auf dem Server. Das hatte zwar den Nachteil, dass der Server bei Stromausfall nicht automatisch heruntergefahren würde, aber eine Gewisse Überbrückungszeit war durch die UPS ja noch gegeben.&lt;/p&gt;
&lt;p&gt;Nachdem letzte Woche der Strom für etwa eine Stunde ausgefallen war, und die UPS wegen eines zu alten Akkus nicht mehr funktionstüchtig war, kam das Thema &amp;ldquo;UPS&amp;rdquo; bei mir wieder auf, und ich wollte einmal sehen, was ich mit einem neuen Akku und einer Kopplung mit meinem Linux-Server anrichten kann. Als Alternative zu der Herstellersoftware &amp;ldquo;ViewPower&amp;rdquo; (die sich übrigens nicht mehr installieren ließ) stieß ich auf &lt;a href="http://networkupstools.org"&gt;NUT - Network UPS Tools&lt;/a&gt;. Meine PowerWalker VI 600 LCD ist auf der Liste der kompatiblen Geräte zwar nur als &amp;ldquo;mäßig kompatibel&amp;rdquo; markiert, aber solange ich Messwerte auslesen konnte, und der Server bei schwach werdender Batterie automatisch heruntergefahren würde, war ich zufrieden. Also gab ich NUT eine Chance. Die Einrichtung von NUT will ich in diesem Beitrag kurz beleuchten.&lt;/p&gt;
&lt;h2 id="ups-monitoring-mit-nut"&gt;UPS-Monitoring mit NUT&lt;/h2&gt;
&lt;p&gt;Alle notwendigen Softwarepakete werden durch&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install nut
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;installiert. Dazu gehören die 3 Komponenten eines NUT Systems: Der passende Treiber für die UPS, upsd und upsmon. Upsd ist der Daemon, der mithilfe des Treibers die Verbindung zur UPS herstellt (Server). Upsmon greift als Client auf upsd zu, überwacht die Messwerte und leitet Aktionen wie z.B. Herunterfahren des Systems ein. Damit keine Verwirrung entsteht, sollte man diese Dreiteilung im Hinterkopf behalten.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Hintergrund: upsd und upsmon sind getrennte Softwarekomponenten, damit sich mehrere UPS-Monitore/Server über des Netzwerk zu einem upsd / zu einer UPS verbinden können. Das ist sinnvoll, wenn mehrere Server an einer UPS hängen.)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="treiber-einrichten-und-ups-verfügbar-machen"&gt;Treiber einrichten und UPS verfügbar machen&lt;/h2&gt;
&lt;p&gt;Um ein einfaches Setup mit NUT zu realisieren, wird in der Konfigurationsdatei &lt;code&gt;/etc/nut/nut.conf&lt;/code&gt; &lt;code&gt;MODE&lt;/code&gt; auf &lt;code&gt;standalone&lt;/code&gt; gesetzt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MODE=standalone
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dann wird der passende Treiber für die UPS aktiviert. In meinem Fall muss der &amp;ldquo;blazer_usb&amp;rdquo; Treiber aktiviert werden. Welcher Treiber zu welchem UPS-Modell passt, kann man auf der &lt;a href="http://networkupstools.org/stable-hcl.html"&gt;Kompatibilitätsliste&lt;/a&gt; des NUT Projekts nachschlagen. In der Konfigurationsdatei &lt;code&gt;/etc/nut/ups.conf&lt;/code&gt; wird unten folgendes Snippet angehängt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[powerwalker]
driver = blazer_usb
port = auto
desc = &amp;quot;Meine Powerwalker UPS&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Damit wird die UPS bekannt gemacht und der passende Treiber aktiviert. Auf meinem Debian-System hatte NUT standardmäßig keinen Zugriff auf das USB-Device der UPS. So konnte NUT nicht funktionieren. Also habe ich mir via &lt;code&gt;lsusb&lt;/code&gt; eine Liste der angeschlossenen USB-Geräte ausgeben lassen. Zur UPS gehörte der folgende Eintrag:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Bus 004 Device 002: ID 0665:5161 Cypress Semiconductor USB to Serial
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Aus Vendor- und Product-ID (0665, 5161) konnte ich nun in &lt;code&gt;/etc/udev/rules.d/90-nut-ups.rules&lt;/code&gt; eine neue Udev-Regel erstellen, welche NUT beim Anschließen des USB-Geräts die passenden Rechte für das Device gibt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ACTION==&amp;quot;add&amp;quot;, \
SUBSYSTEM==&amp;quot;usb&amp;quot;, \
ATTR{idVendor}==&amp;quot;0665&amp;quot;, ATTR{idProduct}==&amp;quot;5161&amp;quot;, \
MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;nut&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vendor-ID und Product-ID müssen in der Konfiguration auf die Ausgabe von &lt;code&gt;lsusb&lt;/code&gt; angepasst werden. Die Udev-Regelsätze habe ich anschließend via&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;udevadm control --reload-rules
udevadm trigger
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;aktiviert. Das &amp;ldquo;trigger&amp;rdquo; Kommando hat bei mir nicht auf Anhieb funktioniert, also habe ich die UPS kurzerhand nochmal getrennt und neu via USB verbunden.&lt;/p&gt;
&lt;p&gt;Mit dem &lt;code&gt;upsdrvctl start&lt;/code&gt; Kommando kann nun überprüft werden, ob die UPS korrekt erkannt wurde. Wenn alles okay ist, ist folgende Zeile in der Ausgabe zu lesen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Supported UPS detected with mustek protocol
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="upsd-konfigurieren"&gt;UPSd konfigurieren&lt;/h2&gt;
&lt;p&gt;Im nächsten Schritt wird der UPS-Daemon - der UPS-Server - eingerichtet. Dazu wird in &lt;code&gt;/etc/nut/upsd.conf&lt;/code&gt; unten das folgende Snippet angefügt, welches nur lokale Zugriffe auf upsd erlaubt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ACL all 0.0.0.0/0
ACL localhost 127.0.0.1/32
ACCEPT localhost
REJECT all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In &lt;code&gt;/etc/nut/upsd.users&lt;/code&gt; wird außerdem ein neuer Benutzer angelegt, der Zugriff auf den Daemon haben soll. (folgendes unten anfügen:)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[local_mon]
password = mypass
allowfrom = localhost
upsmon master
instcmds = ALL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;das Passwort &amp;ldquo;mypass&amp;rdquo; kann dabei natürlich frei gewählt werden.&lt;/p&gt;
&lt;h2 id="upsmon-konfigurieren"&gt;UPSMon konfigurieren&lt;/h2&gt;
&lt;p&gt;Damit der UPS Monitor die neu eingerichtete UPS überwacht, wird in &lt;code&gt;/etc/nut/upsmon.conf&lt;/code&gt; der folgende Abschnitt angefügt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MONITOR powerwalker@localhost 1 local_mon mypass master
POWERDOWNFLAG /etc/killpower
SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Passwort entspricht dabei dem oben gewählten.&lt;/p&gt;
&lt;h2 id="nut-starten"&gt;NUT starten&lt;/h2&gt;
&lt;p&gt;Die NUT-Dienste für Server und Monitor werden jetzt gestartet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl start nut-server
systemctl start nut-client
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Es lohnt sich, via &lt;code&gt;systemctl status nut-server&lt;/code&gt; bzw. &lt;code&gt;systemctl status nut-client&lt;/code&gt; einen kurzen Blick auf den aktuellen Status der Dienste zu werfen, um zu sehen, ob die Konfiguration korrekt ist, und die Dienste ordnungsgemäß arbeiten.&lt;/p&gt;
&lt;h2 id="ups-werte-ausgeben"&gt;UPS-Werte ausgeben&lt;/h2&gt;
&lt;p&gt;Aktuelle Werte zu Batteriespannung, Netzspannung und -Frequenz und eine menge weiterer Statusinformationen können jetzt mit&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;upsc powerwalker
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ausgegeben oder via&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;watch -n 1 upsc powerwalker
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;beobachtet werden.&lt;/p&gt;
&lt;p&gt;Auch Einstellungen wie z.B. die Aktivierung des Alarmsignals bei einer Netzstörung können verändert werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;upscmd -u local_mon -p mypass powerwalker@localhost beeper.toggle
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(auf das Passwort &amp;ldquo;mypass&amp;rdquo; achten!). Ein kurzer Batterietest kann via&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;upscmd -u local_mon -p mypass powerwalker@localhost test.battery.start.quick
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;duchgeführt werden. Eine Liste aller sog. &amp;ldquo;Instant commands&amp;rdquo; findet ihr hier: &lt;a href="http://networkupstools.org/docs/developer-guide.chunked/apas02.html"&gt;http://networkupstools.org/docs/developer-guide.chunked/apas02.html&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Referenzen: &lt;a href="https://blog.shadypixel.com/monitoring-a-ups-with-nut-on-debian-or-ubuntu-linux/"&gt;https://blog.shadypixel.com/monitoring-a-ups-with-nut-on-debian-or-ubuntu-linux/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Mailserver mit Dovecot, Postfix, MySQL und Rspamd unter Debian 9 Stretch</title><link>https://thomas-leister.de/mailserver-debian-stretch/</link><pubDate>Fri, 04 Aug 2017 11:53:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/mailserver-debian-stretch/</guid><description>&lt;p&gt;Ziel dieser für Debian 9 &amp;ldquo;Stretch&amp;rdquo; aktualisierten Anleitung ist ein fertig installierter und konfigurierter Mailserver auf einem eigens dafür bereitgestellten Host. Der Beitrag basiert im wesentlichen auf dem zuvor &lt;a href="https://thomas-leister.de/mailserver-unter-ubuntu-16.04/"&gt;für Ubuntu 16.04 vorgestellten Setup&lt;/a&gt;. In dieser aktualisierten Version wird statt eines Amavis-Spamassassin-Razor Stacks und OpenDKIM allerdings &lt;a href="https://rspamd.com"&gt;Rspamd&lt;/a&gt; genutzt, um die Komplexität und Fehleranfälligkeit des Setups zu reduzieren und gleichzeitig von der hervorragenden Funktion des Rspam Daemons zu profitieren. Außerdem wurden in diese Anleitung einige kleine Verbesserungen eingebracht, die mir von Lesern in den letzten Monaten vorgeschlagen wurden.&lt;/p&gt;
&lt;p&gt;Wie auch in den letzten Versionen ist mir wichtig, die Funktionsweise und das Zusammenspiel der Mailserver-Komponenten so zu erklären, dass das Mailsystem als solches in den Grundzügen verstanden werden kann. Ich setze dabei grundlegende Kenntnisse im Bereich Linux-Server voraus; trotzdem ist dieser Guide auch für Anfänger geeignet, die Interesse und Zeit mitbringen.&lt;/p&gt;
&lt;div class="warning"&gt;
Eine neue Anleitung für Debian 10 &amp;ldquo;Buster&amp;rdquo; steht in den Startlöchern! Ich habe einige Detailverbesserungen in die Anleitung einfließen lassen. Datenbankgeschema und Dateisystemstruktur bleiben erhalten, sodass ein einfacher Umstieg auf das neue Setup möglich ist.
Das neue Setup befindet sich noch in der Erprobungsphase. Wenn du es trotzdem ausprobieren möchtest, kannst du die neue Anleitung hier finden: &lt;a href="https://thomas-leister.de/mailserver-debian-buster/"&gt;https://thomas-leister.de/mailserver-debian-buster/&lt;/a&gt;
&lt;/div&gt;
&lt;div class="tip"&gt;
Wer lieber auf eine fertige Lösung setzt und sich die Handarbeit sparen will, sollte sich einmal &lt;a href="https://mailcow.email/"&gt;Mailcow&lt;/a&gt; von André Peters ansehen.
&lt;/div&gt;
&lt;h2 id="mailserver-funktionen"&gt;Mailserver-Funktionen&lt;/h2&gt;
&lt;p&gt;Damit ihr einen Eindruck vom Funktionsumfang des fertigen Mailsetups bekommt, hier einige Merkmale:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Senden und Empfangen von E-Mails für beliebige Domains&lt;/li&gt;
&lt;li&gt;Flexible Einrichtung von Domains, Mailaccounts, Aliasen, Weiterleitungen und Regeln für die Transportverschlüsselung über ein MySQL-Backend zur Laufzeit&lt;/li&gt;
&lt;li&gt;Nutzer-spezifisch begrenztes Mailbox-Volumen&lt;/li&gt;
&lt;li&gt;Einrichtung allgemeiner und Nutzer-spezifischer Sieve-Filterregeln zum filtern und/oder Umsortieren von eingehenden E-Mails&lt;/li&gt;
&lt;li&gt;Hochperformante Spam-Früherkennung via Postscreen&lt;/li&gt;
&lt;li&gt;Erweiterte Spamerkennung via Rspamd (+ Weboberfläche für Spam-Statistiken)&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Send only&amp;rdquo; Accounts z.B. für NextCloud / Forensoftware / &amp;hellip;&lt;/li&gt;
&lt;li&gt;DKIM-Signierung ausgehender E-Mails&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eine &lt;strong&gt;Weboberfläche&lt;/strong&gt; / ein &lt;strong&gt;Management-Tool&lt;/strong&gt; zur Verwaltung dieses Setups biete ich selbst nach wie vor nicht an. In der Zwischenzeit haben aber andere User Lösungen veröffentlicht, z.B.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Florian Kapfenberger: &lt;a href="https://github.com/phiilu/mailman"&gt;Mailman&lt;/a&gt; &lt;em&gt;(nicht zu verwechseln mit Mailman, dem Mailinglist-Manager!)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Andreas Bresch: &lt;a href="https://github.com/Andreas-Bresch/vmailManage/"&gt;VmailManage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Henrik Halbritter: &lt;a href="https://github.com/Halbritter/MailAdmin/releases"&gt;MailAdmin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;awidegreen: &lt;a href="https://github.com/awidegreen/vmail-rs"&gt;vmail-rs&lt;/a&gt; (CLI-Tool!)&lt;/li&gt;
&lt;li&gt;pprugger: &lt;a href="https://github.com/pprugger/vmail-admin"&gt;vmail-admin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kekskurse: &lt;a href="https://github.com/kekskurse/go-mail-admin"&gt;Go-Mail-Admin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="tip"&gt;
Das Datenbank-Layout und die Struktur des &lt;code&gt;/var/vmail&lt;/code&gt;-Verzeichnisses haben sich im Vergleich zur vorherigen Anleitung &lt;em&gt;nicht&lt;/em&gt; geändert. Ein Update älterer Setups ist also einfach realisierbar.
&lt;/div&gt;
&lt;hr&gt;
&lt;figure&gt;&lt;img src=""&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="verwendete-software"&gt;Verwendete Software&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Debian 9 &amp;ldquo;Stretch&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Postfix&lt;/li&gt;
&lt;li&gt;Dovecot&lt;/li&gt;
&lt;li&gt;Rspamd&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;MariaDB&lt;/li&gt;
&lt;li&gt;Nginx (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="warning"&gt;
Dieses Setup ist standardmäßig &lt;strong&gt;nicht vollständig kompatibel mit Ubuntu Server!&lt;/strong&gt; Die Distribution liefert aktuell (Stand Januar 2018) eine ältere Version von Dovecot mit, sodass beispielsweise imap_sieve nicht verfügbar ist. Das Problem kann behoben werden, indem für Ubuntu Server das PPA &lt;a href="https://launchpad.net/%7Epdoes/&amp;#43;archive/ubuntu/dovecot"&gt;https://launchpad.net/%7Epdoes/+archive/ubuntu/dovecot&lt;/a&gt; für eine aktuellere Dovecot-Version hinzugefügt wird.
&lt;/div&gt;
&lt;h2 id="gegebenheiten"&gt;Gegebenheiten&lt;/h2&gt;
&lt;p&gt;In dieser Anleitung kommen folgende Domains vor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mysystems.tld&lt;/strong&gt;: Übergeordnete, primäre Domain&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mail.mysystems.tld&lt;/strong&gt;: Subdomain, unter der der Mailserver verfügbar sein soll (FQDN des Mailsystems)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;imap.mysystems.tld&lt;/strong&gt;: Alias auf mail.mysystems.tld, wird von vielen Mailclient automatisch gesucht und gefunden&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;smtp.mysystems.tld&lt;/strong&gt;: Dasselbe für den SMTP-Dienst&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;domain2.tld&lt;/strong&gt;: Eine zweite Domain neben mysystems.tld, für die E-Mails gesendet und empfangen werden sollen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;domain3.tld&lt;/strong&gt;: Eine dritte Domain, für die E-Mails gesendet und empfangen werden sollen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Diese Domains müssen in der &lt;em&gt;gesamten&lt;/em&gt; Anleitung selbstverständlich durch eigene ersetzt werden!&lt;/strong&gt; &lt;br&gt;
Auf domain2.tld und domain3.tld kann verzichtet werden, wenn der Mailserver nur für eine Domain (nur für &amp;ldquo;@mysystems.tld&amp;rdquo;-Adressen) genutzt werden soll.&lt;/p&gt;
&lt;h2 id="grundvoraussetzungen-für-den-mailserver"&gt;Grundvoraussetzungen für den Mailserver&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ein virtueller oder dedizierter Server mit bereits installiertem Debian 9 Stretch &lt;br&gt;
(&amp;ldquo;Standard-Systemwerkzeuge&amp;rdquo; und &amp;ldquo;SSH&amp;rdquo; bei der Installation angewählt)&lt;/li&gt;
&lt;li&gt;Mindestens eine eigene Domain + volle Kontrolle über die DNS-Zone&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ein kleiner, virtueller Server auf KVM-Basis ist in den meisten Fällen völlig ausreichend. Ich empfehle für kleine, private Setups zwei CPU-Kerne und 1-2 GB RAM. Virtuelle Server kann man z.B. bei &lt;a href="https://hetzner.cloud/?ref=H6gtsnaMZj6N"&gt;Hetzner&lt;/a&gt; bekommen.&lt;/p&gt;
&lt;h2 id="komponenten-eines-vollständigen-mailsystems"&gt;Komponenten eines vollständigen Mailsystems&lt;/h2&gt;
&lt;figure&gt;&lt;img src=""&gt;
&lt;/figure&gt;
&lt;p&gt;Welche Softwarekomponenten verwendet werden, wisst ihr bereits. Doch welche Software übernimmt welche Aufgaben?&lt;/p&gt;
&lt;h3 id="dovecot"&gt;Dovecot&lt;/h3&gt;
&lt;p&gt;Dovecot ist ein weit verbreiteter MDA (Mail Delivery Agent) und IMAP-Server. Er sortiert ankommende E-Mails in die Postfächer des jeweiligen Empfängers ein und stellt eine Schnittstelle zum Abrufen der Mailbox bereit (IMAP). Außerdem wird Dovecot in diesem Setup von Postfix als sog. SASL-Authentifizierungsserver genutzt: Postfix fragt Dovecot, ob ein bestimmter Benutzer berechtigt ist, sich am System anzumelden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aufgaben:&lt;/strong&gt; Verwaltung der Mailbox, Bereitstellung einer Schnittstelle zum Abrufen erhaltener E-Mails, SASL-Authentifizierungsserver (überprüft Benutzeranmeldung)&lt;/p&gt;
&lt;h3 id="postfix"&gt;Postfix&lt;/h3&gt;
&lt;p&gt;Postfix wird oft zusammen mit Dovecot eingesetzt. Der populäre MTA (Mail Transfer Agent) kümmert sich um alles, was mit dem Transport der E-Mail zu tun hat: Vom E-Mail Client zum eigenen Mailserver, und von dort aus zum jeweiligen Zielserver. Außerdem nimmt Postfix E-Mails von fremden Servern an und leitet sie an den MDA Dovecot weiter. Antispam-Software wird i.d.R. direkt in Postfix integriert, um eintreffende Spammails erst gar nicht in die Mailbox des Nutzers gelangen zu lassen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aufgaben:&lt;/strong&gt; E-Mail-Transport und -Filterung&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anmerkung: Postfix ist &amp;ldquo;der eigentliche Mailserver&amp;rdquo;. E-Mails können ohne weiteres einzig und allein mit Postfix gesendet und empfangen werden. Alle weiteren Komponenten wie Dovecot und Rspamd machen uns das Leben allerdings einfacher ;-)&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="mariadb-mysql-datenbank"&gt;MariaDB (MySQL-Datenbank)&lt;/h3&gt;
&lt;p&gt;Dovecot und Postfix werden so konfiguriert, dass sie eine MySQL-Datenbank als Backend (Datenbasis) nutzen. In der Datenbank werden zu nutzende Domains, Benutzer, Aliase und weitere Daten gespeichert. Durch einfaches Hinzufügen oder Entfernen von Datensätzen in oder aus Datenbanktabellen können neue Benutzer oder Aliase angelegt oder gelöscht werden. Der Vorteil eines Datenbank-Backends ist, dass sich der Mailserver damit sehr einfach verwalten lässt: So ließe sich zur Benutzerverwaltung beispielsweise eine Weboberfläche in PHP entwickeln, die die MySQL-Datenbank verändert. Die Serverkonfiguration muss dann nicht manuell geändert werden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aufgaben:&lt;/strong&gt; Bereitstellung Betriebsdaten für Postfix und Dovecot&lt;/p&gt;
&lt;h3 id="rspamd"&gt;Rspamd&lt;/h3&gt;
&lt;p&gt;Rspamd ist ein Filtersystem, das in Postfix integriert wird und eingehende E-Mails überprüft. Spammails werden von Rspamd erkannt und nicht an den Benutzer zugestellt bzw. aussortiert. Außerdem fügt Rspamd bei ausgehenden E-Mails eine DKIM-Signatur hinzu, sodass fremde Mailserver eigene Mails nicht als verdächtig einstufen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aufgaben:&lt;/strong&gt; Filtern von Spam, DKIM-Signierung&lt;/p&gt;
&lt;h3 id="nginx-optional"&gt;Nginx (optional)&lt;/h3&gt;
&lt;p&gt;Nginx ist ein beliebter und schlanker Webserver / Webproxy. Hier wird er als HTTP-Proxy vor Rspamd verwendet, um die Weboberfläche des Spamfilters abgesichert nach außen hin zugänglich zu machen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aufgaben:&lt;/strong&gt; Proxying für Rspamd-Weboberfläche&lt;/p&gt;
&lt;h3 id="redis"&gt;Redis&lt;/h3&gt;
&lt;p&gt;Redis ist ein hochperformanter In-memory Key-Value-Store, also eine sehr einfache, schnelle Datenbank, welche Schlüssel-Wert-Paare effizient im Speicher ablegen kann. Rspamd nutzt Redis, um einige Daten zwischenzuspeichern (wie z.B. zuletzt Überprüfte Mailserver).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aufgaben:&lt;/strong&gt; Caching, Memory&lt;/p&gt;
&lt;h2 id="vorbereitungen"&gt;Vorbereitungen&lt;/h2&gt;
&lt;h3 id="tipp-reinen-tisch-machen"&gt;Tipp: Reinen Tisch machen&lt;/h3&gt;
&lt;p&gt;Wenn ihr den Server vorher schon für etwas anderes (oder sogar ein anderes Mail-Setup) verwendet habt, stellt sicher, dass Reste aus alten Installationen das neue Setup nicht behindern. Speziell vorherige Mailserver-Versuche sollten rückstandslos entfernt werden (inkl. der zugehörigen Konfigurationsdateien). Am besten ist natürlich – falls möglich – eine komplette Neuinstallation des Servers. Ich empfehle, den Mailserver als eigenständiges System zu betreiben und auf demselben Host keine anderen Dienste zu installieren, um die Integrität des Mailsystems sicherzustellen.&lt;/p&gt;
&lt;p&gt;Im Folgenden gehe ich von einem frisch installierten Debian 9 Stretch aus (zusätzlich nur &amp;ldquo;Standard-Systemwerkzeuge&amp;rdquo; und SSH installiert).&lt;/p&gt;
&lt;h3 id="login-als-root"&gt;Login als Root&lt;/h3&gt;
&lt;p&gt;Bei der Installation von Debian wird ein normaler Benutzeraccount, z.B. &amp;ldquo;thomas&amp;rdquo; eingerichtet, zu dem ihr euch via Passwort verbinden könnt. Der Root-Account ist standardmäßig nicht direkt zugänglich, sondern nur über den Umweg via &amp;ldquo;su&amp;rdquo;. Für diese Anleitung werden permanent Root-Rechte benötigt. Öffnet nach dem Login am Server also am besten eine Root-Kommandozeile via&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;su
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Gebt dann das Passwort für euren root-User ein.&lt;/p&gt;
&lt;h3 id="system-aktualisieren"&gt;System aktualisieren&lt;/h3&gt;
&lt;p&gt;Bevor ihr neue Software-Pakete installiert, solltet ihr mittels&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sicherstellen, dass euer System aktuell ist. Bei der Gelegenheit bietet sich auch gleich ein Reboot an, um einen möglicherweise aktualisierten Linux-Kernel zu laden.&lt;/p&gt;
&lt;h3 id="hostname-und-server-fqdn-setzen"&gt;Hostname und Server-FQDN setzen&lt;/h3&gt;
&lt;p&gt;Euer Server bekommt zwei Namen, über die er identifiziert werden kann:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lokalen Hostnamen: Für die Identifizierung des Servers innerhalb der eigenen Infrastruktur, z.B. &amp;ldquo;mail&amp;rdquo;&lt;/li&gt;
&lt;li&gt;FQDN (Fully Qualified Domain Name): Für die weltweite Identifizierung im Internet, z.B. &amp;ldquo;mail.mysystems.tld&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der FQDN muss nicht zwingend etwas mit den Domains zu tun haben, für die später E-Mails gesendet und empfangen werden sollen. Wichtig ist nur, dass euer künftiger Mailserver einen solchen Namen hat, der auch über das DNS zur Server-IP-Adresse aufgelöst werden kann (dazu gleich mehr im Abschnitt &amp;ldquo;Einrichtung des DNS&amp;rdquo;). Den lokalen Hostnamen setzt ihr wie folgt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hostnamectl set-hostname --static mail
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In der Hosts-Datei &lt;code&gt;/etc/hosts&lt;/code&gt; sollten FQDN und lokaler Hostname hinterlegt sein. Die Datei kann beispielsweise so aussehen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;127.0.0.1 localhost
127.0.1.1 mail.mysystems.tld mail
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Ausgaben der Kommandos &lt;code&gt;hostname&lt;/code&gt; und &lt;code&gt;hostname --fqdn&lt;/code&gt; sollten nach den Änderungen wie folgt aussehen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@mail:~# hostname
mail
root@mail:~# hostname --fqdn
mail.mysystems.tld
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der FQDN (in diesem Beispiel &amp;ldquo;mail.mysystems.tld&amp;rdquo;) wird außerdem nach &lt;code&gt;/etc/mailname&lt;/code&gt; geschrieben:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo $(hostname -f) &amp;gt; /etc/mailname
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(Der Hostname im Shell-Prompt z.B. &lt;code&gt;root@meinhost:&lt;/code&gt; passt sich erst nach einem erneuten Login an.)&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="tipp-unbound-dns-resolver-installieren"&gt;Tipp: Unbound DNS Resolver installieren&lt;/h3&gt;
&lt;p&gt;Das Mailsystem benötigt einen funktionierenden DNS-Server (Resolver), sodass die Herkunft von E-Mails überprüft werden kann. Auch der Rspamd-Spamfilter verlässt sich bei der Bewertung von Spammails auf DNS-Dienste. Eine schnelle Namesauflösung bringt also Performancevorteile für das ganze Mailsystem. Für den Zugriff auf Spamhaus-Blocklists (wie sie später verwendet werden) kann es sogar notwendig sein, seinen eigenen DNS-Resolver zu nutzen, weil z.B. Zugriffe über das Google DNS blockiert werden. Deshalb (und um die Sicherheit im Bezug auf Abhängigkeiten zu fremden Systemen zu verbessern) empfehle ich die Nutzung eines eigenen, lokalen DNS-Resolvers.&lt;/p&gt;
&lt;p&gt;Unbound installieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install unbound
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DNSSEC Root Key aktualisieren und Unbound neu laden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;su -c &amp;quot;unbound-anchor -a /var/lib/unbound/root.key&amp;quot; - unbound
systemctl reload unbound
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="tip"&gt;
Für die nächsten Kommandos muss das Paket &amp;ldquo;dnsutils&amp;rdquo; installiert sein. Wenn bei der Installation von Debian die &amp;ldquo;Standard-Systemwerkzeuge&amp;rdquo; ausgewählt wurden, sind die Tools schon installiert.
&lt;/div&gt;
&lt;p&gt;Ein &lt;code&gt;dig @127.0.0.1 denic.de +short +dnssec&lt;/code&gt; sollte eine ähnliche Ausgabe wie folgt erzeugen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig @127.0.0.1 denic.de +short +dnssec
81.91.170.12
A 8 2 3600 20170814090000 20170731090000 26155 denic.de. Jo90qnkLkZ6gI4qNHj19BMguFuGof9hCPhdeSh/fSePSQ/WXlWMmfjW1 sNDJ/bcITRMyz8DQdDzmWPDIeSJ/qPyfoZ+BjUZxtaXcs0BAl4KX8q7h R05TGmAbgPhrYBoUKJkU/q8T+jWKHAJRUeWbCd8QOJsJbneGcUKxRAPe i6Rq51/OL/id6zUCtalhclah2TfLLaqku9PmKwjbGdZm11BXSr8b56LB WX/rdLIrKWNpE+jHGAUMmDsZL84Kx3Oo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wenn der dig-Befehl funktioniert hat, kann der lokale Resolver als primärer Resolver gesetzt werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install resolvconf
echo &amp;quot;nameserver 127.0.0.1&amp;quot; &amp;gt;&amp;gt; /etc/resolvconf/resolv.conf.d/head
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ein &lt;code&gt;nslookup denic.de | grep Server&lt;/code&gt; sollte nun&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Server: 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;zurückliefern. Damit ist der lokale DNS-Resolver als Haupt-Resolver einsatzbereit.&lt;/p&gt;
&lt;h2 id="einrichtung-des-dns"&gt;Einrichtung des DNS&lt;/h2&gt;
&lt;p&gt;Zu Beginn dieser Anleitung wurde für den Mailserver der FQDN &amp;ldquo;mail.mysystems.tld&amp;rdquo; festgelegt. Für diesen Domain-Namen werden nun A-Records im DNS-Zonefile der Domain &amp;ldquo;mysystems.tld&amp;rdquo; erstellt. Loggt euch bei eurem Domain-Provider ein und legt die folgenden Einträge an – der erste für die IPv4-IP-Adresse des Mailservers, die zweite für die IPv6-Adresse. (Beispiel!):
Achtet im Folgenden vor allem auf den abschließenden Punkt in den Domainnamen!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mail.mysystems.tld. 86400 IN A 5.1.76.155
mail.mysystems.tld. 86400 IN AAAA 2a00:f820:417::be19:7b23
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;ldquo;mail.mysystems.tld&amp;rdquo; ist damit im DNS bekannt. Wenn keine IPv6-Adresse genutzt wird, kann der zweite Record entfallen. Bleiben noch &amp;ldquo;imap.mysystems.tld&amp;rdquo; und &amp;ldquo;smtp.mysystems.tld&amp;rdquo;, die als Alias-Domains für &amp;ldquo;mail.mysystems.tld&amp;rdquo; angelegt werden. Sie sind nicht unbedingt notwendig, werden von vielen Mailclient aber gesucht und sind so üblich:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;imap.mysystems.tld. 86400 IN CNAME mail.mysystems.tld.
smtp.mysystems.tld. 86400 IN CNAME mail.mysystems.tld.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mailclients können sich damit schon über imap.mysystems.tld und smtp.mysystems.tld zum Mailserver verbinden. Andere Mailserver suchen bei der E-Mail-Übermittlung allerdings nicht nach A- oder CNAME-Records, sondern nach MX-Records. Ein MX-Record zeigt, welcher Mailserver für die E-Mails zu einer Domain zuständig ist. In meinem Beispiel soll sich unser Mailserver neben den E-Mails für mysystems.tld auch um die Mails für domain2.tld und domain3.tld kümmern.&lt;/p&gt;
&lt;p&gt;Im Zonefile der Domain &amp;ldquo;mysystems.tld&amp;rdquo; wird dazu dieser Record angelegt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysystems.tld. 86400 IN MX 0 mail.mysystems.tld.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In die Zonefiles der anderen Domains werden entsprechend die Records&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;domain2.tld. 86400 IN MX 0 mail.mysystems.tld.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;und&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;domain3.tld. 86400 IN MX 0 mail.mysystems.tld.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;angelegt.&lt;/p&gt;
&lt;h3 id="reverse-dns"&gt;Reverse DNS&lt;/h3&gt;
&lt;p&gt;Des weiteren muss ein sog. Reverse-DNS-Record / PTR für den FQDN des Mailservers angelegt werden. Dieser entspricht der Umkehrung eines normalen DNS-Records und ordnet einer IP-Adresse einen Hostnamen zu. Diesen Record kann nur der Inhaber des Netzes anlegen, aus dem eure IP-Adresse stammt. Möglicherweise könnt ihr so einen Reverse-DNS-Record in der Verwaltungsoberfläche eures Serveranbieters setzen, oder ihr bittet den Support, das zu tun. Der Domain-Name, der mit der IP-Adresse verknüpft werden muss, ist der FQDN eures Mailservers. In meinem Beispiel mail.mysystems.tld. Denkt daran, für alle vom Mailserver genutzten, öffentlichen IP-Adressen einen solchen Record zu erstellen. In dieser Anleitung wird eine IPv4- und eine IPv6-Adresse verwendet.&lt;/p&gt;
&lt;h3 id="spf-records"&gt;SPF-Records&lt;/h3&gt;
&lt;p&gt;Im Kampf gegen Spam und Phishing wurde das sog. Sender Policy Framework entwickelt (Siehe auch Beitrag: &amp;ldquo;Voraussetzungen für den Versand zu großen E-Mail Providern&amp;rdquo;). Obwohl es sich nur als eingeschränkt brauchbar erwiesen hat, erwarten die meisten Mailprovider gültige SPF-Records für andere Mailserver und prüfen diese. SPF-Einträge werden im Zonefile aller Domains erstellt, für die ein Mailserver E-Mails verschickt, und geben an, welche Server für eine Domain sendeberechtigt sind. Für unsere Domain mysystems.tld wird der folgende Record im Zonefile von mysystems.tld angelegt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysystems.tld. 3600 IN TXT v=spf1 a:mail.mysystems.tld ?all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hiermit erhält nur der im A-Record &amp;ldquo;mail.msystems.tld&amp;rdquo; genannte Server für mysystems.tld eine Sendeberechtigung. Die Neutral-Einstellung &amp;ldquo;?all&amp;rdquo; sorgt dafür, dass E-Mails von anderen Servern trotzdem angenommen werden sollen. Damit gehen wir Problemen beim Mail-Forwarding aus dem Weg. Wir erstellen den SPF-Record also eigentlich nur, damit andere Mailserver unseren Server wegen des existierenden Records positiv bewerten – nicht, weil er seinen Nutzen entfalten soll.&lt;/p&gt;
&lt;p&gt;In den Zonefiles der beiden Domains &amp;ldquo;domain2.tld&amp;rdquo; und &amp;ldquo;domain3.tld&amp;rdquo; wird (angepasst auf die Domain) jeweils dieser Record angelegt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;domain2.tld. 3600 IN TXT v=spf1 include:mysystems.tld ?all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Über das &amp;ldquo;include&amp;rdquo; wird der erste Record der Domain mysystems.tld eingebunden.&lt;/p&gt;
&lt;h3 id="dmarc-records"&gt;DMARC Records&lt;/h3&gt;
&lt;p&gt;DMARC-Einträge bestimmen, was ein fremder Mailserver tun soll, wenn eine von ihm empfangene Mail nach SPF- und DKIM-Checks offenbar nicht vom korrekten Mailserver stammt (wenn der Absender also gefälscht wurde). Es ist vernünftig, andere Mailserver anzuweisen, solche E-Mails nicht zu akzeptieren:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;_dmarc.mysystems.tld. 3600 IN TXT v=DMARC1; p=reject;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Der Record wird entsprechend auch für die anderen Domains gesetzt:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;_dmarc.domain2.tld. 3600 IN TXT v=DMARC1; p=reject;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Einen DMARC-Record mit einer abweichenden Policy könnt ihr euch unter &lt;a href="https://elasticemail.com/dmarc/"&gt;https://elasticemail.com/dmarc/&lt;/a&gt; selbst generieren lassen.&lt;/p&gt;
&lt;h2 id="einrichtung-der-tls-zertifikate-lets-encrypt"&gt;Einrichtung der TLS-Zertifikate (Let&amp;rsquo;s Encrypt)&lt;/h2&gt;
&lt;p&gt;Gültige TLS-Zertifikate von anerkannten Zertifizierungsstellen (CAs) sind heute für jeden Mailserver ein &amp;ldquo;muss&amp;rdquo;. Immer mehr Mailsysteme verweigern zurecht den Empfang über ungesicherte Verbindungen. Was früher (vor allem für den privaten Einsatz) noch ein bedeutender Kostenfaktor war, bekommt man heute Dank Let&amp;rsquo;s Encrypt kostenlos und sehr unkompliziert. Im folgenden beziehe ich mich daher auf die Generierung von Let&amp;rsquo;s Encrypt-Zertifikaten. Selbstverständlich können stattdessen auch Zertifikate anderer CAs genutzt werden.&lt;/p&gt;
&lt;h3 id="abholen-neuer-zertifikate"&gt;Abholen neuer Zertifikate&lt;/h3&gt;
&lt;p&gt;Der kürzeste Weg zu neuen Zertifikaten führt über den offiziellen Let&amp;rsquo;s Encrypt Client &amp;ldquo;Certbot&amp;rdquo;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install certbot
certbot certonly --standalone --rsa-key-size 4096 -d mail.mysystems.tld -d imap.mysystems.tld -d smtp.mysystems.tld
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nach Zustimmung der Nutzungsbedingungen sind innerhalb von wenigen Sekunden neue, gültige TLS-Zertifikate auf dem System installiert. Mit dem neuen Zertifikat unter &lt;code&gt;/etc/letsencrypt/live/mail.mysystems.tld&lt;/code&gt; sind die drei Domains&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mail.mysystems.tld&lt;/li&gt;
&lt;li&gt;imap.mysystems.tld&lt;/li&gt;
&lt;li&gt;smtp.mysystems.tld&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;abgesichert. Im oben genannten Verzeichnis befinden sich drei Dateien:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cert.pem: Das eigentliche Zertifikat&lt;/li&gt;
&lt;li&gt;chain.pem: CA Zertifikat&lt;/li&gt;
&lt;li&gt;fullchain.pem: Das Zertifikat + CA Zertifikat&lt;/li&gt;
&lt;li&gt;privkey.pem: Der geheime Zertifikats-Schlüssel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;später werden nur die letzten beiden Zertifikatsdateien verwendet.&lt;/p&gt;
&lt;h3 id="automatische-erneuerung"&gt;Automatische Erneuerung&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s Encrypt-Zertifikate laufen nach 90 Tagen aus und sind dann ungültig. Deshalb sollten die Zertifikate regelmäßig erneuert werden - zum Beispiel über den folgenden CronJob:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@weekly certbot renew --pre-hook &amp;quot;systemctl stop nginx&amp;quot; --post-hook &amp;quot;systemctl start nginx&amp;quot; --renew-hook &amp;quot;systemctl reload nginx; systemctl reload dovecot; systemctl reload postfix&amp;quot; --quiet
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dieser Eintrag wird nach der Eingabe von&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(und der anschließenden Wahl des bevorzugten Editors - Empfehlung: nano) in die Cron-Datei unten eingetragen und gespeichert.&lt;/p&gt;
&lt;h2 id="mysql-datenbank-einrichten"&gt;MySQL Datenbank einrichten&lt;/h2&gt;
&lt;p&gt;Informationen über zu verwaltende Domains, Benutzer, Weiterleitungen und sonstige Einstellungen soll der Mailserver aus einer MySQL-Datenbank ziehen. Das hat den Vorteil, dass der Server im laufenden Betrieb flexibel angepasst werden kann, ohne die Konfigurationsdateien ändern zu müssen. Die Datenbank ermöglicht uns außerdem ein virtualisiertes Mailserver-Setup: Die Benutzer auf den Mailservern müssen nicht mehr als reale Linux-Benutzer im System registriert sein, sondern nur noch in der Datenbank eingetragen werden.&lt;/p&gt;
&lt;p&gt;Als DBMS wird die neue Debian-Standard-MySQL-Datenbank &amp;ldquo;MariaDB&amp;rdquo; installiert:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install mariadb-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nach der Installation sollte MariaDB bereits gestartet sein. Den Status könnt ihr mittels &lt;code&gt;systemctl status mysql&lt;/code&gt; (nicht &amp;ldquo;mariadb!&amp;rdquo;) überprüfen. Falls das nicht der Fall ist, startet den Datenbankserver: &lt;code&gt;systemctl start mysql&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Standardmäßig kann sich nur der root-Systemuser am Datenbankserver anmelden. Authentifiziert wird er dabei automatisch via PAM, sodass keine zusätzliche Passworteingabe notwendig ist. Die einfache Eingabe von&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;bringt euch in eine MySQL Root Shell. Über diese werden nun ein paar SQL-Befehle ausgeführt.&lt;/p&gt;
&lt;p&gt;Ein SQL-Kommando endet immer mit einem Semikolon &lt;code&gt;;&lt;/code&gt;. Mehrzeilige Befehle könnt ihr ohne weiteres einfach mit ENTER umbrechen, so wie sie im Folgenden dargestellt werden.
Achtet auf den Unterschied zwischen &amp;ldquo;Tick&amp;rdquo; (&lt;code&gt;'&lt;/code&gt;) und &amp;ldquo;Backtick&amp;rdquo; (&lt;code&gt; \&lt;/code&gt; `) – der Backtick wird mit Shift + 2x Accent-Taste erzeugt. Kopiert die SQL-Statements am besten direkt in eure Zwischenanlage, statt sie mühsam abzutippen.&lt;/p&gt;
&lt;p&gt;Im ersten Schritt wird eine neue Datenbank &amp;ldquo;vmail&amp;rdquo; angelegt.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;create database vmail
CHARACTER SET 'utf8';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ein neuer DB-User &amp;ldquo;vmail&amp;rdquo; mit dem Passwort &amp;ldquo;vmaildbpass&amp;rdquo; bekommt Zugriff auf diese neue Datenbank &lt;em&gt;(Wählt ein eigenes Passwort statt &amp;ldquo;vmaildbpass&amp;rdquo;!)&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grant select on vmail.* to 'vmail'@'localhost' identified by 'vmaildbpass';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alle weiteren Kommandos zu Erstellung der Datenbank-Tabellen sollen sich auf die eben erzeugte Datenbank beziehen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;use vmail;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Mail-Setup soll 4 verschiedene Tabellen nutzen. Kopiert die SQL-Statements einzeln und nacheinander in die MySQL-Kommandozeile und bestätigt jedes mal mit [Enter]. Anpassungen sind nicht notwendig.&lt;/p&gt;
&lt;h3 id="domain-tabelle"&gt;Domain-Tabelle&lt;/h3&gt;
&lt;p&gt;Die Domain-Tabelle enthält alle Domains, die mit dem Mailserver genutzt werden sollen.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE `domains` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`domain` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY (`domain`)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="account-tabelle"&gt;Account-Tabelle&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE `accounts` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(64) NOT NULL,
`domain` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`quota` int unsigned DEFAULT '0',
`enabled` boolean DEFAULT '0',
`sendonly` boolean DEFAULT '0',
PRIMARY KEY (id),
UNIQUE KEY (`username`, `domain`),
FOREIGN KEY (`domain`) REFERENCES `domains` (`domain`)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Account-Tabelle enthält alle Mailserver-Accounts. Das Feld &amp;ldquo;quota&amp;rdquo; enthält die Volumenbegrenzung für die Mailbox in MB (Megabyte). Im Feld &amp;ldquo;enabled&amp;rdquo; wird über einen bool’schen Wert festgelegt, ob ein Account aktiv ist, oder nicht. So können einzelne User temporär deaktiviert werden, ohne gelöscht werden zu müssen. &amp;ldquo;sendonly&amp;rdquo; wird auf &amp;ldquo;true&amp;rdquo; gesetzt, wenn der Account nur zum Senden von E-Mails genutzt werden soll – nicht aber zum Empfang. Das kann beispielsweise für Foren- oder Blogsoftware sinnvoll sein, die mit ihrem Account nur E-Mails verschicken soll.&lt;/p&gt;
&lt;h3 id="alias-tabelle"&gt;Alias-Tabelle&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE `aliases` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`source_username` varchar(64) NOT NULL,
`source_domain` varchar(255) NOT NULL,
`destination_username` varchar(64) NOT NULL,
`destination_domain` varchar(255) NOT NULL,
`enabled` boolean DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY (`source_username`, `source_domain`, `destination_username`, `destination_domain`),
FOREIGN KEY (`source_domain`) REFERENCES `domains` (`domain`)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Alias-Tabelle enthält alle Weiterleitungen / Aliase und ist eigentlich selbsterklärend. Zur temporären Deaktivierung von Weiterleitungsadressen gibt es wieder ein &amp;ldquo;enabled&amp;rdquo;-Feld.&lt;/p&gt;
&lt;h3 id="tls-policy-tabelle"&gt;TLS Policy-Tabelle&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CREATE TABLE `tlspolicies` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`domain` varchar(255) NOT NULL,
`policy` enum(&amp;#39;none&amp;#39;, &amp;#39;may&amp;#39;, &amp;#39;encrypt&amp;#39;, &amp;#39;dane&amp;#39;, &amp;#39;dane-only&amp;#39;, &amp;#39;fingerprint&amp;#39;, &amp;#39;verify&amp;#39;, &amp;#39;secure&amp;#39;) NOT NULL,
`params` varchar(255),
PRIMARY KEY (`id`),
UNIQUE KEY (`domain`)
);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mithilfe der TLS Policy Tabelle kann festgelegt werden, für welche Empfängerdomains bestimmte Sicherheitsbeschränkungen beim Mailtransport gelten sollen. Für einzelne Domains, z.B. &amp;ldquo;gmx.de&amp;rdquo; kann beispielsweise angegeben werden, dass diese E-Mails nur noch verschlüsselt übertragen werden dürfen. Mehr dazu später.&lt;/p&gt;
&lt;p&gt;Die Datenbank wird mit Datensätzen befüllt, sobald die Server fertig konfiguriert sind. Bis dahin könnt ihr die MySQL-Kommandozeile mit &lt;code&gt;quit;&lt;/code&gt; verlassen.&lt;/p&gt;
&lt;h2 id="vmail-benutzer-und--verzeichnis-einrichten"&gt;vmail-Benutzer und -Verzeichnis einrichten&lt;/h2&gt;
&lt;p&gt;Alle Mailboxen werden direkt im Dateisystem des Debian Servers abgelegt. Für die Zugriffe auf die Mailbox-Verzeichnisse wird ein eigener Benutzer &amp;ldquo;vmail&amp;rdquo; (&amp;ldquo;Virtual Mail&amp;rdquo;) erstellt, unter dem die Zugriffe von Dovecot und anderen Komponenten des Mailservers geschehen sollen. Einerseits wird so verhindert, dass Mailserver-Komponenten auf sensible Systemverzeichnisse Zugriff bekommen, andererseits können wir so die Mailboxen vor dem Zugriff von außen schützen. Nur vmail (und root) dürfen auf die Mailboxen zugreifen.&lt;/p&gt;
&lt;p&gt;Das Verzeichnis &lt;code&gt;/var/vmail/&lt;/code&gt; soll alle Mailserver-relevanten Dateien (also Mailboxen und Filterscripts) enthalten und wird für den vmail-User als Home Directory festgelegt.&lt;/p&gt;
&lt;p&gt;vmail-Verzeichnis erstellen:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /var/vmail
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;vmail-Systembenutzer erstellen:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;adduser --disabled-login --disabled-password --home /var/vmail vmail
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;vmail Unterverzeichnisse erstellen:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /var/vmail/mailboxes
mkdir -p /var/vmail/sieve/global
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Verzeichnis &lt;code&gt;/var/vmail&lt;/code&gt; an vmail-User übereignen und Verzeichnisrechte passend setzen:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;chown -R vmail /var/vmail
chgrp -R vmail /var/vmail
chmod -R 770 /var/vmail
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="dovecot-installieren-und-konfigurieren"&gt;Dovecot installieren und konfigurieren&lt;/h2&gt;
&lt;p&gt;Nachdem die Datenbank und der vmail-User angelegt wurden, widmen wir uns nun dem Dovecot-Server. Wie bereits erwähnt, verwaltet dieser Server die Mailboxen und bekommt daher (in der Gestalt des vmail-Users) exklusiv Zugriff auf &lt;code&gt;/var/vmail/&lt;/code&gt;. Zuerst müssen jedoch alle Serverkomponenten installiert werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;dovecot-core: Dovecot-Kern&lt;/li&gt;
&lt;li&gt;dovecot-imapd: Fügt IMAP-Funktionalität hinzu&lt;/li&gt;
&lt;li&gt;dovecot-lmtp: Fügt LMTP (Local Mail Transfer Protocol)-Funktionalität hinzu; LMTP wird als MTP-Protokoll zwischen Postfix und Dovecot genutzt&lt;/li&gt;
&lt;li&gt;dovecot-mysql: Lässt Dovecot mit der MySQL-Datenbank zusammenarbeiten&lt;/li&gt;
&lt;li&gt;dovecot-sieve: Fügt Filterfunktionalität hinzu&lt;/li&gt;
&lt;li&gt;dovecot-managesieved: Stellt eine Schnittstelle zur Einrichtung der Filter via Mailclient bereit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nach der Installation wird Dovecot automatisch gestartet. Beendet Dovecot, solange wir keine fertige Konfiguration haben:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl stop dovecot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nun geht es an die Konfiguration. Die Dovecot-Konfigurationsdateien liegen im Verzeichnis &lt;code&gt;/etc/dovecot/&lt;/code&gt;. Dort könnt ihr schon einige Konfigurationen sehen, die bei der Installation angelegt wurden. Wir werden die Konfiguration von Grund auf neu aufsetzen - deshalb wird zuerst einmal die gesamte Dovecot-Konfiguration gelöscht:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rm -r /etc/dovecot/*
cd /etc/dovecot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Für Dovecot reichen die folgenden zwei Konfigurationsdateien (&lt;code&gt;dovecot.conf&lt;/code&gt; und &lt;code&gt;dovecot-sql.conf&lt;/code&gt;) aus. Erstellt die beiden Dateien im Verzeichnis &lt;code&gt;/etc/dovecot/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="hauptkonfigurationsdatei-dovecotconf"&gt;Hauptkonfigurationsdatei dovecot.conf&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;###
### Aktivierte Protokolle
#############################
protocols = imap lmtp sieve
###
### TLS Config
#######################
ssl = required
ssl_cert = &amp;lt;/etc/letsencrypt/live/mail.mysystems.tld/fullchain.pem
ssl_key = &amp;lt;/etc/letsencrypt/live/mail.mysystems.tld/privkey.pem
ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA
ssl_prefer_server_ciphers = yes
###
### Dovecot services
################################
service imap-login {
inet_listener imap {
port = 143
}
}
service managesieve-login {
inet_listener sieve {
port = 4190
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0660
group = postfix
user = postfix
}
user = vmail
}
service auth {
### Auth socket für Postfix
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
### Auth socket für LMTP-Dienst
unix_listener auth-userdb {
mode = 0660
user = vmail
group = vmail
}
}
###
### Protocol settings
#############################
protocol imap {
mail_plugins = $mail_plugins quota imap_quota imap_sieve
mail_max_userip_connections = 20
imap_idle_notify_interval = 29 mins
}
protocol lmtp {
postmaster_address = postmaster@mysystems.tld
mail_plugins = $mail_plugins sieve
}
###
### Client authentication
#############################
disable_plaintext_auth = yes
auth_mechanisms = plain login
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf
}
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf
}
###
### Mail location
#######################
mail_uid = vmail
mail_gid = vmail
mail_privileged_group = vmail
mail_home = /var/vmail/mailboxes/%d/%n
mail_location = maildir:~/mail:LAYOUT=fs
###
### Mailbox configuration
########################################
namespace inbox {
inbox = yes
mailbox Spam {
auto = subscribe
special_use = \Junk
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
}
###
### Mail plugins
############################
plugin {
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_before = /var/vmail/sieve/global/spam-global.sieve
sieve = file:/var/vmail/sieve/%d/%n/scripts;active=/var/vmail/sieve/%d/%n/active-script.sieve
###
### Spam learning
###
# From elsewhere to Spam folder
imapsieve_mailbox1_name = Spam
imapsieve_mailbox1_causes = COPY
imapsieve_mailbox1_before = file:/var/vmail/sieve/global/learn-spam.sieve
# From Spam folder to elsewhere
imapsieve_mailbox2_name = *
imapsieve_mailbox2_from = Spam
imapsieve_mailbox2_causes = COPY
imapsieve_mailbox2_before = file:/var/vmail/sieve/global/learn-ham.sieve
sieve_pipe_bin_dir = /usr/bin
sieve_global_extensions = +vnd.dovecot.pipe
quota = maildir:User quota
quota_exceeded_message = Benutzer %u hat das Speichervolumen überschritten. / User %u has exhausted allowed storage space.
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anzupassende Stellen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ssl_cert: Pfad zur Zertifikatsdatei&lt;/li&gt;
&lt;li&gt;ssl_key: Pfad zur Zertifikatsdatei&lt;/li&gt;
&lt;li&gt;postmaster_address: Domain anpassen&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="erklärung"&gt;Erklärung&lt;/h4&gt;
&lt;p&gt;dovecot.conf ist die Hauptkonfigurationsdatei des Dovecot-Servers:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dovecot Services:&lt;/strong&gt; Im darauf folgenden Abschnitt werden die Dovecot Services konfiguriert. Dazu gehört z.B. der Dienst &amp;ldquo;imap-login&amp;rdquo;, der auf eingehende Verbindungen von E-Mail Clients auf Port 143 horcht. Auch &amp;ldquo;managesieve-login&amp;rdquo; kommuniziert mit dem Mailclient, wenn dieser eine Funktion zur Bearbeitung Server-seitiger Filterscripte mitbringt. Die anderen Dienste werden intern genutzt: Der lmtp-Dienst stellt eine Schnittstelle bereit, über die Postfix empfangene Mails an die Mailbox übergeben kann. Der &amp;ldquo;auth&amp;rdquo; Dienst wird vom LMTP-Dienst genutzt, um die Existenz von Benutzern zu überprüfen, aber auch von Postfix, um den Login am Postfix-Server zu überprüfen. Mit &amp;ldquo;mode&amp;rdquo;, &amp;ldquo;user&amp;rdquo; und &amp;ldquo;group&amp;rdquo; wird bestimmt, welcher Systemuser Zugriff auf den Dienst haben soll (Analog zu den Dateirechten – der Socket für den Dienst ist nichts anderes als eine Datei).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Protocol settings:&lt;/strong&gt; Für die verwendeten Protokolle können zusätzliche Einstellungen gesetzt werden – u.A. auch, welche Erweiterungen im Zusammenhang mit dem Protokoll genutzt werden sollen. &amp;ldquo;quota&amp;rdquo; und &amp;ldquo;imap_quota&amp;rdquo; sind notwendig, um das maximale Volumen einer Mailbox festsetzen zu können. Beim lmtp-Protokoll kann auf diese Erweiterungen verzichtet werden: Hier wird nur die Sieve-Erweiterung zum Filtern von E-Mails benötigt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Client Authentication:&lt;/strong&gt; Die Zeilen&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;disable_plaintext_auth = yes
auth_mechanisms = plain login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;scheinen sich zu widersprechen, schließlich wird die Klartext-Authentifizierung abgeschaltet. Doch tatsächlich wird sie das nur für unverschlüsselte Verbindungen. TLS-Verschlüsselte Verbindungen bleiben davon unberührt, sodass in der nächsten Zeile die &amp;ldquo;plain&amp;rdquo; Authentifizierung mit Klartext-Passwörtern wieder angeboten werden kann. Das wird aus zwei Gründen getan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Klartext&amp;rdquo; tut uns hier nicht weh – schließlich ist die Verbindung sowieso (zwingend) verschlüsselt.&lt;/li&gt;
&lt;li&gt;Alle Mailclients unterstützen die Klartextauthentifizierung. Andere Loginmechanismen werden weniger gut unterstützt und sind aufwendiger.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wir konzentrieren uns deshalb auf die klassische Klartextauthentifizierung. Wie bereits erwähnt: Da unsere Verbindung ohnehin verschlüsselt ist, ist das in diesem Fall nicht sicherheitsrelevant.&lt;/p&gt;
&lt;p&gt;Für &amp;ldquo;passdb&amp;rdquo; und &amp;ldquo;userdb&amp;rdquo; wird jeweils der Pfad zur SQL-Datei eingestellt. Dort befindt sich jeweils eine passende SQL-Query. Die &amp;ldquo;passdb&amp;rdquo; wird befragt, wenn es um die Authentifizierung von Usern geht, die &amp;ldquo;userdb&amp;rdquo;, wenn die Existenz eines bestimmten E-Mail Kontos überprüft werden soll, oder benutzerdefinierte Einstellungen geladen werden müssen, wie z.B. das Mailbox-Kontingent (&amp;ldquo;Quota&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maillocation:&lt;/strong&gt; In diesem Abschnitt wird definiert, unter welchem Systemuser Dovecot auf Dateisystem-Ebene mit E-Mails hantieren soll. Außerdem wird ein Pfad-Schema festgelegt, das bestimmt, nach welcher Struktur die Mailbox-Verzeichnisse angelegt werden sollen. %d steht für die Domain des Accounts und %n für den Benutzernamen vor dem @. Der Pfad zu einer Benutzermailbox lautet z.B.: /var/vmail/mailboxes/mysystems.tld/admin/mail/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mailbox Configuration:&lt;/strong&gt; In der Mailbox eines jeden Users soll sich standardmäßig ein &amp;ldquo;Spam&amp;rdquo;-Ordner befinden, in die ein passendes Sieve-Filterskript verdächtige E-Mails verschieben soll.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mail Plugins:&lt;/strong&gt; Hier werden die Details zu den Erweiterungen &amp;ldquo;sieve&amp;rdquo;, &amp;ldquo;quota&amp;rdquo; und &amp;ldquo;imapsieve&amp;rdquo; definiert. Das Script unter &amp;ldquo;sieve_before&amp;rdquo; wird für alle User (unabhängig von den eigenen Einstellungen) immer ausgeführt. Es hat die Aufgabe, durch Rspamd markierte Mails in den Spam-Ordner zu verschieben. &amp;ldquo;sieve_dir&amp;rdquo; definiert das Schema für den Ort, an dem benutzerdefinierte Scripts abgelegt werden. Das aktive Skript eines Nutzers soll jeweils über den symbolischen Link &amp;ldquo;active-script.sieve&amp;rdquo; zugänglich sein. Die &amp;ldquo;imapsieve&amp;rdquo; Einstellungen lassen den IMAP-Server Verschiebevorgängezwischen Mailbox-Ordnern erkennen, sodass Rspamd aus einer Neuordnung lernen kann.&lt;/p&gt;
&lt;h3 id="sql-konfgurationsdatei-dovecot-sqlconf"&gt;SQL-Konfgurationsdatei dovecot-sql.conf&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;driver=mysql
connect = &amp;#34;host=127.0.0.1 dbname=vmail user=vmail password=vmaildbpass&amp;#34;
default_pass_scheme = SHA512-CRYPT
password_query = SELECT username AS user, domain, password FROM accounts WHERE username = &amp;#39;%n&amp;#39; AND domain = &amp;#39;%d&amp;#39; and enabled = true;
user_query = SELECT concat(&amp;#39;*:storage=&amp;#39;, quota, &amp;#39;M&amp;#39;) AS quota_rule FROM accounts WHERE username = &amp;#39;%n&amp;#39; AND domain = &amp;#39;%d&amp;#39; AND sendonly = false;
iterate_query = SELECT username, domain FROM accounts where sendonly = false;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anzupassende Stellen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Datenbankpasswort &amp;ldquo;vmaildbpass&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;dovecot-sql.conf&lt;/code&gt; enthält sensible Datenbank-Zugangsdaten und wird deshalb geschützt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod 440 dovecot-sql.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="erklärung-1"&gt;Erklärung&lt;/h4&gt;
&lt;p&gt;Die Konfigurationsdatei &amp;ldquo;dovecot-sql.conf&amp;rdquo; enthält alle SQL-relevanten Einstellungen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;driver&lt;/strong&gt;: Welcher Datenbank-Treiber soll genutzt werden?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;connect&lt;/strong&gt;: Informationen zur Datenbankverbindung&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;default_pass_scheme&lt;/strong&gt;: Standardmäßig angenommenes Hash-Schema, wenn es in der Datenbank nicht explizit angegeben ist, z.B. mit vorangestelltem {SHA512-CRYPT}.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;password_query&lt;/strong&gt;: SQL Query für die Überprüfung des User-Logins. Stimmen Benutzername und Passwort überein? Existiert der Benutzer und ist er aktiviert?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;user_query&lt;/strong&gt;: SQL-Query zum Abholen aller Benutzer-spezifischen Einstellungen. In diesem Fall: Maximales Mailbox-Volumen (&amp;ldquo;Quota&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iterate_query&lt;/strong&gt;: SQL-Query zur Abfrage aller verfügbarer Benutzer. Benutzer, die keine Mails empfangen können (sendonly=true) sind für Dovecot nicht interessant und werden nicht mit ausgegeben.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="globales-sieve-filterscript-für-spam"&gt;Globales Sieve-Filterscript für Spam&lt;/h3&gt;
&lt;p&gt;Unter &lt;code&gt;/var/vmail/sieve/global/&lt;/code&gt; wird das Sieve-Filterscript &lt;code&gt;spam-global.sieve&lt;/code&gt; erstellt, das erkannte Spammails in den Unterordner &amp;ldquo;Spam&amp;rdquo; jeder Mailbox einsortiert. Rspamd markiert erkannte E-Mails mit einem speziellen Spam-Header, den das Script erkennt. Inhalt von spam-global.sieve:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;require &amp;quot;fileinto&amp;quot;;
if header :contains &amp;quot;X-Spam-Flag&amp;quot; &amp;quot;YES&amp;quot; {
fileinto &amp;quot;Spam&amp;quot;;
}
if header :is &amp;quot;X-Spam&amp;quot; &amp;quot;Yes&amp;quot; {
fileinto &amp;quot;Spam&amp;quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="spam-learning-mit-rspamd"&gt;Spam Learning mit Rspamd&lt;/h3&gt;
&lt;p&gt;Beim Verschieben von Spammails in den Spam-Ordner bzw. dem Herausverschieben falsch beurteilter Mails in den Posteingang soll ein Lernprozess von Rspamd ausgelöst werden, sodass der Filter aus falschen Einschätzungen lernt und so mit der Zeit immer besser wird.&lt;/p&gt;
&lt;p&gt;Dazu werden zwei Sieve-Scripts in &lt;code&gt;/var/vmail/sieve/global/&lt;/code&gt; angelegt:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;learn-spam.sieve&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;require [&amp;quot;vnd.dovecot.pipe&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;imapsieve&amp;quot;];
pipe :copy &amp;quot;rspamc&amp;quot; [&amp;quot;learn_spam&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;learn-ham.sieve&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;require [&amp;quot;vnd.dovecot.pipe&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;imapsieve&amp;quot;, &amp;quot;environment&amp;quot;, &amp;quot;variables&amp;quot;];
if environment :matches &amp;quot;imap.mailbox&amp;quot; &amp;quot;*&amp;quot; {
set &amp;quot;mailbox&amp;quot; &amp;quot;${1}&amp;quot;;
}
if string &amp;quot;${mailbox}&amp;quot; &amp;quot;Trash&amp;quot; {
stop;
}
pipe :copy &amp;quot;rspamc&amp;quot; [&amp;quot;learn_ham&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="postfix-installieren-und-konfigurieren"&gt;Postfix installieren und konfigurieren&lt;/h2&gt;
&lt;p&gt;Für unseren Postfix-Server benötigen wir nur zwei Pakete: Das Kernpaket &amp;ldquo;postfix&amp;rdquo; und die Komponente &amp;ldquo;postfix-mysql&amp;rdquo;, die Postfix mit der MySQL-Datenbank kommunizieren lässt.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install postfix postfix-mysql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Während der Installation werdet ihr nach der &amp;ldquo;Allgemeinen Art der Konfiguration&amp;rdquo; gefragt. Wählt an dieser Stelle &amp;ldquo;Keine Konfiguration&amp;rdquo; und beendet den Postfix-Server wieder:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl stop postfix
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Im Postfix-Konfigurationsverzeichnis &lt;code&gt;/etc/postfix&lt;/code&gt; befinden sich trotz unserer Wahl &amp;ldquo;Keine Konfiguration&amp;rdquo; ein paar Konfigurationsdateien, die zunächst entfernt werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd /etc/postfix
rm -r sasl
rm master.cf main.cf.proto master.cf.proto
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Legt dann folgende Dateien im Verzeichnis &lt;code&gt;/etc/postfix&lt;/code&gt; an:&lt;/p&gt;
&lt;h3 id="maincf"&gt;main.cf&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;##
## Netzwerkeinstellungen
##
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
inet_interfaces = 127.0.0.1, ::1, 5.1.76.152, 2a00:f820:417::7647:b2c2
myhostname = mail.mysystems.tld
##
## Mail-Queue Einstellungen
##
maximal_queue_lifetime = 1h
bounce_queue_lifetime = 1h
maximal_backoff_time = 15m
minimal_backoff_time = 5m
queue_run_delay = 5m
##
## TLS Einstellungen
###
tls_preempt_cipherlist = yes
tls_ssl_options = NO_COMPRESSION
tls_high_cipherlist = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA
### Ausgehende SMTP-Verbindungen (Postfix als Sender)
smtp_tls_security_level = dane
smtp_dns_support_level = dnssec
smtp_tls_policy_maps = mysql:/etc/postfix/sql/tls-policy.cf
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_ciphers = high
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
### Eingehende SMTP-Verbindungen
smtpd_tls_security_level = may
smtpd_tls_protocols = !SSLv2, !SSLv3
smtpd_tls_ciphers = high
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.mysystems.tld/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.mysystems.tld/privkey.pem
##
## Lokale Mailzustellung an Dovecot
##
virtual_transport = lmtp:unix:private/dovecot-lmtp
##
## Spamfilter und DKIM-Signaturen via Rspamd
##
smtpd_milters = inet:localhost:11332
non_smtpd_milters = inet:localhost:11332
milter_protocol = 6
milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
milter_default_action = accept
##
## Server Restrictions für Clients, Empfänger und Relaying
## (im Bezug auf S2S-Verbindungen. Mailclient-Verbindungen werden in master.cf im Submission-Bereich konfiguriert)
##
### Bedingungen, damit Postfix als Relay arbeitet (für Clients)
smtpd_relay_restrictions = reject_non_fqdn_recipient
reject_unknown_recipient_domain
permit_mynetworks
reject_unauth_destination
### Bedingungen, damit Postfix ankommende E-Mails als Empfängerserver entgegennimmt (zusätzlich zu relay-Bedingungen)
### check_recipient_access prüft, ob ein account sendonly ist
smtpd_recipient_restrictions = check_recipient_access mysql:/etc/postfix/sql/recipient-access.cf
### Bedingungen, die SMTP-Clients erfüllen müssen (sendende Server)
smtpd_client_restrictions = permit_mynetworks
check_client_access hash:/etc/postfix/without_ptr
reject_unknown_client_hostname
### Wenn fremde Server eine Verbindung herstellen, müssen sie einen gültigen Hostnamen im HELO haben.
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks
reject_invalid_helo_hostname
reject_non_fqdn_helo_hostname
reject_unknown_helo_hostname
# Clients blockieren, wenn sie versuchen zu früh zu senden
smtpd_data_restrictions = reject_unauth_pipelining
##
## Restrictions für MUAs (Mail user agents)
##
mua_relay_restrictions = reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_mynetworks,permit_sasl_authenticated,reject
mua_sender_restrictions = permit_mynetworks,reject_non_fqdn_sender,reject_sender_login_mismatch,permit_sasl_authenticated,reject
mua_client_restrictions = permit_mynetworks,permit_sasl_authenticated,reject
##
## Postscreen Filter
##
### Postscreen Whitelist / Blocklist
postscreen_access_list = permit_mynetworks
cidr:/etc/postfix/postscreen_access
postscreen_blacklist_action = drop
# Verbindungen beenden, wenn der fremde Server es zu eilig hat
postscreen_greet_action = drop
### DNS blocklists
postscreen_dnsbl_threshold = 2
postscreen_dnsbl_sites = zen.spamhaus.org*2
postscreen_dnsbl_action = drop
##
## MySQL Abfragen
##
virtual_alias_maps = mysql:/etc/postfix/sql/aliases.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql/accounts.cf
virtual_mailbox_domains = mysql:/etc/postfix/sql/domains.cf
local_recipient_maps = $virtual_mailbox_maps
##
## Sonstiges
##
### Maximale Größe der gesamten Mailbox (soll von Dovecot festgelegt werden, 0 = unbegrenzt)
mailbox_size_limit = 0
### Maximale Größe eingehender E-Mails in Bytes (50 MB)
message_size_limit = 52428800
### Keine System-Benachrichtigung für Benutzer bei neuer E-Mail
biff = no
### Nutzer müssen immer volle E-Mail Adresse angeben - nicht nur Hostname
append_dot_mydomain = no
### Trenn-Zeichen für &amp;#34;Address Tagging&amp;#34;
recipient_delimiter = +
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anzupassen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;inet_interfaces&lt;/strong&gt;: IP-Adressen &lt;code&gt;5.1.76.152, 2a00:f820:417::7647:b2c2&lt;/code&gt; müssen durch eigene IPv4- (und optional IPv6)-Adresse ersetzt werden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;myhostname&lt;/strong&gt;: Ersetzen durch eigenen Hostnamen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;smtpd_tls_cert_file&lt;/strong&gt;: Pfad zur Zertifikatsdatei&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;smtpd_tls_key_file&lt;/strong&gt;: Pfad zur Zertifikatsdatei&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="warning"&gt;
&lt;p&gt;&lt;strong&gt;Wichtiger Hinweis für Hetzner CX- vServer Kunden&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Die CX-vServer-Modelle von Hetzner haben ihre öffentliche IP-Adresse nicht direkt an der Netzwerkschnittstelle anliegen. Wenn ihr ein &amp;ldquo;ip addr&amp;rdquo; ausführt, seht ihr statt der öffentlichen IP-Adresse eine private Adresse. Das liegt daran, dass Hetzner die öffentliche Adresse auf die private Adresse &amp;ldquo;NATet&amp;rdquo;. (Mehr dazu unter &lt;a href="https://wiki.hetzner.de/index.php/VServer#Warum_hat_meine_VM_die_IP_172.31.1.100.3F"&gt;&amp;ldquo;Warum hat meine VM die IP 172.31.1.100?&amp;rdquo;&lt;/a&gt;. Verwendet in der Postfix-Konfiguration und allen übrigen Konfigurationen also nicht die öffentliche Adresse, sondern die private!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="warning"&gt;
&lt;p&gt;Wenn der Mailserver (entgegen meiner Empfehlung) nicht einen &amp;ldquo;&lt;em&gt;mail&lt;/em&gt;.domain.tld&amp;rdquo; Hostnamen hat, sondern unter dem Domainnamen läuft (&lt;em&gt;domain.tld&lt;/em&gt;), muss zur Konfiguration eine Zeile mit&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mydestination =
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(ohne Inhalt nach dem &amp;ldquo;=&amp;rdquo;) hinzugefügt werden, sonst werden E-Mails an der falschen Stelle gespeichert.&lt;/p&gt;
&lt;/div&gt;
&lt;h4 id="erklärung-2"&gt;Erklärung&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Netzwerkeinstellungen:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mynetworks: Anfragen von diesen IP-Adressen / aus diesen IP-Adressbereichen werden von Postfix gesondert behandelt (Verwendung für &amp;ldquo;mynetworks&amp;rdquo; in den Restrictions). Üblicherweise werden hier die *lokalen Adressbereiche und IP-Adressen aus dem eigenen Netz eingetragen.&lt;/li&gt;
&lt;li&gt;inet_interfaces: Auf diesen IP-Adressen soll Postfix seine Ports öffnen. Die IP-Adressen müssen an den eigenen Server angepasst werden.&lt;/li&gt;
&lt;li&gt;myhostname: Der Hostname des Mailservers, wie er bei der Mailverarbeitung genutzt werden soll.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mail-Queue Einstellungen:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;E-Mails in Postfix werden &amp;ldquo;gequeued&amp;rdquo;, d.h. in eine Warteschlange eingetragen, die regelmäßig abgearbeitet wird. Wenn Mails nicht zustellbar sind, verbleiben sie eine gewisse Zeit in der Queue, bis ihre Lebenszeit abgelaufen ist, und sie aus der Queue entfernt werden. Der Absender der E-Mail bekommt dann eine entsprechende Nachricht, in der er über die Unzustellbarkeit informiert wird.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;maximal_queue_lifetime: Lebensdauer einer normalen Nachricht in der Queue. Wenn eine E-Mail innerhalb einer Stunde nicht zugestellt werden konnte, wird sie aus der Queue entfernt und der Absender benachrichtigt.&lt;/li&gt;
&lt;li&gt;bounce_queue_lifetime: Lebensdauer einer Unzustellbarkeits-Benachrichtigung in der Queue.&lt;/li&gt;
&lt;li&gt;maximal_backoff_time: Maximale Zeit, die verstreichen darf, bis für eine E-Mail ein neuer Zustellversuch gestartet wird.&lt;/li&gt;
&lt;li&gt;minimal_backoff_time: Zeit, die mindestens verstrichen sein muss, bis ein neuer Zustellversuch gestartet wird.&lt;/li&gt;
&lt;li&gt;queue_run_delay: Intervall, in dem die Queue nach nicht zustellbaren E-Mails durchsucht wird.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;TLS-Einstellungen:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kompression wird abgeschaltet und (wie bei Dovecot) eine Cipherlist vorgegeben, sodass die bestmögliche Verschlüsselung zwischen Client und Server genutzt wird. Im ersten Teilabschnitt werden die &amp;ldquo;smtp&amp;rdquo;-spezifischen TLS-Einstellungen festgelegt – d.h. die Einstellungen, die Postfix als sendenden Kommunikationspartner (Mail-Client) betreffen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;smtp_tls_security_level: Standard-TLS-Policy, wenn sie in der Datenbank für die Empfängerdomain nicht anders spezifiziert wurde: &amp;ldquo;dane&amp;rdquo; kontrolliert zunächst, ob für den Empfängerserver ein TLSA-Eintrag (DANE) im DNS vorliegt. Wenn das der Fall ist, wird eine verschlüsselte Verbindung erzwungen und das vorgezeigte Serverzertifikat mittels TLSA-Eintrag verifiziert. Sollte kein TLSA-Eintrag verfügbar sein, fällt Postfix in die Plicy &amp;ldquo;may&amp;rdquo; zurück und verschlüsselt nur, wenn der andere Server das unterstützt. Zertifikate werden dabei nicht validiert. Sollten vorhandene TLSA-Einträge ungültig sein, wird stattdessen die &amp;ldquo;encrypt&amp;rdquo; Policy genutzt, welche zwar zwingend Verschlüsselt, aber Zertifikate ebenfalls nicht validiert. Mehr zu den TLS-Policies folgt später.&lt;/li&gt;
&lt;li&gt;smtp_dns_support_level: DNSSEC-gesicherte DNS-Lookups aktiveren und nutzen, falls möglich&lt;/li&gt;
&lt;li&gt;smtpd_tls_policy_maps: Verweist auf die SQL-Queries, mit denen Empfängerdomain-spezifische TLS-Einstellungen geladen werden&lt;/li&gt;
&lt;li&gt;smtp_tls_protocols: SSL v2 und v3 werden deaktiviert.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nun zum zweiten TLS-Block: Dieser gilt für eingehende Verbindungen. Sowohl für andere Server, als auch Mailclients. Wieder werden SSL v2 und 3 deaktiviert und eine starke Cipherlist ausgewählt. Eingehende Verbindungen können verschlüsselt sein, müssen aber nicht.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LMTP-Service:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;virtual_transport&amp;rdquo; übermittelt verarbeitete, eingehende E-Mails an den LMTP-Service von Dovecot, der sich dann um die Einordnung der Mail in die passende Mailbox kümmert.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spamfilter und DKIM-Signaturen via Rspamd:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dieser Abschnitt definiert den Rspam-Daemon als Milter für ein- und ausgehende E-Mails. Eingehende E-Mails werden durch Rspamd auf ihre Seriosität geprüft - ausgehende werden mit einem DKIM-Schlüssel signiert.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server Restrictions:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Die Blöcke unter &amp;ldquo;Server restrictions&amp;rdquo; sind besonders wichtig für die Sicherheit des Mailservers. Falsch eingestellt erlauben sie den unberechtigten Versand von E-Mails (Stichwort &amp;ldquo;Open Relay&amp;rdquo;). Der Mailserver wird dann als Spam-Schleuder missbraucht und landet sehr schnell auf einer Blacklist. Damit das nicht passiert, sollten die Restrictions (Beschränkungen) sorgfältig eingestellt und mit einem passenden Open Relay Detektor überprüft sein.&lt;/p&gt;
&lt;p&gt;Die Restrictions werden in Leserichtung nacheinander abgearbeitet. Am Ende jeder Verarbeitung steht immer ein &amp;ldquo;permit&amp;rdquo; oder &amp;ldquo;reject&amp;rdquo;. Für das bessere Verständnis ein Beispiel:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;smtpd_relay_restrictions = reject_non_fqdn_recipient
reject_unknown_recipient_domain
permit_mynetworks
reject_unauth_destination
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;ldquo;smtpd_relay_restrictions&amp;rdquo; bestimmt die Bedingungen, unter der Postfix als Mail-Relay (&amp;ldquo;Vermittlungsstelle&amp;rdquo;) arbeitet. Unser Postfix soll nur in drei Fällen auf eingehende E-Mails reagieren:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wenn ein Mailclient eine E-Mail via Postfix ins Internet schicken will&lt;/li&gt;
&lt;li&gt;Wenn ein fremder Mailserver eine E-Mail an unseren Postfix schickt&lt;/li&gt;
&lt;li&gt;Wenn vom Mailserver selbst aus eine Mail verschickt werden soll&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Um den ersten Fall wird sich in der master.cf Datei gekümmert. Dort werden die Relay Restrictions im Submission-Bereich so überschrieben, dass Mailclients nicht am freien Versenden gehindert werden. Aktuell interessieren daher nur die letzten beiden Anfrage-Typen. Die erste Zeile der Restriction lautet &amp;ldquo;reject_non_fqdn_recipient&amp;rdquo;. Sollte die Empfängeradresse keine vollwertige E-Mail Adresse sein, wird die Anfrage an Postfix direkt mit einem &amp;ldquo;reject&amp;rdquo; abgewiesen. Alle anderen Checks finden dann nicht mehr statt. Das führt dazu, dass Postfix eine Weiterverarbeitung nur akzeptiert, wenn die zu verarbeitende E-Mail einen gültigen Empfänger hat. Ähnliches gilt für &amp;ldquo;reject_unknown_recipient_domain&amp;rdquo;: Wenn die Empfängerdomain keinen gültigen MX- oder A-Eintrag im DNS hat (und der Zielserver damit nicht feststeht), wird die E-Mail abgelehnt.&lt;/p&gt;
&lt;p&gt;Die darauf folgende Zeile enthält die &amp;ldquo;Restriction&amp;rdquo; &amp;ldquo;permit_mynetworks&amp;rdquo;. Wenn der Anfragesteller lokal ist (bzw. seine IP in &amp;ldquo;mynetworks&amp;rdquo; vermerkt ist), wird er mit einem &amp;ldquo;permit&amp;rdquo; durchgewunken und die E-Mail wird weiter verarbeitet. Weitere Checks finden dann nicht statt. Sollte er nicht in mynetworks vermerkt sein, wird der letzte Check durchgeführt: &amp;ldquo;reject_unauth_destination&amp;rdquo; kann nur bestanden werden, wenn die zu verarbeitende E-Mail an eine Empfängeradresse dieses Mailsystems geht. Sollte bis zum Ende der restriction-Definition noch kein &amp;ldquo;permit&amp;rdquo; oder &amp;ldquo;reject&amp;rdquo; ausgelöst worden sein, wird automatisch ein &amp;ldquo;permit&amp;rdquo; ausgelöst und die jeweilige Aktion erlaubt.&lt;/p&gt;
&lt;p&gt;Alle anderen Restriction-Definitionen funktionieren ähnlich: Die Kriterien werden nacheinander überprüft. Beginnt ein Kriterium mit einem &amp;ldquo;reject_&amp;rdquo;, wird bei Zutreffen ein &amp;ldquo;reject&amp;rdquo; ausgelöst, beginnt es mit einem &amp;ldquo;permit&amp;rdquo;, wird ein &amp;ldquo;permit&amp;rdquo; ausgelöst. In beiden Fällen werden die nachfolgenden Kriterien nicht mehr überprüft.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;smtpd_relay_restrictions: Kriterien, die überprüft werden, wenn Anfragen am Postfix-Server eintreffen (Von fremden Mailservern oder vom eigenen Server aus, z.B. via sendmail)&lt;/li&gt;
&lt;li&gt;smtpd_recipient_restrictions: Kriterien, die zusätzlich zu den relay_restrictions geprüft werden. Nur bei bestehen der Checks wird eine E-Mail auf dem lokalen System angenommen und an die Empfänger-Mailbox geschickt. An dieser Stelle wird über eine SQL-Abfrage nachgefragt, ob ein bestimmter Empfänger E-Mails empfangen können soll (=&amp;gt; Siehe Option in der Datenbank, Accounts nur zum Versenden freizuschalten).&lt;/li&gt;
&lt;li&gt;smtpd_client-restrictions: Kriterien, auf die hin andere Server überprüft werden, wenn Kontakt zum Postfix-Server hergestellt wird. (Müssen gültigen Hostnamen und Reverse-DNS-Eintrag haben)&lt;/li&gt;
&lt;li&gt;smtpd_helo_restrictions: Fremde Server müssen zu Beginn ihren gültigen Hostnamen nennen.&lt;/li&gt;
&lt;li&gt;smtpd_data_restrictions: Ungeduldige Server sind oft Spammer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Postscreen Filter:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Der Postscreen-Filter ist ein mächstiges Werkzeug, um Spammer-Server zu blockieren. Bevor ein fremder Server überhaupt eine E-Mail zustellen kann, überprüft Postscreen einige Merkmale des sendenden Servers und kann in den meisten Fällen zuverlässig zwischen gutem und bösen Server unterscheiden.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;postscreen_access_list: In der Datei &lt;code&gt;/etc/postfix/postscreen_access&lt;/code&gt; können Ausnahmen für den Postscreen-Filter definiert werden.&lt;/li&gt;
&lt;li&gt;DNS Blocklist: Postscreen kann anhand von Blacklists / Blocklists entscheiden, ob von einer bestimmten IP-Adresse häufig Spam ausgeht. Dazu werden die bekannten Blocklists unter &amp;ldquo;dnsbl_sites&amp;rdquo; befragt. Die zahl hinter dem Stern * ist dabei eine Gewichtung. Besonders zuverlässig arbeitende Blacklists bekommen eine höhere Gewichtung, damit der Schwellwert &amp;ldquo;dnsbl_threshold&amp;rdquo; schneller erreicht ist. Sobald der Schwellwert bei einem Server überschritten wird, wird die Verbindung abgebrochen.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="warning"&gt;
&lt;strong&gt;Vorsicht mit der zen.spamhaus.org-Blocklist!&lt;/strong&gt; Spamhaus lässt Anfragen aus dem Google DNS nicht zu. Installiert am besten einen eigenen DNS-Resolver, um dem Problem aus dem Weg zu gehen (daher die Empfehlung, Unbound zu installieren!)
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;MySQL-Abfragen:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hier sind die Pfade zu den übrigen SQL-Dateien angegeben, die Postfix benötigt, um Daten aus der Datenbank abfragen zu können.&lt;/p&gt;
&lt;h3 id="mastercf"&gt;master.cf&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
# ==========================================================================
###
### Postscreen-Service: Prüft eingehende SMTP-Verbindungen auf Spam-Server
###
smtp inet n - y - 1 postscreen
-o smtpd_sasl_auth_enable=no
###
### SMTP-Daemon hinter Postscreen.
###
smtpd pass - - y - - smtpd
###
### dnsblog führt DNS-Abfragen für Blocklists durch
###
dnsblog unix - - y - 0 dnsblog
###
### tlsproxy gibt Postscreen TLS support
###
tlsproxy unix - - y - 0 tlsproxy
###
### Submission-Zugang für Clients: Für Mailclients gelten andere Regeln, als für andere Mailserver (siehe smtpd_ in main.cf)
###
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_client_restrictions=$mua_client_restrictions
-o smtpd_sender_restrictions=$mua_sender_restrictions
-o smtpd_relay_restrictions=$mua_relay_restrictions
-o milter_macro_daemon_name=ORIGINATING
-o smtpd_sender_login_maps=mysql:/etc/postfix/sql/sender-login-maps.cf
-o smtpd_helo_required=no
-o smtpd_helo_restrictions=
-o cleanup_service_name=submission-header-cleanup
###
### Weitere wichtige Dienste für den Serverbetrieb
###
pickup unix n - y 60 1 pickup
cleanup unix n - y - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - y 1000? 1 tlsmgr
rewrite unix - - y - - trivial-rewrite
bounce unix - - y - 0 bounce
defer unix - - y - 0 bounce
trace unix - - y - 0 bounce
verify unix - - y - 1 verify
flush unix n - y 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - y - - smtp
relay unix - - y - - smtp
showq unix n - y - - showq
error unix - - y - - error
retry unix - - y - - error
discard unix - - y - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - y - - lmtp
anvil unix - - y - 1 anvil
scache unix - - y - 1 scache
###
### Cleanup-Service um MUA header zu entfernen
###
submission-header-cleanup unix n - n - 0 cleanup
-o header_checks=regexp:/etc/postfix/submission_header_cleanup
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die &lt;code&gt;/etc/postfix/master.cf&lt;/code&gt; Datei will ich euch nur im Groben erklären. Wichtig zu wissen ist, dass hier die Definition und Konfiguration der verschiedenen Postfix-Dienste wie z.B. postscreen, smtpd und smtp passiert. Gut zu erkennen ist, dass über ein &lt;code&gt; -o&lt;/code&gt; weitere Parameter an einen Dienst übergeben werden. So beispielsweise beim Submission-Dienst, der auf Port 587 für die SMTP-Kommunikation mit den Mailclients bereitsteht: Die hier angegebenen Einstellungen z.B. zu &lt;code&gt;smtpd_relay_restrictions&lt;/code&gt; überschreiben die Einstellungen in der main.cf – allerdings nur für diesen einen spezifischen Dienst! Ein gutes Beispiel ist die Einstellung &lt;code&gt;smtpd_tls_security_level=encrypt&lt;/code&gt;, die im Submission-Block steht. In der Main.cf hatten wir hier &amp;ldquo;may&amp;rdquo; definiert, um keine Server auszuschließen, die TLS nicht beherrschen. Da smtpd-Einstellungen aber sowohl für andere Server als auch für Mailclient gelten, wäre damit auch zu den Mailclients gesagt: &amp;ldquo;Ihr könnt verschlüsselte Verbindungen herstellen – müsst aber nicht&amp;rdquo;. Das wollen wir selbstverständlich nicht! Mailclients sollen eine verschlüsselte Verbindung herstellen müssen! Deshalb wird die smtpd-Einstellung speziell für den Submission-Dienst mithilfe der &lt;code&gt; -o&lt;/code&gt; Option überschrieben und auf &amp;ldquo;encrypt&amp;rdquo; gesetzt.&lt;/p&gt;
&lt;p&gt;Für besseren Datenschutz wird der &amp;ldquo;Received&amp;rdquo;-Header (+ weitere Datenschutz-relevante Header) bei eingehenden E-Mails entfernt, wenn sie über den Submission-Port eintreffen. Die meisten E-Mail-Clients senden ihren Namen und die Version mit. Zusätzlich vermerkt Postfix bei eingehenden E-Mails, von welcher IP-Adresse die E-Mail stammt. Auf diese Informationen können wir verzichten, deshalb werden sie mithilfe eines kleinen zusätzlichen Dienstes &lt;code&gt;submission-header-cleanup&lt;/code&gt; (am Ende der Konfiguration) aus der E-Mail gelöscht. Im Submission-Bereich wird via &lt;code&gt;cleanup_service_name&lt;/code&gt; festgelegt, dass bei eingehenden Mails auf dem Submission-Port (wird nur von Mailclients benutz) der Filter anzuwenden ist. Die Filterregeln befinden sich in der Datei &lt;code&gt;/etc/postfix/submission_header_cleanup&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="header-cleanup-regeln"&gt;Header Cleanup Regeln&lt;/h3&gt;
&lt;p&gt;Unter &lt;code&gt;/etc/postfix/submission_header_cleanup&lt;/code&gt; wird eine Datei mit folgendem Inhalt angelegt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;### Entfernt Datenschutz-relevante Header aus E-Mails von MTUAs
/^Received:/ IGNORE
/^X-Originating-IP:/ IGNORE
/^X-Mailer:/ IGNORE
/^User-Agent:/ IGNORE
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="sql-konfiguration"&gt;SQL-Konfiguration&lt;/h3&gt;
&lt;p&gt;Neben der Haupt-Konfiguration main.cf und der Service-Konfiguration master.cf werden noch ein paar Konfigurationsdateien innerhalb des Unterverzeichnisses sql/ angelegt, die die SQL-Queries für die Datenabfragen an die Datenbank enthalten:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir /etc/postfix/sql &amp;amp;&amp;amp; cd $_
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Erstellt dann die folgenden Konfigurationsdateien mit dem zugehörigen Inhalt:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;accounts.cf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user = vmail
password = vmaildbpass
hosts = 127.0.0.1
dbname = vmail
query = select 1 as found from accounts where username = '%u' and domain = '%d' and enabled = true LIMIT 1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;aliases.cf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user = vmail
password = vmaildbpass
hosts = 127.0.0.1
dbname = vmail
query = select concat(destination_username, '@', destination_domain) as destinations from aliases where source_username = '%u' and source_domain = '%d' and enabled = true;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;domains.cf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user = vmail
password = vmaildbpass
hosts = 127.0.0.1
dbname = vmail
query = SELECT domain FROM domains WHERE domain='%s'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;recipient-access.cf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user = vmail
password = vmaildbpass
hosts = 127.0.0.1
dbname = vmail
query = select if(sendonly = true, 'REJECT', 'OK') AS access from accounts where username = '%u' and domain = '%d' and enabled = true LIMIT 1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;sender-login-maps.cf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user = vmail
password = vmaildbpass
hosts = 127.0.0.1
dbname = vmail
query = select concat(username, '@', domain) as 'owns' from accounts where username = '%u' AND domain = '%d' and enabled = true union select concat(destination_username, '@', destination_domain) AS 'owns' from aliases where source_username = '%u' and source_domain = '%d' and enabled = true;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;tls-policy.cf&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user = vmail
password = vmaildbpass
hosts = 127.0.0.1
dbname = vmail
query = SELECT policy, params FROM tlspolicies WHERE domain = '%s'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Vergesst nicht, &lt;code&gt;vmaildbpass&lt;/code&gt; in jeder der Dateien durch euer eigenes Passwort zu ersetzen!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Alle SQL-Konfgurationsdateien in &lt;code&gt;/etc/postfix/sql&lt;/code&gt; werden vor dem Zugriff durch unberechtigte User geschützt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod -R 640 /etc/postfix/sql
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="weitere-postfix-konfigurationsdateien"&gt;Weitere Postfix-Konfigurationsdateien&lt;/h3&gt;
&lt;p&gt;Außerdem gibt es noch zwei weitere Dateien in &lt;code&gt;/etc/postfix&lt;/code&gt;, die zunächst leer bleiben können:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;touch /etc/postfix/without_ptr
touch /etc/postfix/postscreen_access
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Datei &lt;code&gt;without_ptr&lt;/code&gt; kann Einträge wie den folgenden beinhalten:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.2.3.3 OK
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der Server mit dem IP 1.2.3.3 muss dann keinen gültigen PTR-Record mehr besitzen und wird trotzdem akzeptiert. Die without_ptr-Datei muss nach jeder Änderung in eine Datenbankdatei umgewandelt und Postfix neu geladen werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;postmap /etc/postfix/without_ptr
systemctl reload postfix
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Im Moment reicht es aus, einfach nur eine leere Datenbankdatei zu generieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;postmap /etc/postfix/without_ptr
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Datei &lt;code&gt;postscreen_access&lt;/code&gt; kann Ausnahme-IP-Adressen enthalten, die nicht von Postscreen überprüft werden sollen. Der Inhalt könnte beispielsweise so aussehen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.2.3.3 permit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ein Server mit der IP-Adresse &amp;ldquo;1.2.3.3&amp;rdquo; wird dann nicht mehr von Postscreen kontrolliert. Hängt man statt des &amp;ldquo;permit&amp;rdquo; ein &amp;ldquo;reject&amp;rdquo; an, wird der Server mit der jeweiligen IP-Adresse auf jeden Fall von Postscreen blockiert.&lt;/p&gt;
&lt;p&gt;Zum Schluss wird einmal&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;newaliases
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ausgeführt, um die Alias-Datei &lt;code&gt;/etc/aliases.db&lt;/code&gt; zu generieren, die Postfix standardmäßig erwartet.&lt;/p&gt;
&lt;h2 id="rspamd-1"&gt;Rspamd&lt;/h2&gt;
&lt;p&gt;Da die Rspamd-Pakete für Debian nicht besonders aktuell sind, nutzen wir an dieser Stelle das Debian-Repository des Rspamd-Projekts:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install -y lsb-release wget
wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add -
echo &amp;quot;deb http://rspamd.com/apt-stable/ $(lsb_release -c -s) main&amp;quot; &amp;gt; /etc/apt/sources.list.d/rspamd.list
echo &amp;quot;deb-src http://rspamd.com/apt-stable/ $(lsb_release -c -s) main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/rspamd.list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Paketquellen aktualisieren und Rspamd installieren&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt update
apt install rspamd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rspamd stoppen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl stop rspamd
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="grundkonfiguration"&gt;Grundkonfiguration&lt;/h3&gt;
&lt;p&gt;Die Konfiguration von Rspamd wird im Verzeichnis &lt;code&gt;/etc/rspamd/local.d/&lt;/code&gt; abgelegt. Die folgenden Konfigurationsdateien werden darin erstellt:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/rspamd/local.d/options.inc&lt;/code&gt;: Netzeinstellungen. Definition des lokalen Netzes und des zu nutzenden DNS-Resolvers.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;local_addrs = &amp;quot;127.0.0.0/8, ::1&amp;quot;;
dns {
nameserver = [&amp;quot;127.0.0.1:53:10&amp;quot;];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/etc/rspamd/local.d/worker-normal.inc&lt;/code&gt;: Einstellungen für den normalen Rspamd Worker.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bind_socket = &amp;quot;localhost:11333&amp;quot;;
### Anzahl der zu nutzenden Worker. Standard: Anzahl der virtuellen Prozessorkerne.
# count = 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/etc/rspamd/local.d/worker-controller.inc&lt;/code&gt;: Einstellung des Worker controllers: Passwort für den Zugriff via Weboberfläche, z.B.:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;password = &amp;quot;$2$qecacwgrz13owkag4gqcy5y7yeqh7yh4$y6i6gn5q3538tzsn19ojchuudoauw3rzdj1z74h5us4gd3jj5e8y&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der Passworthash (&amp;quot;$2$ &amp;hellip;&amp;quot;) wird via&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rspamadm pw
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(&amp;hellip;dann gewünschtes Passwort eingeben)&lt;/em&gt; generiert und &lt;strong&gt;muss in der Konfigurationsdatei angepasst werden!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/rspamd/local.d/worker-proxy.inc&lt;/code&gt;: Worker Proxy (Milter-Modul für Postfix)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bind_socket = &amp;quot;localhost:11332&amp;quot;;
milter = yes;
timeout = 120s;
upstream &amp;quot;local&amp;quot; {
default = yes;
self_scan = yes;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/etc/rspamd/local.d/logging.inc&lt;/code&gt;: Error logging&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type = &amp;quot;file&amp;quot;;
filename = &amp;quot;/var/log/rspamd/rspamd.log&amp;quot;;
level = &amp;quot;error&amp;quot;;
debug_modules = [];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Milter Headers &lt;code&gt;/etc/rspamd/local.d/milter_headers.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;use = [&amp;quot;x-spamd-bar&amp;quot;, &amp;quot;x-spam-level&amp;quot;, &amp;quot;authentication-results&amp;quot;];
authenticated_headers = [&amp;quot;authentication-results&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Redis für den Bayes&amp;rsquo;schen Filter nutzen: &lt;code&gt;/etc/rspamd/local.d/classifier-bayes.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;backend = &amp;quot;redis&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="dkim-signing"&gt;DKIM Signing&lt;/h3&gt;
&lt;p&gt;Rspamd übernimmt auch das Signieren von ausgehenden E-Mails. Damit signiert werden kann, muss zunächst ein Signing Key generiert werden. Der Parameter &lt;code&gt;-s 2017&lt;/code&gt; gibt den sogenannten Selektor an - einen Namen für den Key (hier das Erstellungsjahr).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /var/lib/rspamd/dkim/
rspamadm dkim_keygen -b 2048 -s 2017 -k /var/lib/rspamd/dkim/2017.key &amp;gt; /var/lib/rspamd/dkim/2017.txt
chown -R _rspamd:_rspamd /var/lib/rspamd/dkim
chmod 440 /var/lib/rspamd/dkim/*
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Zum Signing Key (&lt;code&gt;/var/lib/rspamd/dkim/2017.key&lt;/code&gt;) gehört ein dazu passender Public Key, welcher in Form eines vorbereiteten DNS-Records in der Datei &lt;code&gt;/var/lib/rspamd/dkim/2017.txt&lt;/code&gt; liegt.&lt;/p&gt;
&lt;p&gt;DKIM Record ausgeben lassen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /var/lib/rspamd/dkim/2017.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Ausgabe sieht z.B. so aus:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;2017._domainkey IN TXT ( &amp;#34;v=DKIM1; k=rsa; &amp;#34;
&amp;#34;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2/al5HqXUpe+HUazCr6t9lv2VOZLR369PPB4t+dgljZQvgUsIKoYzfS/w9NagS32xZYxi1dtlDWuRfTU/ahHO2MYzE0zHE4lMfwb6VkNCG+pM6bAkCwc5cFvyRygwxAPEiHAtmtU5b0i9LY25Z/ZWgyBxEWZ0Wf+hLjYHvnvMqewPsduUqKVjDOdUqeBb1VAu3WFErOAGVUYfKqFX&amp;#34;
&amp;#34;+yfz36Alb7/OMAort8A5Vo5t5k0vxTHzkYYg5KB6tLS8jngrNucGjyNL5+k0ijPs3yT7WpTGL3U3SEa8cX8WvOO1fIpWQz4yyZJJ1Mm62+FskSc7BHjdiMHE64Id/UBDDVjxwIDAQAB&amp;#34;
) ;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Der Werte-Abschnitt des Records (beginnend mit &lt;code&gt;v=DKIM1&lt;/code&gt; bis zum Ende der Zeichenkolonne - hier &lt;code&gt;AQAB&lt;/code&gt;) muss in einen neuen DNS-Record gepflanzt werden. Dabei werden Zeilenumbrüche und Anführungsstriche entfernt. Je nach DNS-Hoster muss ein neuer Eintrag geringfügig anders formatiert werden. Ich habe den Schritt im Screenshot beispielhaft für den Hoster Core-Networks.de und meine Domain &amp;ldquo;security-enforced.de&amp;rdquo; (an Stelle von mysystems.tld) durchgeführt:&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://thomas-leister.de/mailserver-debian-stretch/images/dkim-core-networks.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;core-networks.de Screenshot mit DKIM Record&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Wichtig: Der Selektor &amp;ldquo;2017&amp;rdquo; wird im DNS-Record zusammen mit &amp;ldquo;._domainkey&amp;rdquo; als Name verwendet! Der DKIM-Record muss &lt;strong&gt;für jede verwendete Domain (domain2.tld, domain2.tld) im jeweiligen Zonefile erstellt werden!&lt;/strong&gt;&lt;/p&gt;
&lt;div class="tip"&gt;
Sollte der Record vom DNS-Hoster nicht akzeptiert werden, hilft es in einigen Fällen, die Schlüssellänge von 2048 Bit auf 1024 Bit zu reduzieren. Dazu das &lt;code&gt;rspamadm dkim_keygen&lt;/code&gt; Kommando nochmals mit &lt;code&gt;-b 1024&lt;/code&gt; statt mit &lt;code&gt;-b 2048&lt;/code&gt; ausführen.
&lt;/div&gt;
&lt;p&gt;Der erzeugte DKIM-Key und der verwendete Selektor werden in der Konfigurationsdatei &lt;code&gt;/etc/rspamd/local.d/dkim_signing.conf&lt;/code&gt; angegeben:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;path = &amp;quot;/var/lib/rspamd/dkim/$selector.key&amp;quot;;
selector = &amp;quot;2017&amp;quot;;
### Enable DKIM signing for alias sender addresses
allow_username_mismatch = true;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Diese Konfiguration wird in die Datei &lt;code&gt;/etc/rspamd/local.d/arc.conf&lt;/code&gt; kopiert, sodass das &lt;a href="https://rspamd.com/doc/modules/arc.html"&gt;ARC-Modul&lt;/a&gt; korrekt arbeiten kann. Es greift auf dieselben Einstellungen zurück:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp -R /etc/rspamd/local.d/dkim_signing.conf /etc/rspamd/local.d/arc.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="redis-als-cache-und-key-value-store-für-rspamd-module"&gt;Redis als Cache und Key-Value Store für Rspamd-Module&lt;/h2&gt;
&lt;p&gt;Rspamd verwendet Redis als Cache. Die Installation und Einrichtung ist trivial:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install redis-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/etc/rspamd/local.d/redis.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;servers = &amp;quot;127.0.0.1&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="rspamd-starten"&gt;Rspamd starten&lt;/h2&gt;
&lt;p&gt;Rspamd kann nun gestartet werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl start rspamd
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="nginx-proxy-für-rspamd-weboberfläche-optional"&gt;Nginx Proxy für Rspamd Weboberfläche (optional)&lt;/h2&gt;
&lt;p&gt;Für den bequemen und sicheren Zugriff auf die Rspamd-Weboberfläche kann dieser ein Nginx HTTP-Proxy vorgeschaltet werden. Nginx kümmert sich dann um die Absicherung der Verbindung via HTTPS. Wer nur selten auf die Rspamd-Weboberfläche zugreift, kann auf diesen Schritt verzichten und stattdessen auch über einen SSH-Tunnel auf das Interface zugreifen (&lt;a href="https://thomas-leister.de/mailserver-debian-stretch/#ssh-tunnel"&gt;siehe unten&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Installation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install nginx
nano /etc/nginx/sites-available/mail.mysystems.tld
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inhalt der neuen Konfigurationsdatei &lt;code&gt;/etc/nginx/sites-available/mail.mysystems.tld&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/letsencrypt/live/mail.mysystems.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mail.mysystems.tld/privkey.pem;
server_name mail.mysystems.tld;
root /var/www/default;
if ($ssl_protocol = &amp;quot;&amp;quot;) {
return 301 https://$server_name$request_uri;
}
location /rspamd/ {
proxy_pass http://localhost:11334/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anzupassen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ssl_certificate: Pfad zu Zertifikat&lt;/li&gt;
&lt;li&gt;ssl_certificate_key: Pfad zu Zertifikat&lt;/li&gt;
&lt;li&gt;server_name&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seite aktivieren, Konfiguration testen und Nginx neu laden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ln -s /etc/nginx/sites-available/mail.mysystems.tld /etc/nginx/sites-enabled/mail.mysystems.tld
nginx -t
systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="apache-proxy-für-rspamd-weboberfläche-optional-nicht-überprüft"&gt;Apache Proxy für Rspamd Weboberfläche (optional, nicht überprüft!)&lt;/h2&gt;
&lt;p&gt;Apache2 installieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Proxy-Modul aktivieren und neu starten:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a2enmod proxy
a2enmod proxy_http
systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Konfiguration &lt;code&gt;/etc/apache2/sites-available/mailserver.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
ServerName mail.mysystems.tld
Redirect / https://mail.mysystems.tld/
&amp;lt;/VirtualHost&amp;gt;
&amp;lt;VirtualHost *:443&amp;gt;
ServerName mail.mysystems.tld
ServerPath /
DocumentRoot /var/www
DirectoryIndex index.html
SSLEngine on
SSLHonorCipherOrder on
SSLCertificateFile /etc/letsencrypt/live/mail.mysystems.tld/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mail.mysystems.tld/privkey.pem
###
### Rspamd
###
RewriteEngine on
RewriteRule ^/rspamd$ /rspamd/ [R]
ProxyPreserveHost On
ProxyPass /rspamd http://localhost:11334/
ProxyPassReverse /rspamd http://localhost:11334/
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Neue Konfiguration aktivieren und Apache neu laden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a2ensite mailserver
systemctl reload apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="weboberfläche-aufrufen"&gt;Weboberfläche aufrufen&lt;/h2&gt;
&lt;p&gt;Unter &lt;a href="https://mail.mysystems.tld/rspamd/"&gt;https://mail.mysystems.tld/rspamd/&lt;/a&gt; ist die Rspamd-Weboberfläche nun erreichbar. Als Passwort wird das weiter oben erzeugte Passwort für die Weboberfläche verwendet.&lt;/p&gt;
&lt;div class="tip"&gt;
Rspamd gibt im Log und auf der Weboberfläche Fehler aus: &lt;code&gt;&amp;quot;/var/lib/rspamd/ [...]: map file is unavailable for reading&amp;quot;&lt;/code&gt;. Dabei handelt es sich im einen Bug, der ignoriert werden kann. (Siehe auch: &lt;a href="https://github.com/vstakhov/rspamd/issues/1474"&gt;https://github.com/vstakhov/rspamd/issues/1474&lt;/a&gt;)
&lt;/div&gt;
&lt;h2 id="via-ssh-tunnel-mit-der-weboberfläche-verbinden-alternative"&gt;Via SSH-Tunnel mit der Weboberfläche verbinden (Alternative)&lt;/h2&gt;
&lt;p&gt;Statt über Nginx kann man auch mithilfe eines SSH-Tunnels eine sichere Verbindung zur Rspamd-Weboberfläche aufbauen. Dazu benötigt man auf dem lokalen Rechner allerdings einen SSH-Client. Der SSH-Befehl&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -L 8080:localhost:11334 benutzer@mail.mysystems.tld -N
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;verknüpft den Port des Webinterfaces (11334) mit Port 8080 des lokalen Systems. Im lokalen Webbrowser kann die Oberfläche nun unter http://localhost:8080 erreicht werden. Mit STRG+C wird die Verbindung wieder getrennt.&lt;/p&gt;
&lt;h2 id="rspamd-mit-bestehenden-spam-e-mails-trainieren-optional"&gt;Rspamd mit bestehenden Spam-E-Mails trainieren (optional)&lt;/h2&gt;
&lt;p&gt;Wer einige Mails im Maildir-Format (jede E-Mail ist eine Datei) vorliegen hat, kann Rspamd mit über das rspamc-Werkzeug trainieren. Dabei ist es ist vorteilhaft, nicht nur Spammail-Beispiele zu trainieren, sondern auch Beispiele für erwünschte E-Mails. Im folgenden Beispiel wurde das Mailbox-Verzeichnis eines älteren Mailservers importiert:&lt;/p&gt;
&lt;p&gt;E-Mails in einem Verzeichnis als &lt;strong&gt;Spam&lt;/strong&gt; antrainieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find ./oldserver/var/vmail/mailboxes/*/*/mail/Spam/cur -type f -exec /usr/bin/rspamc learn_spam {} \;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;E-Mails in einem Verzeichnis als &lt;strong&gt;Ham&lt;/strong&gt; (harmlos) antrainieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find ./oldserver/var/vmail/mailboxes/*/*/mail/cur -type f -exec /usr/bin/rspamc learn_ham {} \;
find ./oldserver/var/vmail/mailboxes/*/*/mail/Sent/cur -type f -exec /usr/bin/rspamc learn_ham {} \;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auf der Rspamd-Weboberfläche wird nach dem Training eine entsprechend höhere Anzahl an gelernten E-Mails angezeigt.&lt;/p&gt;
&lt;h2 id="domains-accounts-aliase-und-tls-policies-in-datenbank-definieren"&gt;Domains, Accounts, Aliase und TLS-Policies in Datenbank definieren&lt;/h2&gt;
&lt;p&gt;Bevor der Mailserver sinnvoll genutzt werden kann, müssen noch Domains und Benutzer im der MySQL-Datenbank registriert werden. Loggt euch wieder auf der MySQL-Kommandozeile ein:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;… und wechselt in die vmail-Datenbank:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;use vmail;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="neue-domain-anlegen"&gt;Neue Domain anlegen&lt;/h3&gt;
&lt;p&gt;Damit ein neuer Benutzeraccount oder ein neuer Alias angelegt werden kann, muss die zu nutzende Domain zuvor im Mailsystem bekannt gemacht werden. Postfix verarbeitet nur E-Mails an Domains, die in der &amp;ldquo;domains&amp;rdquo;-Tabelle eingetragen sind:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;insert into domains (domain) values ('mysystems.tld');
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="neuen-e-mail-account-anlegen"&gt;Neuen E-Mail-Account anlegen&lt;/h3&gt;
&lt;p&gt;Wenn die Benutzerdomain in der Domain-Tabelle angelegt ist, kann ein neuer Benutzeraccount für den Mailserver erstellt werden. Bevor das passende SQL-Kommando eingegeben und abgeschickt wird, wird jedoch zu nächst ein Passwort-Hash des gewünschten Passworts für den Account erzeugt. Mit&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;doveadm pw -s SHA512-CRYPT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;(in der Bash Shell! - Nicht in der MySQL Shell!)&lt;/strong&gt; kann ein solcher Hash erzeugt werden. Beispiel für einen ausgegebenen Hash:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{SHA512-CRYPT}$6$wHyJsS.doo39xoCu$KI1N4l.Vd0ZWYj5BYLI8AdK7ACwAZaM18gSy7Bko0dG2Hvli4.KfAmLk2ztFVP.R4T7oqiu7clKBehCTc4GGw0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dieser Hash ist für jedes Passwort einzigartig und ändert sich sogar bei jeder Generierung. Legt den Hash am besten gleich in eurer Zwischenablage oder einem Textdokument ab - ihr benötigt ihn gleich!&lt;/p&gt;
&lt;p&gt;Das SQL-Kommando zum Erzeugen eines neuen Accounts lautet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;insert into accounts (username, domain, password, quota, enabled, sendonly) values ('user1', 'mysystems.tld', '{SHA512-CRYPT}$6$wHyJsS[...]', 2048, true, false);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In das &amp;ldquo;Password&amp;rdquo;-Feld wird der Hash vollständig eingetragen (hier: gekürzt).&lt;/p&gt;
&lt;h3 id="neuen-alias-anlegen"&gt;Neuen Alias anlegen&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;insert into aliases (source_username, source_domain, destination_username, destination_domain, enabled) values ('alias', 'mysystems.tld', 'user1', 'mysystems.tld', true);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;hellip; legt einen Alias für den Benutzer &amp;ldquo;&lt;a href="mailto:user1@mysystems.tld"&gt;user1@mysystems.tld&lt;/a&gt;&amp;rdquo; an. E-Mails an &amp;ldquo;&lt;a href="mailto:alias@mysystems.tld"&gt;alias@mysystems.tld&lt;/a&gt;&amp;rdquo; werden dann an die Mailbox dieses Users zugestellt.&lt;/p&gt;
&lt;p&gt;Als Zieladressen können auch E-Mail-Konten auf fremden Servern angegeben werden. Postfix leitet diese E-Mails dann weiter. Dabei kann es allerdings zu Problemen mit SPF-Records kommen – schließlich schickt Postfix unter bestimmten Umständen E-Mails unter fremden Domains, für die er laut SPF-Record nicht zuständig ist. SRS (Sender Rewriting Scheme) ist eine Lösung für dieses Problem. Von Erweiterungen, die schwerwiegende Design-Fehler einer Technik wie SPF korrigieren, halte ich allerdings nicht besonders viel, sodass ich euch empfehle, den SPF-Record (wie oben) auf einem &amp;ldquo;?all&amp;rdquo; gestellt zu lassen und auf Weiterleitungen zu fremden Servern möglichst zu verzichten. Aliase von lokalen Adressen auf andere lokale Adressen sind kein Problem.&lt;/p&gt;
&lt;p&gt;Wenn ein E-Mail-Verteiler eingerichtet werden soll, werden mehrere Datensätze mit derselben Quelladresse eingerichtet, also z.B. so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;team@domain.tld =&amp;gt; user1@domain.tld
team@domain.tld =&amp;gt; user2@domain.tld
team@domain.tld =&amp;gt; user3@domain.tld
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="neue-tls-policy-anlegen-optional"&gt;Neue TLS-Policy anlegen (optional)&lt;/h3&gt;
&lt;p&gt;Mithilfe der TLS Policy-Tabelle kann festgelegt werden, mit welchen Sicherheitsfeatures mit den Mailservern einer bestimmten Domain kommuniziert werden soll. Wenn für die Domain &amp;ldquo;thomas-leister.de&amp;rdquo; beispielsweise &amp;ldquo;dane-only&amp;rdquo; in &amp;ldquo;policy&amp;rdquo; festgelegt wird, wird die Verbindung zu Mailservern dieser Domain nur noch gültig sein, wenn sie DANE-authentifiziert und verschlüsselt ist. Mögliche Policies sind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;none&lt;/strong&gt;: Keine Verschlüsselung nutzen, auch wenn der andere Mailserver das unterstützt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;may&lt;/strong&gt;: Verschlüsseln, wenn der andere Server dies unterstützt, aber keine Zertifikatsprüfung (self-signed Zertifikate werden akzeptiert).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;encrypt&lt;/strong&gt;: Zwingend Verschlüsseln, allerdings keine Zertifikatsprüfung (self-signed Zertifikate werden akzeptiert).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dane&lt;/strong&gt;: Wenn gültige TLSA-Records gefunden werden, wird zwingend verschlüsselt und das Zertifikat mittels DANE verifiziert. Falls ungültige TLSA-Records gefunden werden, wird auf &amp;ldquo;encrypt&amp;rdquo; zurückgegriffen. Falls gar keine TLSA-Records gefunden werden, wird &amp;ldquo;may&amp;rdquo; genutzt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dane-only&lt;/strong&gt;: Nur verschlüsselte Verbindungen. Gültige TLSA-Records für den Hostnamen müssen existieren (DANE)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;verify&lt;/strong&gt;: Nur verschlüsselte Verbindungen + Prüfung der CA. Der Hostname aus dem MX DNS-Record muss im Zertifikat enthalten sein. (Basiert auf Vertrauen in korrekte DNS-Daten)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;secure&lt;/strong&gt;: Nur verschlüsselte Verbindungen + Prüfung der CA. Der andere Mailserver muss (standardmäßig) einen Hostnamen haben, der &amp;ldquo;.domain.tld&amp;rdquo; oder nur &amp;ldquo;domain.tld&amp;rdquo; entspricht. Dieser Hostname muss im Zertifikat enthalten sein. Auf das DNS wird nicht zurückgegriffen (Sicherheitsvorteil gegenüber &amp;ldquo;verify).
Beispiel: Eine E-Mail an &lt;a href="mailto:user@web.de"&gt;user@web.de&lt;/a&gt; soll gesendet werden. Der MX-Mailserver von Web.de dürfte dann nur den Hostnamen &amp;ldquo;web.de&amp;rdquo; oder eine Subdomain davon als Hostnamen haben, z.B. mx.web.de. Eine Verbindung zu mx.web.net wäre nicht zulässig.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für Domains der großen Anbieter wie gmx.de, web.de und der Telekom kann man &amp;ldquo;secure&amp;rdquo; wählen. Bei Posteo und Mailbox.org sogar &amp;ldquo;dane-only&amp;rdquo;. Für alle Provider, die keine gültigen TLS-Zertifikate einsetzen, kann &amp;ldquo;encrypt&amp;rdquo; gewählt werden. Standardeinstellung für alle anderen Mailserver ist &amp;ldquo;dane&amp;rdquo; (siehe main.cf der Postfix Config).&lt;/p&gt;
&lt;p&gt;Das Feld &amp;ldquo;params&amp;rdquo; wird mit zusätzlichen Infos gefüllt, wenn sie für einen Policy-Typ erforderlich sind, z.B. für einen &amp;ldquo;secure&amp;rdquo; Eintrag zu GMX:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;insert into tlspolicies (domain, policy, params) values ('gmx.de', 'secure', 'match=.gmx.net');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Standardmäßig überprüft Postfix bei &amp;ldquo;secure&amp;rdquo; – wie oben bereits erwähnt – ob die Empfängerdomain (gmx.de) im Zertifikat des Zielservers vorhanden ist. Bei GMX (und vielen anderen großen Anbietern) ist das allerdings nicht der Fall: Die Mailserver-Zertifikate von GMX sind nur für gmx.net + Subdomains gültig. Ließe man den Datenbank-Eintrag für GMX ohne weitere Einstellungen auf &amp;ldquo;secure&amp;rdquo; stehen, könnten an GMX keine Mails mehr übermittelt werden. Deshalb ist es wichtig, für GMX festzulegen, dass im Zertifikat nicht nach &amp;ldquo;gmx.de&amp;rdquo; sondern nach &amp;ldquo;gmx.net&amp;rdquo; gesucht werden soll. Das können wir mithilfe des Felds &amp;ldquo;params&amp;rdquo; und der &amp;ldquo;match=…&amp;rdquo; Zeichenkette tun. Wenn nach mehreren Domains gesucht werden soll, können auch mehrere angegeben werden, z.B. so: &amp;ldquo;match=.gmx.net:.gmx.ch&amp;rdquo;. Die zusätzlichen Angaben in &amp;ldquo;params&amp;rdquo; sind allerdings nicht für jeden Mailprovider notwendig. GMX ist eine Ausnahme – genauso wie z.B. Yahoo. Ob ihr in &amp;ldquo;params&amp;rdquo; einen &amp;ldquo;match&amp;rdquo;-String angeben müsst, könnt ihr z.B. über &lt;a href="https://de.ssl-tools.net/"&gt;https://de.ssl-tools.net/&lt;/a&gt; herausfinden. Wenn die 2-nd-Level-Domain des Mailservers von der Domain der Mailadressen abweicht, muss ein passender match-String angegeben werden.&lt;/p&gt;
&lt;p&gt;Andere Einstellungen wie &amp;ldquo;dane-only&amp;rdquo; erfordern keine zusätzlichen Angaben in &amp;ldquo;params&amp;rdquo;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;insert into tlspolicies (domain, policy) values ('mailbox.org', 'dane-only');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In diesem Fall wird mit den Mailservern von mailbox.org nur noch DANE-gesichert und verschlüsselt kommuniziert.&lt;/p&gt;
&lt;p&gt;Die MySQL-Kommandozeile kann mit einem &lt;code&gt;quit;&lt;/code&gt; wieder verlassen werden.&lt;/p&gt;
&lt;h2 id="start-all-the-things"&gt;Start all the things!&lt;/h2&gt;
&lt;p&gt;Euer neuer Mailserver ist jetzt fertig konfiguriert. Zeit für einen ersten Start!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl start dovecot
systemctl start postfix
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="warning"&gt;
&lt;p&gt;Wegen des Bugs &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877992"&gt;#877992&lt;/a&gt; startet Postfix nach einem Reboot nicht mehr. Abhilfe schafft folgendes Kommando:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl enable postfix@-
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(beachte &amp;ldquo;-&amp;rdquo; am Ende!)&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Kontrolliert am besten gleich die Logfiles nach auffälligen Fehlern. Ich empfehle das &amp;ldquo;tail&amp;rdquo; Tool in einer separaten Terminal-Sitzung. Neue Log-Einträge erscheinen damit sofort auf dem Bildschirm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tail -f /var/log/syslog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;bzw.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tail -f /var/log/mail.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wenn ihr hier Fehler entdeckt, seht nach, ob ihr alle erforderlichen Änderungen an den Konfigurationsdateien durchgeführt habt (oder ob sich noch beispielhafte Hashes oder Beispieldomains darin befinden).&lt;/p&gt;
&lt;h2 id="eine-verbindung-zum-mailserver-herstellen"&gt;Eine Verbindung zum Mailserver herstellen&lt;/h2&gt;
&lt;p&gt;Eine Verbindung könnt ihr über jeden IMAP-fähigen E-Mail-Client und den folgenden Verbindungsparametern herstellen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IMAP-Server: mail.mysystems.tld | Port: 143 | STARTTLS (dieser Server gilt auch für domain2 und domain3!)&lt;/li&gt;
&lt;li&gt;SMTP-Server: mail.mysystems.tld | Port: 587 | STARTTLS (dieser Server gilt auch für domain2 und domain3!)&lt;/li&gt;
&lt;li&gt;(optional Managesieve: mail.mysystems.tld | Port: 4190 | STARTTLS) (auch für domain2 und domain3!)&lt;/li&gt;
&lt;li&gt;Benutzername: Die &lt;strong&gt;vollständige&lt;/strong&gt; E-Mail-Adresse&lt;/li&gt;
&lt;li&gt;Passwort: Sollte bekannt sein ;-)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="tip"&gt;
Der erste Login kann einige Zeit in Anspruch nehmen!
&lt;/div&gt;
&lt;figure&gt;&lt;img src="https://thomas-leister.de/mailserver-debian-stretch/images/thunderbird-login-data.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Mailserver Logindaten für Thunderbird&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="spamfilter-testen"&gt;Spamfilter testen&lt;/h2&gt;
&lt;p&gt;Schickt einfach eine E-Mail mit dem Text&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;an einen Account eures neuen Mailservers. Die E-Mail sollte nicht ankommen und im Rspamd-Webinterface erscheint ein entsprechender rot markierter Eintrag in der History.&lt;/p&gt;
&lt;h2 id="das-wars-auch-schon-"&gt;Das war&amp;rsquo;s auch schon! &amp;hellip;&lt;/h2&gt;
&lt;hr&gt;
&lt;h2 id="hat-dir-diese-anleitung-geholfen"&gt;Hat dir diese Anleitung geholfen?&lt;/h2&gt;
&lt;div style="border:solid 2px rgb(0, 147, 255); padding: 15px; border-radius: 3px; background-color: #f9f9f9; text-align:center;"&gt;
&lt;p style="color: rgb(0, 120, 209);"&gt;&lt;b&gt;Wenn ich dir mit dieser Anleitung helfen konnte, deinen Mailserver aufzusetzen,&lt;/br&gt; ist dir das vielleicht ein paar Euro wert.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Wie du dir sicherlich vorstellen kannst, war es eine Menge Arbeit, diese Anleitung zu erproben und zu formulieren. Daher freue ich mich natürlich riesig über eine Motivationsstütze und finanzielle Hilfe, um Testserver und -Umgebungen bezahlen zu können, oder mir nach getaner Arbeit ein kühles Bier zu leisten.&lt;/p&gt;
&lt;p&gt;Wie du mir etwas zukommen lassen kannst, erfährst du hier: &lt;a href="https://thomas-leister.de/unterstuetzen/"&gt;Unterstützen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Herzlichen Dank! :-)&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="fragen-und-antworten"&gt;Fragen und Antworten&lt;/h2&gt;
&lt;h3 id="danke-für-die-anleitung-kann-ich-mich-irgendwie-revanchieren"&gt;&amp;ldquo;Danke für die Anleitung. Kann ich mich irgendwie revanchieren?&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Über ein &amp;ldquo;Dankeschön&amp;rdquo; via E-Mail freue ich mich, aber z.B. auch über eine kleine Finanzspritze für meinen Blog via Bitcoin, PayPal oder auf anderem Wege. Damit kann ich beispielsweise meine Server bezahlen. Vielleicht magst du diesen Beitrag auch weiterempfehlen? Auch dafür bin ich dankbar :-) =&amp;gt; &lt;a href="https://thomas-leister.de/unterstuetzung/"&gt;Blog Unterstützen&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="wieso-noch-eine-mailserver-anleitung-es-gibt-doch-schon-so-viele"&gt;&amp;ldquo;Wieso noch eine Mailserver-Anleitung? Es gibt doch schon so viele!&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Tatsächlich kann man den Eindruck haben, zu jedem Linux-Blog gehöre mittlerweile ein E-Mail Tutorial. Natürlich habe ich darüber nachgedacht, ob es überhaupt sinnvoll ist, den Aufwand zu betreiben, und die tausendste Anleitung dazu zu schreiben. Aber natürlich habe ich gute Gründe: Ich bin während meiner ersten Schritte zum eigenen Mailserver fast verzweifelt: Es gibt zwar Unmengen an Mailserver-Anleitungen im Netz, und trotzdem gibt es zu viele How-Tos, die nie wirklich getestet wurden oder schon veraltet sind. Diese Anleitung wurde mehrmals auf einem frisch installierten Debian Server getestet. Ich kann also bis zu einem gewissen Grad garantieren, dass euer Mailserver funktioniert, wenn ihr die Anleitung exakt durcharbeitet. Einige Artikel zum Thema finde ich auch nicht ausführlich genug. Wie Eingangs schon erklärt, geht es mir bei diesem Beitrag auch darum, ein wenig zu erklären, was hier eigentlich passiert. Und nicht zuletzt: Es gibt diese Anleitung, weil ich der Meinung bin, dass es nicht genug geben kann. Jeder Autor erklärt etwas anders, jeder stellt ein leicht verändertes Setup vor. Ich hatte Lust, mein eigenes Setup in diesem Beitrag zu erklären, weil es gut funktioniert.&lt;/p&gt;
&lt;h3 id="darf-ich-deine-anleitung-übernehmen"&gt;&amp;ldquo;Darf ich deine Anleitung übernehmen?&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Nein. Du kannst dir sicherlich vorstellen, dass hinter meiner Anleitung viel Mühe und Arbeit steckt. Ich stelle sie nicht frei zur Verfügung und bitte darum, meinen Text nicht ohne ausdrückliche Zustimmung zu re-publizieren (auch nicht in privaten, aber öffentlich zugänglichen Blogs!). Also ein klares &amp;ldquo;Nein&amp;rdquo; zu Copy &amp;amp; Paste + Wiederveröffentlichung. Private, nicht-öffentliche Kopien oder Kopien für den Firmen-internen Gebrauch sind natürlich erlaubt. Es geht mir auch darum, diesen Beitrag nicht auf irgendeinem fremden Blog wiederzufinden, der womöglich sogar noch Geld mit fremden Content verdient. Verlinken ist natürlich absolut erlaubt und ausdrücklich erwünscht ;-)&lt;/p&gt;
&lt;h3 id="wieso-veröffentlichst-du-deine-anleitung-auf-deinem-blog-und-nicht-in-einem-wiki"&gt;&amp;ldquo;Wieso veröffentlichst du deine Anleitung auf deinem Blog und nicht in einem Wiki?&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Weil ich hier die volle Kontrolle habe. Was hier steht, ist in sich konsistent und kein Flickenteppich. In den gängigen Wikis darf dieser Beitrag natürlich gerne ergänzend verlinkt werden.&lt;/p&gt;
&lt;h3 id="gibt-es-für-dieses-neue-mailserver-setup-schon-einen-web-client-zur-verwaltung"&gt;&amp;ldquo;Gibt es für dieses neue Mailserver-Setup schon einen Web-Client zur Verwaltung?&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Aktuell ist &lt;a href="https://github.com/ohartl/webmum"&gt;WebMUM&lt;/a&gt; nicht mit dieser Anleitung kompatibel. Solltet ihr das ändern wollen – nur zu. Der Code ist auf GitHub unter der MIT Lizenz frei verfügbar. Ansonsten steht es natürlich jedem frei, selbst ein solches Werkzeug zu entwickeln und vielleicht sogar frei verfügbar zu machen. Im Wesentlichen müssen nur Datensätze erstellt, bearbeitet und gelöscht werden. Das kann man z.B. auch als PHP-Anfänger gut umsetzen.&lt;/p&gt;
&lt;p&gt;Andreas Bresch hat übrigens schon ein Webinterface zu dieser Anleitung entwickelt: &lt;a href="https://github.com/Andreas-Bresch/vmailManage/"&gt;https://github.com/Andreas-Bresch/vmailManage/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="wie-kann-ich-mit-diesem-setup-catch-all-adressen-realisieren"&gt;Wie kann ich mit diesem Setup Catch-All Adressen realisieren?&lt;/h3&gt;
&lt;p&gt;Dazu sind ein paar Änderungen notwendig. Ich habe mich mit der Thematik noch nicht selbst befasst, aber ein Leser hatte hiermit Erfolg:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;source_username in aliases Tabelle als nullable (= null bei catchall) konfigurieren. In der MySQL-Kommandozeile:&lt;/p&gt;
&lt;p&gt;alter table aliases modify source_username varchar(64) null;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Die Query in aliases.cf anpassen&lt;/p&gt;
&lt;p&gt;query = SELECT concat(destination_username, &amp;lsquo;@&amp;rsquo;, destination_domain) as destinations FROM aliases WHERE source_username =&amp;rsquo;%u&amp;rsquo; and source_domain =&amp;rsquo;%d&amp;rsquo; and enabled = true UNION ALL SELECT concat(destination_username, &amp;lsquo;@&amp;rsquo;, destination_domain) as destinations FROM aliases WHERE source_username is null and source_domain =&amp;rsquo;%d&amp;rsquo; and enabled = true AND not exists (SELECT id FROM aliases WHERE source_username =&amp;rsquo;%u&amp;rsquo; and source_domain =&amp;rsquo;%d&amp;rsquo; and enabled = true);&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Ich habe das &lt;em&gt;nicht getestet&lt;/em&gt;!&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="wieso-port-587-und-143-mit-starttls"&gt;&amp;ldquo;Wieso Port 587 und 143 mit STARTTLS?&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Postfix verwendet Port 587 für die Verbindung zu MUAs (Mail User Agents - &amp;ldquo;Mailprogramme&amp;rdquo;), weil Port 25 nur für den Transfer der E-Mails zwischen den Servern zuständig sein soll. Während auf Port 25 von jedem Sender E-Mails ohne Authentifizierung empfangen werden können, wird auf Port 587 eine vorherige Authentifizierung des Endnutzers erzwungen. Port 587 wird daher auch als &amp;ldquo;Submission&amp;rdquo;-Port bezeichnet und ist üblicherweise in Firewalls freigeschaltet (siehe auch: &lt;a href="https://tools.ietf.org/html/rfc6409"&gt;RFC 6409 Submission&lt;/a&gt;). Port 25 hingegen wird beispielsweise in Unternehmensfirewalls und von manchen DSL-Routern blockiert, um das Spam-Problem einzudämmen. Aus einem solchen Netz können dann nur noch E-Mails zum zuständigen Mailserver gesendet werden - nicht mehr an jeden beliebigen Mailserver direkt. Da 587 als &amp;ldquo;universeller&amp;rdquo; Port (mit und ohne TLS-Verschlüsselung) definiert wurde, wird hier STARTTLS eingesetzt. Der ehem. &amp;ldquo;nur-TLS&amp;rdquo;-Port 465 ist nicht mehr als Standard festgelegt!&lt;/p&gt;
&lt;p&gt;Für Dovecot verwende ich ebenfalls einen STARTTLS-Port. Dieser ist als Port 143 in &lt;a href="https://tools.ietf.org/html/rfc3501"&gt;RFC 3501&lt;/a&gt; definiert. Prinzipiell ließe sich zwar als &amp;ldquo;TLS only&amp;rdquo; Port der weiterhin spezifizierte &amp;ldquo;imaps&amp;rdquo;-Port 993 verwenden, aber aus Gründen der Einheitlichkeit (und weil auch mit STARTTLS Verschlüsselung erzwungen werden kann) habe ich mich für 143 entschieden.&lt;/p&gt;
&lt;p&gt;Kurz: Die Ports habe ich aus Abwägungen bezüglich der geltenden IANA-Standards und der Einheitlichkeit gewählt. Durch den Einsatz von STARTTLS entstehen (bei meiner Konfiguration) keine Nachteile.&lt;/p&gt;
&lt;h2 id="häufige-fehler"&gt;Häufige Fehler&lt;/h2&gt;
&lt;h3 id="fatal-no-sasl-authentication-mechanisms--sasl-connect-to-privateauth-failed-no-such-file-or-directory"&gt;&amp;ldquo;fatal: no SASL authentication mechanisms&amp;rdquo; / &amp;ldquo;SASL: Connect to private/auth failed: No such file or directory&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Das Problem: Postfix kann Benutzer nicht authentifizieren, weil in /var/spool/postfix/private kein &amp;ldquo;auth&amp;rdquo; Socket verfügbar ist. Eigentlich sollte Dovecot diesen Socket bereitstellen. Der Fehler ist also bei Dovecot zu suchen – nicht bei Postfix. Leider hat die Erfahrung gezeigt, dass ein Vertipper nicht zwingend in der Socket-Konfiguration&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;vorhanden sein muss. Es kommt immer wieder vor, dass der Fehler irgendwo anders in der Dovecot-Konfiguration liegt. Dovecot verschweigt einem dann den Fehler und erstellt den auth-Socket für Postfix nicht. Es lohnt sich in so einem Fall, noch einmal die ganze Dovecot-Konfiguration nach Fehlern abzusuchen.&lt;/p&gt;
&lt;h3 id="571-service-unavailable-client-1337-blocked-using-zenspamhausorg"&gt;&amp;ldquo;5.7.1 Service unavailable; client [1.3.3.7] blocked using zen.spamhaus.org&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Das Problem: Der Mailserver akzeptiert keine E-Mails vom Mailclient und gibt die oben genannte Fehlermeldung zurück.&lt;/p&gt;
&lt;p&gt;Das Problem lässt sich sehr einfach lösen, indem statt SMTP-Port 25 der Submission-Port 587 für den Mailversand im Mailclient konfiguriert wird. Auf Port 25 ist eine Blacklist aktiv, welche viele IP-Adressen z.B. aus DSL-Adressbereichen enthält. Diese Einschränkung gilt für Port 587 nicht. Mailclients sollten immer Port 587 für den Versand nutzen.&lt;/p&gt;
&lt;h3 id="mailclient-verbindet-sich-nicht-zum-server"&gt;Mailclient verbindet sich nicht zum Server&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Evtl. blockiert der Virenschutz die Verbindung?&lt;/li&gt;
&lt;li&gt;Blockiert die Server-Firewall die Verbindung von außen?&lt;/li&gt;
&lt;li&gt;Ist die richtige Serveradresse angegeben? (siehe Verbindungseinstellungen oben)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="changelog"&gt;Changelog&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;(Erstveröffentlichung am 04.08.2017)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;29.08.2017&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vmail MySQL user bekommt nur noch &amp;ldquo;select&amp;rdquo; Rechte statt allen Rechten&lt;/li&gt;
&lt;li&gt;Überarbeitete Version der master.cf (vor allem submission-Bereich und mehr Dienste laufen nun im chroot für mehr Sicherheit), &amp;ldquo;mua&amp;rdquo;-Ergänzung in der main.cf&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;31.08.2017&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hinzugefügt: dkim_signing.conf zu arc.conf kopieren, um Fehler &lt;code&gt;cannot load dkim key /var/lib/rspamd/arc/domain.tld.arc.key&lt;/code&gt; zu verhindern.&lt;/li&gt;
&lt;li&gt;Hinzugefügt: &lt;code&gt;non_smtpd_milters = inet:localhost:11332&lt;/code&gt;, sodass auch e-mails vom Mailserver selbst (lokal erstellt) DKIM signiert werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;25.10.2017&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nicht mehr gepflegtes Dovecot Antispam-Plugin ersetzt durch ImapSieve (Änderungen an Dovecot-Config und zusätzliche Sieve Scripts)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;27.10.2017&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ADSP records entfernt, stattdessen sollten DMARC-Records eingerichtet werden. Entsprechenden Abschnitt hinzugefügt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;06.11.2017&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workaround bzgl. &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877992"&gt;Bug #877992&lt;/a&gt; ergänzt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;12.11.2017&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hinweis zu &amp;ldquo;Mailman&amp;rdquo; Weboberfläche ergänzt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;05.12.2017&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apache2-Konfiguration für Rspamd Proxy hinzugefügt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;19.01.2018&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dovecot.conf: &lt;code&gt;ssl_dh_parameters_length&lt;/code&gt; und &lt;code&gt;ssl_protocols&lt;/code&gt; entfernt; werden nicht mehr benötigt&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/rspamd/local.d/classifier-bayes.conf&lt;/code&gt; hinzugefügt&lt;/li&gt;
&lt;li&gt;Kleinere Style-verbesserungen, Ergänzungen im Text&lt;/li&gt;
&lt;li&gt;Warning bzgl. Ubuntu Server hinzugefügt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;20.01.2018&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hinweis zu Henrik Halbritters &amp;ldquo;&lt;a href="https://github.com/Halbritter/MailAdmin/releases"&gt;MailAdmin&lt;/a&gt;&amp;rdquo; hinzugefügt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;22.01.2018&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dovecot PPA für Ubuntu Server hinzugefügt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;02.02.2018&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tls_preempt_cipherlist = yes&lt;/code&gt; zu Postfix main.cf hinzugefügt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;30.03.2018&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hinweis ergänzt: DKIM-Record muss für alle verwendeten Maildomains im jeweiligen Zonefile hinzugefügt werden!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;02.03.2019&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;learn-ham gefixt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;24.03.2025: Manitu DNSBL entfernt - wird nicht mehr gepflegt&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Meine Mastodon-Instanz metalhead.club ist online</title><link>https://thomas-leister.de/mastodon-server-metalhead.club/</link><pubDate>Tue, 04 Jul 2017 14:00:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/mastodon-server-metalhead.club/</guid><description>&lt;p&gt;Seit Freitag, dem 30. Juni ist &lt;a href="https://metalhead.club"&gt;metalhead.club&lt;/a&gt; online - meine eigene Mastodon-Instanz speziell (aber nicht nur!) für Metal-Fans. Zuvor hatte ich meinen Mastodon-Account auf dem Server von &lt;a href="https://social.tchncs.de/@milan/"&gt;Milan&lt;/a&gt;. Aus einem spontanen Impuls heraus habe ich mich entschieden, zur Dezentralisierung des Netzwerks beizutragen und ab sofort eine eigene Instanz zu betreiben.&lt;/p&gt;
&lt;p&gt;Wie erwartet war der Mastodon-Server schnell aufgesetzt: Domain bestellt, Mastodon via Docker installiert und konfiguriert, TLS-Zertifikate via Let&amp;rsquo;s Encrypt installiert, und der Server war fertig. Eine &lt;a href="https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Docker-Guide.md"&gt;offizielle Installationsanleitung&lt;/a&gt; dazu findet ihr in der &lt;a href="https://github.com/tootsuite/documentation"&gt;Mastodon-Dokumentation&lt;/a&gt; auf GitHub.&lt;/p&gt;
&lt;p&gt;Für das Docker-Setup habe ich mich entschieden, weil ich Mastodon zunächst auf einem Server laufen lassen will, den ich sowieso schon in Betrieb habe. Bevor überhaupt klar ist, ob meine Instanz von weiteren Usern genutzt wird, investiere ich nur ungern in einen weiteren VPS. Sollte die Instanz mit der Zeit größer und ressourcenhungriger werden, werde ich den Mastodon-Server auf einen dedizierten, virtuellen Server verlegen. Der große Hype ist allerdings vorüber, sodass ich nicht davon ausgehe, dass meine Instanz stark wächst.&lt;/p&gt;
&lt;p&gt;Wer Interesse an Mastodon hat oder seinen Account auf meine Instanz verlegen will, kann sich gerne einen Account auf &lt;a href="https://metalhead.club"&gt;metalhead.club&lt;/a&gt; anlegen. Außer einer E-Mail-Adresse müssen keine weiteren, persönlichen Daten angegeben werden.&lt;/p&gt;
&lt;p&gt;Mich findet ihr übrigens als &lt;strong&gt;&lt;a href="mailto:thomas@metalhead.club"&gt;thomas@metalhead.club&lt;/a&gt;&lt;/strong&gt; auf Mastodon und GNUSocial.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://thomas-leister.de/images/2017/07/04/mastodon-screenshot.png" alt="Mastodon Screenshot"&gt;&lt;/p&gt;</description></item><item><title>Test: Cloudserver-Hoster FarnoX.de</title><link>https://thomas-leister.de/farnox-vserver-hoster/</link><pubDate>Wed, 26 Apr 2017 12:34:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/farnox-vserver-hoster/</guid><description>&lt;p&gt;Vor kurzem wurde ich via E-Mail auf den &lt;a href="https://www.farnox.de"&gt;Serverhoster FarnoX.de&lt;/a&gt; aufmerksam gemacht. Aus eigenem Interesse habe ich ihn mir einmal genauer angesehen und einige Tests auf einem zur Verfügung gestellten Testserver durchgeführt. Kann sich der Hoster gegenüber der Konkurrenz behaupten?&lt;/p&gt;
&lt;div class="tip"&gt;
Der Beitrag bildet nur den Stand vom 26. April 2017 ab und ist nicht zwingend auf das aktuelle Datum übertragbar! So kann sich z.B. die Serverleistung inzwischen geändert haben.
&lt;/div&gt;
&lt;h2 id="leistung"&gt;Leistung&lt;/h2&gt;
&lt;p&gt;FarnoX.de bietet jedem Interessenten 7 Tage lang einen kostenlosen Testserver an. Mein Server hatte folgende Konfiguration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 vCore&lt;/li&gt;
&lt;li&gt;512 MB RAM&lt;/li&gt;
&lt;li&gt;10 GB SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für den Benchmark kam die &lt;a href="https://www.phoronix-test-suite.com/"&gt;Phoronix Test Suite&lt;/a&gt; in Version 7.0.1 zum Einsatz.&lt;/p&gt;
&lt;h3 id="cpu"&gt;CPU&lt;/h3&gt;
&lt;p&gt;Um einen einfachen Vergleich zu den Servern von &lt;a href="https://legacy.thomas-leister.de/mein-neuer-serverhoster-active-servers-de-erste-erfahrungen/"&gt;Active-servers.com&lt;/a&gt; und &lt;a href="https://thomas-leister.de/erfahrungen-mit-servercow/"&gt;Servercow&lt;/a&gt; machen zu können, habe ich mein sysbench-Kommando aus den jeweiligen Erfahrungsberichten auch auf dem FarnoX-Testserver ausgeführt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sysbench --test=cpu --num-threads=1 --cpu-max-prime=20000 run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die benötigte Zeit von &lt;strong&gt;16,4 Sekunden&lt;/strong&gt; war fast auf hundertstel Sekunden exakt reproduzierbar. Der gemessene Wert ist hervorragend: Bei Servercow erreicht man auf schnellen Hosts nur ca. 22 Sekunden, bei Active-Servers.com zum Zeitpunkt meines letzten Tests ca 25 Sekunden.&lt;/p&gt;
&lt;p&gt;Zusätzlich zum Sysbench-Test habe ich auf die bewährte Phoronix-Testsuite zurückgegriffen und einen GZIP-Benchmark (&lt;code&gt;pts/compress-gzip-1.1.0&lt;/code&gt;) ausgeführt, anhand dessen sich die CPU-Leistung ebenfalls bewerten lässt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Ergebnis:
(2 GB file gzip compression): 15.0 Sekunden
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="ram"&gt;RAM&lt;/h3&gt;
&lt;p&gt;In meinen letzten vServer Testberichten habe ich die RAM-Leistung nicht bewertet. Da die Phoronix-Testsuite aber auch einen RAM-Leistungstest (&lt;code&gt;pts/ramspeed 1.4.0&lt;/code&gt;) beinhaltet, habe ich diesen kurzerhand laufen lassen und bin auf folgende Ergebnisse gekommen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Type: Copy
Benchmark: Integer
Ergebnis: 12701.43 MB/s
Type: Add
Benchmark: Integer
Ergebnis: 14526.63 MB/s
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="ssd"&gt;SSD&lt;/h3&gt;
&lt;p&gt;Die Leistung des SSD-Speichers habe ich mit dem Phoronix-Benchmark &lt;code&gt;pts/fio-1.9.0&lt;/code&gt; getestet.&lt;/p&gt;
&lt;p&gt;Benchmark-Einstellungen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IO Engine: Libaio&lt;/li&gt;
&lt;li&gt;Buffered: No&lt;/li&gt;
&lt;li&gt;Direct: Yes&lt;/li&gt;
&lt;li&gt;Block Size: 4KB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ergebnisse:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Random Read: 690 MB/s | 172533 IOPS
Random Write: 655 MB/s | 163873 IOPS
Sequential Read: 847.91 MB/s | 211975 IOPS
Sequential Write: 797.91 MB/s | 199474 IOPS
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="netzanbindung"&gt;Netzanbindung&lt;/h3&gt;
&lt;p&gt;Die Leistung der Internetanbindung habe ich mithilfe des starken Tele2 Speedtest-FTP-Servers überprüft (Siehe auch Beitrag: &lt;a href="https://thomas-leister.de/linux-server-internet-bandbreite-testen/"&gt;Bandbreite der Internetanbindung auf Linux-Servern via Kommandozeile testen&lt;/a&gt;). Um den FTP-Server als Flaschenhals auszuschließen, habe ich gleichzeitig auf meinen Servercow-Sevrern denselben Test ausgeführt.&lt;/p&gt;
&lt;p&gt;FarnoX.de garantiert &lt;strong&gt;keine&lt;/strong&gt; Mindestgeschwindigkeit. Auf Nachfragen wurde mir zugesichert, dass in der Praxis 1 GBit/s aber kein Problem sein sollte.&lt;/p&gt;
&lt;h4 id="download"&gt;Download:&lt;/h4&gt;
&lt;p&gt;Die erzielbare Download-Rate ist zwar für Server weniger wichtig als die Upload-Rate, aber trotzdem nicht zu vernachlässigen. Wer will schon lange auf Softwareinstallationen oder größere Uploads auf den Server warten? Die Downlink-Leistung habe ich an mehreren Tagen zu verschiedenen Uhrzeiten mit dem folgenden Kommando getestet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl ftp://speedtest.tele2.net/1GB.zip -o /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Beim Download der 1 GB großen Testdatei konnte ich in den Einzeltests zwischen 16 MBit/s und 800 MBit/s verschiedenste Werte messen. Als Tagesdurchschnitte aus den Einzeltests habe ich folgende Übertragungsgeschwindigkeiten im Download ermittelt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;21. April: Ø 800 MBit/s
22. April: Ø 128 MBit/s
23. April: Ø 464 MBit/s
24. April: Ø 592 MBit/s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die erreichte Geschwindigkeit war nicht nur an verschiedenen Tagen sehr unterschiedlich, sondern auch von Einzeltest zu Einzeltests. Ob nun gerade viel oder wenig Bandbreite zur Verfügung steht, ist von Sekunde zu Sekunde offenbar sehr verschieden. 1 GBit/s konnte ich annähernd nur selten erreichen.&lt;/p&gt;
&lt;h4 id="upload"&gt;Upload:&lt;/h4&gt;
&lt;p&gt;Ganz ähnlich sieht es beim Upload aus:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl ftp://speedtest.tele2.net/1GB.zip -o speedtest.zip
curl -T speedtest.zip ftp://speedtest.tele2.net/upload/
21. April: Ø 230 MBit/s
22. April: Ø 78 MBit/s
23. April: Ø 208 MBit/s
24. April: Ø 53 MBit/s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auch hier streut die erzielte Leistung sehr stark, sodass man sich nicht auf hohen Durchsatz verlassen kann. Zudem habe ich ein Einbrechen der Upload-Rate nach einigen Sekunden beobachtet, sodass die Datenrate zu Ende des Tests teilweise sogar ~ 160 MBit/s niedriger war, als noch zu Beginn.&lt;/p&gt;
&lt;p&gt;Die geringen Datenraten und ein Einbrechen selbiger konnte ich während meiner Tests auf meinen Servercow.de Servern nicht nachvollziehen - Hier wurden die erwarteten Datenraten erreicht.&lt;/p&gt;
&lt;h4 id="ping"&gt;Ping:&lt;/h4&gt;
&lt;p&gt;Die Ping-Latenzen sind völlig okay. Zu Google.de: &lt;code&gt;0.6 ms&lt;/code&gt;. Bedingt durch den günstigen RZ-Standort Frankfurt am Main in der Nähe des DE-CIX sind allgemein gute Latenzzeiten zu erwarten.&lt;/p&gt;
&lt;h4 id="ipv6-unterstützung"&gt;IPv6 Unterstützung&lt;/h4&gt;
&lt;p&gt;FarnoX ordnet standardmäßig jedem vServer ein eigenes IPv6-Netz zu, sodass einem mehr als genug IPv6-Adressen zur Verfügung stehen. Nach einer Debian-Installation auf dem Server muss IPv6 allerdings manuell eingerichtet werden.&lt;/p&gt;
&lt;h4 id="reverse-dns"&gt;Reverse DNS&lt;/h4&gt;
&lt;p&gt;Reverse-DNS Einträge können vom Kunden derzeit noch nicht selbstständig eingerichtet werden. Eine entsprechende Benutzerschnittstelle ist aber in Arbeit. Bis zur Fertigstellung können rDNS-Records über den Support angefragt werden.&lt;/p&gt;
&lt;h4 id="traffic-volumen"&gt;Traffic-Volumen&lt;/h4&gt;
&lt;p&gt;Jedem der verfügbaren vServer ist ein Traffic-Volumen zugeordnet. Auf Nachfrage (und weil mir beim Testserver kein verbrauchter Traffic angezeigt wurde) wurde mir erklärt, es gäbe aktuell noch kein Limit, das tatsächlich durchgesetzt würde. Vielmehr hätte jeder Kunde noch die Freiheit, unbeschränkt viel Traffic zu generieren. Eine Beschränkung (vermutlich in Form einer Drosselung) würde langfristig angestrebt.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://thomas-leister.de/images/2017/04/26/farnox-vserver.png" alt="FarnoX Cloudserver-Verwaltung"&gt;&lt;/p&gt;
&lt;h2 id="vertrag--angebot"&gt;Vertrag / Angebot&lt;/h2&gt;
&lt;p&gt;FarnoX.de gibt bei seinen Servern zwei Preise an: Einen Stundenpreis und einen Monatspreis. Regulär wird der Stundenpreis berechnet: Wer einen Server nur 24 Stunden lang nutzt und dann löscht, zahlt auch nur diesen Zeitraum in Stundentaktung. Erreicht ein Server eine Lebenszeit von einem Monat, wird stattdessen der günstigere Monatspreis herangezogen und in Rechnung gestellt. Wer die Server des Anbieters zuerst testen möchte, kann für 7 Tage einen kleinen, kostenlosen Testserver anfordern. Mehr als eine E-Mail Adresse ist dazu (noch) nicht notwendig. Der Server steht (wie auch alle anderen) innerhalb von einer Minute bereit.&lt;/p&gt;
&lt;p&gt;Als Zahlungsmittel werden Kreditkarten, PayPal, Lastschrift und Banküberweisung akzeptiert.&lt;/p&gt;
&lt;p&gt;Abseits der angebotenen Serverpakete können auch individuell konfigurierte Server über den Support angefordert werden. Ein entsprechender Hinweis auf der Website fehlt leider.&lt;/p&gt;
&lt;h2 id="rechenzentrum--technik"&gt;Rechenzentrum / Technik&lt;/h2&gt;
&lt;p&gt;Meinen Recherchen zufolge nutzt FarnoX.de eigene Hardware im Interwerk-Rechenzentrum in Frankfurt und greift dabei anscheinend auf das Colocation-Angebot von Active-Servers.com zurück. Das bedeutet: Eigene Hardware im Netz von Active-Servers.com und damit betrieben mit 100% Ökostrom der Firma &amp;ldquo;Lichtblick&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Die Server werden via KVM virtualisiert und sind damit vollwertige virtuelle Maschinen ohne Einschränkungen bzgl. Kernel. FarnoX bietet seine Server mit CentOS, Fedora, Debian und Ubuntu an. Soll ein spezielles ISO zur Installation verwendet werden, kann dies über den Support angefragt werden.&lt;/p&gt;
&lt;p&gt;Auf Anfrage habe ich erfahren, dass FarnoX eine Erreichbarkeit von 99,97 % im Jahr garantiert. Das sollte für die meisten Szenarien im privaten Umfeld absolut ausreichend sein. Überprüfen konnte ich das innerhalb des kurzen Testzeitraums selbstverständlich nicht. Unglücklicherweise war mein Server zwar für eine Stunde nicht erreichbar, aber das lässt sich freilich nicht auf das ganze Jahr hochrechnen.&lt;/p&gt;
&lt;p&gt;Dem Kunden zugängliche Backups der virtuellen Server gibt es übrigens nicht. Ich gehe davon aus, dass der Anbieter zwar eine funktionierende Desaster Recovery hat, trotzdem ist es nicht möglich, selbst Sicherungen zu erstellen und als Image herunterzuladen (wie bei Servercow.de).&lt;/p&gt;
&lt;h2 id="sicherheit"&gt;Sicherheit&lt;/h2&gt;
&lt;p&gt;Details zur Zugangssicherheit im &amp;ldquo;Interwerk&amp;rdquo;-Rechenzentrum können auf der &lt;a href="https://interwerk.de/rechenzentrum.html"&gt;Firmenhomepage&lt;/a&gt; nachgelesen werden. Was die informationstechnische Sicherheit angeht, habe ich leider ein paar Mängel festgestellt, die meinen Eindruck etwas trüben:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zur Änderung des Passworts muss das aktuelle Passwort nicht angegeben werden&lt;/li&gt;
&lt;li&gt;Zwei-Faktor-Authentifizierung wird nicht angeboten&lt;/li&gt;
&lt;li&gt;Die Remote-Konsole im Webbrowser verbindet sich unverschlüsselt zum Zielserver &lt;em&gt;(inzwischen behoben!)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Während ich die ersten beiden Punkte weniger kritisch sehe, sehe ich bei der unverschlüsselten Remote-VNC-Konsole einen großen Sicherheitsmangel, der sofort behoben werden sollte! Der Hoster ist diesbezüglich bereits kontaktiert.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update am 26.04.2017 um 15:18&lt;/strong&gt;: Der Hoster hat die Schwachstelle bei der Remote-Konsole behoben und die Verbindung wird nun verschlüsselt.&lt;/p&gt;
&lt;h2 id="sonstiges"&gt;Sonstiges&lt;/h2&gt;
&lt;h3 id="website"&gt;Website&lt;/h3&gt;
&lt;p&gt;Die Website ist einfach und konsistent gehalten und bietet nicht viel Gelegenheit, sich zu verlaufen. Leider könnte man auch sagen, der Webauftritt sei etwas &amp;ldquo;&lt;em&gt;zu&lt;/em&gt;&amp;rdquo; einfach gehalten. Nicht alle Fragen, die ich als Neukunde hatte, konnten durch Recherche auf der Site beantwortet werden, z.B. &lt;em&gt;&amp;ldquo;Was passiert, wenn ich das angegebene Traffic-Volumen überschreite?&amp;rdquo;&lt;/em&gt;, &lt;em&gt;&amp;ldquo;Kann ich zusätzliche IPv4-Adressen buchen?&amp;rdquo;&lt;/em&gt;, &lt;em&gt;&amp;ldquo;Welche Verfügbarkeit kann garantiert werden?&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://thomas-leister.de/images/2017/04/26/farnox-kundencenter.png" alt="FarnoX Kundencenter"&gt;&lt;/p&gt;
&lt;h3 id="support"&gt;Support&lt;/h3&gt;
&lt;p&gt;Der Erfolg eines Hosters steht und fällt mit dem Support. Egal, ob es nur Fragen gibt oder ob ein Eingriff wegen technischer Probleme notwendig ist: Der Support sollte innerhalb eines angemessenen Zeitfensters (ggf. innerhalb von Minuten) antworten und je nach Komplexität des Problems eine Lösung anbieten können. Bisher ergab sich für mich noch keine Gelegenheit, die Reaktion auf techn. Probleme zu testen - Eine E-Mail mit einigen Fragen zum Angebot wurde aber innerhalb von 46 Minuten beantwortet. Das ist kein Bestwert - allerdings sei hierzu angemerkt, dass meine Fragen nicht dringlich waren und die Reaktionszeit für diese Art von Anfrage daher völlig okay. Alle Fragen wurden so beantwortet, wie ich das als Kunde erwarte. Ich würde mir dennoch ein Ticket-System in der Weboberfläche wünschen, über die ich alle Anfragen gesammelt einsehen kann, um besser den Überblick zu behalten. Außerdem könnte man ggf. vertrauliche Daten dem Hoster direkt zukommen lassen, statt sich möglicherweise auf dritte (Mailprovider) verlassen zu müssen.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Ich bin mit hohen Erwartungen an den Test herangegangen und wurde bezüglich der verfügbaren Systemleistung nicht enttäuscht: CPU, RAM und SSD sind leistungsstark und erfüllen meine persönlichen Anforderungen an einen vServer der Preisklasse. Ein schneller vServer ist dank Automatisierung und Cloud-Infrastruktur schnell online. Schade, dass im Bereich Internetanbindung deutliche Abstriche gemacht werden müssen: Bisher gibt es zwar keine Volumenbegrenzungen, doch die schwachen Up- und Downloadraten trüben den Gesamteindruck. Hier und da macht es noch den Anschein, als sei der Hoster gerade erst gegründet worden, was sich während des Tests z.B. durch kaputte Links in E-Mails oder temporäre Nichtverfügbarkeit der Homepage/Verwaltung durch abgelaufene TLS-Zertifikate äußerte. Auch in Sachen Kundeninformation ließe sich beispielsweise der FAQ-Bereich noch ausführlicher gestalten. Ein Ticket-System für Bestandskunden ist wünschenswert. Es gibt also noch Optimierungsbedarf. Die Kernaufgabe &amp;ldquo;schnell und einfach einen Cloudserver online bringen&amp;rdquo; meistert man bei FarnoX jedoch sehr gut.&lt;/p&gt;
&lt;h3 id="stärken"&gt;Stärken&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Möglichkeit, sehr schnell einen Server online zu nehmen&lt;/li&gt;
&lt;li&gt;Starke Systemleistung (CPU, RAM, SSD)&lt;/li&gt;
&lt;li&gt;Abrechnung in Stundentaktung möglich - ideal für kurzfristige Projekte&lt;/li&gt;
&lt;li&gt;Ökostrom&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="schwächen"&gt;Schwächen&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Netzwerk-Performance ins Internet mittelmäßig: Datendurchsatz nicht wie erwartet, stark schwankende Datenrate, keine garantierte Bandbreite.&lt;/li&gt;
&lt;li&gt;Zum Teil nachlässiger Umgang mit dem Thema &amp;ldquo;Sicherheit&amp;rdquo;: Fehlende 2FA, keine Passwortverifizierung bei Änderung, Klartext-Passwörter in nicht verifizierbarer E-Mail &lt;em&gt;(PGP?)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="anregungen"&gt;Anregungen&lt;/h3&gt;
&lt;p&gt;Wenn das Erstellen von neuen Servern schon so schnell passiert, und auch individuelle Server angeboten werden können, wäre für mich die logische Folge, dem Kunden &amp;ldquo;ein paar Schieberegler&amp;rdquo; anzubieten, mit dem er sich ganz einfach schnell seinen Wunschserver konfigurieren und starten kann. Der Weg zu einer individuellen Konfiguration führt aktuell noch über den Support-Weg.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;FarnoX kann ich wegen der Stunden-getakteten Abrechnung und des schnellen, unkomplizierten Buchungsprozesses vor allem Entwicklern und Testern empfehlen, die für einen begrenzten Zeitraum einen vServer benötigen.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Offenlegung: FarnoX.de hat mich gebeten, mir ihr Angebot einmal anzusehen und es auszuprobieren. Den Test habe ich freiwillig und ohne jegliche Vorteilnahme aus Eigeninteresse durchgeführt.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Server-Backups mit Borg: So sichere ich meine Server</title><link>https://thomas-leister.de/server-backups-mit-borg/</link><pubDate>Sat, 08 Apr 2017 19:13:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/server-backups-mit-borg/</guid><description>&lt;p&gt;&lt;strong&gt;&amp;ldquo;Kein Backup - kein Mitleid&amp;rdquo;&lt;/strong&gt; - ein Motto, das auch ich mir mittlerweile zu eigen mache. Nach einigen Pannen mit fälschlicherweise unwiderruflich gelöschten Dateien musste ich vor einigen Jahren auf schmerzhafte Art und Weise lernen, dass regelmäßige Backups wichtiger Daten nicht ein nettes Feature sind, sondern die Pflicht eines verantwortungsvollen Admins. Das schließt nicht nur Desktop-Rechner ein, sondern vor allem auch Server, die zentrale Dienste bereitstellen, ohne die jeder einzelne User möglicherweise nicht arbeiten kann.&lt;/p&gt;
&lt;p&gt;Im Laufe der Jahre habe ich verschiedenste Backup-Lösungen auf meinen Server eingesetzt - Meine aktuelle Lösung gefällt mir aber am besten, daher will ich sie euch in diesem Beitrag kurz vorstellen.&lt;/p&gt;
&lt;p&gt;Kernkomponente meines Backup-Setups ist das &lt;a href="https://github.com/borgbackup"&gt;Backup-Tool &amp;ldquo;Borg&amp;rdquo;&lt;/a&gt;, welches sich unter Linux-Admins immer größerer Beliebtheit erfreut - und das völlig zu recht. Das Tool ist einfach zu bedienen und ermöglicht im Client-Server Modell sehr effiziente Sicherungen. Sowohl beim Datentransport zum Backup-Storage als auch bezüglich des verbrauchten Speichers.&lt;/p&gt;
&lt;h2 id="borg-installation"&gt;Borg Installation&lt;/h2&gt;
&lt;p&gt;Borg gibt es als fertige Pakete für Debian, Ubuntu, und Arch Linux. Neben der Installation über den Paketmanager gibt es auch noch die Installation via pip, oder manuell über ein einzelnes Binary, welches schon alle Abhängigkeiten enthält. Es ist vorteilhaft, auf Backupserver und dem zu sichernden Server (im folgenden einfach &amp;ldquo;Server&amp;rdquo; genannt) dieselbe Version von Borg zu nutzen, um Probleme durch eventuelle Inkompatibilitäten zu vermeiden. Die verschiedenen Installationsarten sind im &lt;a href="https://borgbackup.readthedocs.io/en/stable/installation.html"&gt;Borg Guide&lt;/a&gt; ausführlich erklärt - ich werde daher nicht darauf eingehen.&lt;/p&gt;
&lt;h2 id="konfiguration-des-backupservers"&gt;Konfiguration des Backupservers&lt;/h2&gt;
&lt;p&gt;Als Backupserver verwende ich meinen NAS-Eigenbau Zuhause. Der Server läuft durchgängig, und eignet sich nicht nur hervorragend als Archiv- und Backupserver für die heimischen Geräte, sondern auch für meine Server. Dank 100 MBit/s / 40 MBit/s DSL und des intelligenten Delta-Datenabgleichs sind auch größere Datenmengen relativ zügig Zuhause gesichert - und nebenbei ist damit auch noch ein sog. &amp;ldquo;Off-Site-Backup&amp;rdquo; gemacht, also ein Backup, welches geographisch getrennt von den Produktivservern gelagert wird.&lt;/p&gt;
&lt;p&gt;Auf dem Backupserver habe ich einen eigenen Benutzer &lt;code&gt;serverbackup&lt;/code&gt; angelegt, dessen Home-Verzeichnis auf einer eigenen, verschlüsselten Partition liegt. So wird verhindert, dass Serverbackups (unbeabsichtigt) ausufern und große Teile des verfügbaren Speichers belegen. Meine Server melden sich jeweils als serverbackup-User an, um sich via SSH zu verbinden und die zu sichernden Daten über eine SFTP-Verbindung zu übertragen. Nach Anlegen des neuen Nutzers auf dem Backupserver wird also auf jedem der anderen Server für den jeweiligen root-Nutzer ein SSH-Key generiert, falls noch nicht vorhanden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -a 100 -t ed25519
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Public Keys aller Server werden gesammelt und auf dem Backupserver in die &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; Datei eingetragen, etwa so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-ed25519 AAAAB3NzaC1yc2EAAAADAQABAAABAQDO67aeTjQwIuuqgxEVasVH root@server1
ssh-ed25519 N3Vb3Nfdgdf1yc2gfAAJen4mJQgfhLgefgh4NhbenHGDsdf62mNe root@server2
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="tip"&gt;
&lt;p&gt;Tipp: Am schnellsten lassen sich die Public Keys übertragen, indem man auf jedem Server den gesamten Key im Terminal ausgeben lässt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;hellip; und den Inhalt dann auf dem Backupserver z.B. im nano Editor via Copy &amp;amp; Paste einfügt.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Eine Verbindung zum Borg-Backupserver wäre damit eigentlich schon möglich. Doch nehmen wir mal an, einer der Server wird kompromittiert: Ein Angreifer hätte dann ggf. Zugriff auf den Private Key des Servers und damit auch auf den serverbackup-User des Backupservers. Nichts würde ihn daran hindern, weiteren Schaden anzurichten und z.B. alle Backups auf dem Backupserver zu löschen, bevor der gekarperte Server missbraucht oder zerstört wird. Es gilt also zu verhindern, dass einer der Server über die SSH-Verbindung etwas anderes tut, als Backups zu übertragen. Daher wird die gerade bearbeitete &lt;code&gt;authorized_keys&lt;/code&gt; Datei wie folgt erweitert:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;command=&amp;quot;borg serve --restrict-to-path /home/serverbackup/backups/server1 --append-only&amp;quot; ssh-ed25519 AAAAB3NzaC1yc2EAAAADAQABAAABAQDO67aeTjQwIuuqgxEVasVH root@server1
command=&amp;quot;borg serve --restrict-to-path /home/serverbackup/backups/server2 --append-only&amp;quot; ssh-ed25519 N3Vb3Nfdgdf1yc2gfAAJen4mJQgfhLgefgh4NhbenHGDsdf62mNe root@server2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das vorangestellte &lt;code&gt;command=&amp;quot; [...] &amp;quot;&lt;/code&gt; sorgt dafür, dass via SSH nur noch die gewünschten Borg-Kommandos ausgeführt werden können - und zwar nur &amp;ldquo;hinzufügend&amp;rdquo; (&lt;code&gt;--append-only&lt;/code&gt;). Außerdem wird das Verzeichnis festgelegt, innerhalb dessen sich der verbundene Server aufhalten darf (&lt;code&gt;--restrict-to-path&lt;/code&gt;). Amok laufende Server stellen dann keine Gefahr mehr für die Backups dar.&lt;/p&gt;
&lt;p&gt;Die angegebenen Verzeichnisse für die Backups der Server im serverbackup-Homeverzeichnis müssen selbstverständlich noch angelegt werden. Damit Borg die Backupverzeichnisse als solche erkennt, muss noch ein &lt;code&gt;borg init&lt;/code&gt; ausgeführt werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /home/serverbackup/backups/server1
borg init /home/serverbackup/backups/server1
mkdir /home/serverbackup/backups/server2
borg init /home/serverbackup/backups/server2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Eingabe einer Passphrase wird mit 2x [ENTER] übersprungen. Damit ist der Backupserver vorbereitet.&lt;/p&gt;
&lt;h2 id="konfiguration-der-zu-sichernden-server"&gt;Konfiguration der zu sichernden Server&lt;/h2&gt;
&lt;p&gt;Widmen wir uns nun den Servern, von denen regelmäßig Sicherungen angelegt werden sollen. Borg sollte hier bereits installiert sein. Die Backups werden vom root-User durchgeführt, da in den meisten Fällen nur er Zugriff auf alle wichtigen Daten hat.&lt;/p&gt;
&lt;p&gt;Der Backup-Prozess wird durch einen sog. Cron Job ausgelöst und von einem einfachen Bash-Script ausgeführt, welches Vorbereitungen durchführt und letztendlich Borg nutzt, um das Backup auf Dateiebene zu starten. Um jede Nacht ein Backup um 00:00 Uhr zu starten, kann beispielsweise folgender Cronjob eingetragen werden (Cronjob-Editor öffnen via &lt;code&gt;crontab -e&lt;/code&gt; als root.):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@daily /root/backup/backup.sh &amp;gt; /dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mein Backup-Script in &lt;code&gt;/root/backup/backup.sh&lt;/code&gt; sieht wie folgt aus:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
##
## Save backup to directory named after hostname
##
LOG=&amp;quot;backup.log&amp;quot;
HOST=`hostname`
REPOSITORY=&amp;quot;ssh://serverbackup@backupserver.tld:22/~/backups/&amp;quot;$HOST
##
## Write output to logfile
##
exec &amp;gt; &amp;gt;(tee -i ${LOG})
exec 2&amp;gt;&amp;amp;1
echo &amp;quot;###### Starting backup on $(date) ######&amp;quot;
##
## Create list of installed software
##
dpkg --get-selections &amp;gt; /root/backup/software.list
##
## Create database dumps
##
echo &amp;quot;Creating database dumps ...&amp;quot;
/bin/bash /root/backup/dbdump.sh
##
## Sync backup data
##
echo &amp;quot;Syncing backup files ...&amp;quot;
borg create -v --stats \
$REPOSITORY::'{now:%Y-%m-%d_%H:%M}' \
/root/backup \
/etc \
/var/www \
/var/vmail \
/storage
echo &amp;quot;###### Finished backup on $(date) ######&amp;quot;
##
## Send mail to admin
##
mailx -a &amp;quot;From: &amp;quot;$HOST&amp;quot; Backup &amp;lt;&amp;quot;$HOST&amp;quot;@meinedomain.tld&amp;gt;&amp;quot; -s &amp;quot;Backup | &amp;quot;$HOST admin@meinedomain.tld &amp;lt; $LOG
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Folgende Daten werden gesichert:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Liste aller installierten Softwarepakete&lt;/li&gt;
&lt;li&gt;Ein Dump aller Datenbanken, die in dbdump.sh definiert sind (dazu gleich mehr)&lt;/li&gt;
&lt;li&gt;Dateien aus den angegebenen Verzeichnissen (/etc, /var/www, &amp;hellip; )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sämtliche Ausgaben, die während des Backupprozesses entstehen, werden in eine Log-Datei geschrieben und als E-Mail an den Administrator geschickt. Das funktioniert freilich nur, wenn ein funktionierender Mailserver auf dem System installiert ist.&lt;/p&gt;
&lt;h2 id="datenbanken-sichern"&gt;Datenbanken sichern&lt;/h2&gt;
&lt;p&gt;Die Sicherung der MySQL-Datenbanken übernimmt ein eigenes Script &lt;code&gt;/root/backup/dbdump.sh&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
DBUSER=&amp;quot;backup&amp;quot;
DBPASSWD=&amp;quot;backupuserpassword&amp;quot;
DBBAKPATH=&amp;quot;/root/backup/dbdumps/&amp;quot;
DBS=&amp;quot;nextcloud vmail spamassassin&amp;quot;
for DBNAME in $DBS; do echo &amp;quot;Creating backup for database $DBNAME&amp;quot; &amp;amp;&amp;amp; mysqldump -u $DBUSER -p$DBPASSWD $DBNAME &amp;gt; $DBBAKPATH&amp;quot;$DBNAME.sql&amp;quot;; done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Damit das Script funktioniert, muss im /root/backup Verzeichnis ein Unterverzeichnis &amp;ldquo;dbdumps&amp;rdquo; existieren. Nur die in &amp;ldquo;DBS&amp;rdquo; definierten Datenbanken werden vom Backup erfasst. Auf dem MySQL-Server muss ein spezieller Backup-User &amp;ldquo;backup&amp;rdquo; mit dem dazugehörigen Passwort angelegt werden. Dieser hat lesenden Zugriff auf alle Datenbanken und Tabellen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql -u root -p
create user 'backup'@'localhost' identified by 'backupuserpassword';
grant SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, SHOW VIEW, EVENT, TRIGGER on *.* to 'backup'@'localhost';
quit;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="das-wars-auch-schon"&gt;Das war&amp;rsquo;s auch schon!&lt;/h2&gt;
&lt;p&gt;Jetzt noch das Script getestet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod u+x /root/backup/backup.sh
./root/backup/backup.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;hellip; und das Thema &amp;ldquo;Backup&amp;rdquo; ist für&amp;rsquo;s erste erledigt. Im Grunde müssen jetzt noch noch die eintreffenden E-Mails regelmäßig kontrolliert werden.&lt;/p&gt;
&lt;h2 id="alte-backups-automatisch-entfernen"&gt;Alte Backups automatisch entfernen&lt;/h2&gt;
&lt;p&gt;Halt, da ist noch etwas! Mit der Zeit werden die Backups langsam aber sicher die zugewiesene Partition auf dem Backupserver füllen. Damit das nicht passiert, macht es Sinn, diese nicht ewig aufzuheben, sondern regelmäßig zu löschen.&lt;/p&gt;
&lt;p&gt;Für diese Aufgabe habe ich mir auf dem Backupserver ein weiteres Script &lt;code&gt;/home/serverbackup/prune-backup.sh&lt;/code&gt; angelegt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
ROOTDIR=&amp;quot;/home/serverbackup/backups/&amp;quot;
LOG=&amp;quot;prune-backup.log&amp;quot;
# copy all output to logfile
exec &amp;gt; &amp;gt;(tee -i ${LOG})
exec 2&amp;gt;&amp;amp;1
echo &amp;quot;###### Pruning backup for server1 on $(date) ######&amp;quot;
borg prune -v ${ROOTDIR}server1 \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6
echo &amp;quot;###### Pruning backup for server2 on $(date) ######&amp;quot;
borg prune -v ${ROOTDIR}server2 \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6
echo &amp;quot;###### Pruning finished ######&amp;quot;
# Send logfile to serveradmin
mailx -r backup@meinserver.tld -s &amp;quot;Backup | Prune&amp;quot; admin@meinserver.tld &amp;lt; $LOG
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auch dieses Script wird von einem Cronjob ausgelöst - und zwar erst, wenn alle Serverbackups durchgeführt sind. Andernfalls kann es zu Konflikten kommen. Ich lasse das Script zum &amp;ldquo;Stutzen&amp;rdquo; des Backups daher erst um 2:00 Uhr täglich laufen. Auf dem Backupserver:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;su - serverbackup
chmod u+x ~/prune-backup.sh
crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Neuer Cronjob:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 2 * * * ~/prune-backup.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nach einem &amp;ldquo;prune&amp;rdquo; bleibt von den Backups nur folgendes übrig:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;7 tägliche Backups aus den letzten Tagen&lt;/li&gt;
&lt;li&gt;4 wöchentliche Backups aus den letzten 4 Wochen&lt;/li&gt;
&lt;li&gt;6 monatliche Backups aus den letzten 6 Monaten&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das heißt: Ich behalte nur so viele Daten, dass ich die täglichen Stände der letzten Woche wiederherstellen kann, oder die wöchentlichen Stände der letzten 4 Wochen, oder die monatlichen Stände des letzten halben Jahres. Länger als 6 Monate wird kein Backup aufbewahrt.&lt;/p&gt;
&lt;h2 id="backups-wiederherstellen"&gt;Backups wiederherstellen&lt;/h2&gt;
&lt;p&gt;&amp;hellip; und das sollte geübt sein: Im Notfall soll es schließlich schnell und routiniert funktionieren. Daher hier die notwendigsten Kommandos:&lt;/p&gt;
&lt;h3 id="liste-der-vorhandenen-backups-einsehen"&gt;Liste der vorhandenen Backups einsehen&lt;/h3&gt;
&lt;p&gt;Entweder auf dem Backupserver: (in den meisten Fällen weniger komfortabel)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd /home/serverbackups/backups/server1
borg list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;hellip; oder direkt auf dem betroffenen Server (als root):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;borg list ssh://serverbackup@backupserver.tld:22/~/backups/server1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Ausgabe kann z.B. so aussehen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2017-04-07_00:04 Fri, 2017-04-07 00:01:18
2017-04-08_00:04 Sat, 2017-04-08 00:00:56
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="ein-verzeichnis-wiederherstellen"&gt;Ein Verzeichnis wiederherstellen&lt;/h3&gt;
&lt;p&gt;Um eine spezielle Version eines Verzeichnisses oder einer Datei aus dem Backup-Archiv zu extrahieren, wird das &lt;code&gt;borg extract&lt;/code&gt; Kommando genutzt. Beispiel: Das Verzeichnis /var/www vom 08.04.2017 soll vom Server aus wiederhergestellt und nach /backup-extracted/www geschrieben werden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /backup-extracted/www
cd /backup-extracted/www
borg extract ssh://serverbackup@backupserver.tld:22/~/backups/server1::2017-04-08_00:04 var/www
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="warning"&gt;
Vorsicht: Der &lt;code&gt;borg extract&lt;/code&gt; Befehl extrahiert die Daten in das &lt;em&gt;aktuelle&lt;/em&gt; Verzeichnis: Daher &lt;em&gt;erst&lt;/em&gt; in das Zielverzeichnis navigieren - &lt;em&gt;dann&lt;/em&gt; &lt;code&gt;borg extract&lt;/code&gt; absetzen!
&lt;/div&gt;
&lt;p&gt;Der entsprechende Wiederherstellungsbefehl auf dem Backupserver könnte beispielsweise lauten:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;borg extract ~/backups/server1::2017-04-08_00:04 var/www
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Je nach Netzwerkverbindung und Systemleistung kann das Wiederherstellen eines Backups einige Zeit in Anspruch nehmen. In den meisten Fällen muss es nämlich zuerst aus mehreren inkrementellen Backups zusammengesetzt werden.&lt;/p&gt;
&lt;p&gt;So. Das war&amp;rsquo;s jetzt aber wirklich.&lt;/p&gt;</description></item><item><title>Nginx Reverse Proxy mit dynamischem Zielhost</title><link>https://thomas-leister.de/nginx-reverse-proxy-dynamischer-zielhost/</link><pubDate>Sun, 02 Apr 2017 07:42:00 +0200</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/nginx-reverse-proxy-dynamischer-zielhost/</guid><description>&lt;p&gt;Für meine Statusseite &lt;a href="https://status.trashserver.net"&gt;https://status.trashserver.net&lt;/a&gt; setze ich aus verschiedenen Gründen einen eigenen Reverse Proxy ein, um auf der Übersichtsseite von Uptimerobot.com HTTPS TLS-Verschlüsselung anbieten zu können. Nach der Einrichtung meines Nginx Webproxies war die Statusseite jedoch regelmäßig nicht mehr erreichbar (&amp;ldquo;502 - Bad Gateway&amp;rdquo;). Erst nach einem Neustart von Nginx konnte die Seite wieder aufgerufen werden. Die Ursache für die regelmäßigen Unterbrechungen war eine dynamische IP-Adresse hinter dem Zielhost &amp;ldquo;stats.uptimerobot.com&amp;rdquo;. Mit folgender, klassischer Konfiguration wird der Zielhost &lt;em&gt;nur ein Mal beim Start&lt;/em&gt; von Nginx aufgelöst:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
server_name status.trashserver.net;
[...]
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://stats.uptimerobot.com;
proxy_redirect off;
}
[...]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wenn die zum Start ermittelte IP-Adresse sich ändert und nicht mehr auf den erwarteten Host zeigt, kommt es zum beschriebenen Fehler. Ich habe also nach einer Möglichkeit gesucht, Nginx dazu zu zwingen, den Hostnamen &lt;em&gt;regelmäßig neu aufzulösen&lt;/em&gt;. Bei &lt;a href="https://tenzer.dk/nginx-with-dynamic-upstreams/"&gt;tenzer.dk&lt;/a&gt; bin ich fündig geworden: &lt;strong&gt;Setzt man den Upstream in Form einer Variablen, und gibt einen Resolver an, verhält sich Nginx wie gewünscht und kommt auch mit dynamischen IP-Adressen zurecht&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
server_name status.trashserver.net;
[...]
resolver 192.168.2.1;
set $upstream1 https://stats.uptimerobot.com/rk3R0IDJq/;
set $upstream2 https://stats.uptimerobot.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass $upstream1;
proxy_redirect off;
}
location ~ ^/(.+) {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass $upstream2;
proxy_redirect off;
}
}
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Dezentrales HA Servercluster-VPN mit PeerVPN</title><link>https://thomas-leister.de/dezentrales-server-vpn-peervpn/</link><pubDate>Sun, 12 Mar 2017 12:39:00 +0100</pubDate><author>thomas.leister@mailbox.org (Thomas Leister)</author><guid>https://thomas-leister.de/dezentrales-server-vpn-peervpn/</guid><description>&lt;p&gt;Um hochverfügbare Dienste zu hosten, empfiehlt es sich, Server bei mehreren Hostern in verschiedenen, geografisch verteilten Rechenzentren zu betreiben. Die Server-to-Server-Kommunikation innerhalb des Serverclusters sollte dabei verschlüsselt stattfinden. Das lässt sich am einfachsten über ein Cluster-eigenes VPN erreichen - also ein privates Netzwerk, das nur dem sicheren Informationsaustausch der Server untereinander dient. Ich habe mich nach einer passenden VPN-Lösung für ein Projekt umgesehen und habe die für mich perfekte Softwarelösung gefunden: &lt;a href="https://peervpn.net/"&gt;PeerVPN von Tobias Volk&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;PeerVPN hebt sich von der Vielzahl der OpenSource VPN Projekte durch folgende Eigenschaften ab:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PeerVPN ist klein und einfach. Die Einrichtung ist für geübte in weniger als einer Minute erledigt und bedarf keiner Einarbeitung.&lt;/li&gt;
&lt;li&gt;PeerVPN bildet ein voll vermaschtes Peer-to-Peer Netzwerk. Das heißt: Auf einen zentralen Server (Single Point of Failure!) kann verzichtet werden.&lt;/li&gt;
&lt;li&gt;Authentifizierung via Shared Key&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-unter-debian-jessie"&gt;Installation unter Debian Jessie&lt;/h2&gt;
&lt;p&gt;Im folgenden erkläre ich die Installation von PeerVPN unter Debian 8 (Jessie). Die Vorgehensweise lässt sich in den meisten Fällen auch auf alle anderen Debian-basierten Linux-Distributionen übertragen (z.B. Ubuntu Server).&lt;/p&gt;
&lt;p&gt;Wir werden PeerVPN aus dem offiziellen Quellcode auf GitHub selbst kompilieren. Das ist schnell erledigt und überraschend schmerzfrei. Dafür benötigen wir zunächst einige Pakete, die nachinstalliert werden müssen, falls sie nicht schon auf dem System installiert sind:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt update &amp;amp;&amp;amp; apt install git build-essential
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quellcode herunterladen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/peervpn/peervpn/
cd peervpn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PeerVPN benötigt OpenSSL 1.0 oder LibreSSL, um zu funktionieren. Debian Jessie kommt mit OpenSSL 1.0. Leider ist PeerVPN aktuell nicht mit dem neueren OpenSSL 1.1 kompatibel, welches in künftigen Debian Stable Releases enthalten sein wird. Stattdessen kann LibreSSL genutzt werden.&lt;/p&gt;
&lt;h3 id="kompilieren-mit-openssl-10"&gt;Kompilieren mit OpenSSL 1.0&lt;/h3&gt;
&lt;p&gt;Wer Debian Jessie oder eine andere Linux-Distribution mit OpenSSL 1.0 verwendet, kann das libssl-dev Paket installieren, und PeerVPN direkt kompilieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install libssl-dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quellcode kompilieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make -j2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(&lt;code&gt;-j2&lt;/code&gt; zum Kompilieren mit 2 CPU-Kernen, &lt;code&gt;-j4&lt;/code&gt; für 4 Kerne etc.)&lt;/p&gt;
&lt;h3 id="kompilieren-mit-libressl"&gt;Kompilieren mit LibreSSL&lt;/h3&gt;
&lt;p&gt;Wenn kein OpenSSL 1.0 verfügbar ist oder LibreSSL verwendet werden soll, kann PeerVPN problemlos auch mit LibreSSL kompiliert werden. Dafür wird im heruntergeladenen Git-Verzeichnis die Datei &amp;ldquo;build.sh&amp;rdquo; mit diesem Inhalt angelegt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
libressl_version=libressl-2.5.1
libressl_archive=${libressl_version}.tar.gz
if [ -f ${libressl_archive} ]
then
:
else
wget -O ${libressl_archive} https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/${libressl_archive}
fi
if [ -f ${libressl_archive} ]
then
:
else
echo wget failed.
return -1
fi
libressl_lib=${libressl_version}/crypto/.libs/libcrypto.a
if [ -f $libressl_lib ]
then
:
else
tar -xzf ${libressl_archive}
cd ${libressl_version} &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; cd ..
fi
cc -O2 -I${libressl_version}/include peervpn.c -o peervpn ${libressl_version}/crypto/.libs/libcrypto.a &amp;amp;&amp;amp; echo success!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/ThomasLeister/fc65ff8ff37e1825df981633d90f15d8"&gt;(Script auf GitHub Gist)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Das Script lädt LibreSSL herunter und generiert eine statisch gelinkte Version von PeerVPN. Achtet darauf, dass im Script eine aktuelle LibreSSL-Version angegeben ist! (&lt;a href="https://www.libressl.org/"&gt;https://www.libressl.org/&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="peervpn-auf-dem-system-installieren"&gt;PeerVPN auf dem System installieren:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cp peervpn /usr/local/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="peervpn-konfigurieren"&gt;PeerVPN konfigurieren&lt;/h3&gt;
&lt;p&gt;Konfigurationsverzeichnis erstellen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir /etc/peervpn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Im Konfigurationsverzeichnis wird die Datei &amp;ldquo;vpn.conf&amp;rdquo; angelegt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;networkname PEERVPN
psk meinsupergeheimerschlüssel
interface peervpn0
port 7000
ifconfig4 10.0.2.1/24
initpeers host2.domain.tld 7000 host3.domain.tld 7000
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;networkname: Frei wählbarer Netzwerkname&lt;/li&gt;
&lt;li&gt;psk: Schlüssel, gemeinsamer, geheimer Schlüssel, über den sich die Teilnehmer authentifizieren&lt;/li&gt;
&lt;li&gt;interface: Interface-Name für das zu erstellende Netzwerk-Interface&lt;/li&gt;
&lt;li&gt;port: Port, der für die Kommunikation zwischen den Nodes genutzt werden soll&lt;/li&gt;
&lt;li&gt;ifconfig4: IP-Adresse des jeweiligen Servers im VPN. (Individuell für jeden Host!)&lt;/li&gt;
&lt;li&gt;initpeers: Auf einem der Hosts werden über &amp;ldquo;initpeers&amp;rdquo; alle anderen Hosts definiert. Das ist notwendig, damit die Teilnehmer beim Start des Netzwerks untereinander bekannt gemacht werden können. Syntax: &lt;code&gt;initpeers &amp;lt;host&amp;gt; &amp;lt;hostport&amp;gt; &amp;lt;host&amp;gt; &amp;lt;hostport&amp;gt; ...&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="systemd-service"&gt;Systemd-Service&lt;/h2&gt;
&lt;p&gt;Auf jedem der Teilnehmerhosts wird außerdem ein Systemd-Service eingerichtet, welcher PeerVPN nach dem Systemstart automatisch initiiert:&lt;/p&gt;
&lt;p&gt;Datei &lt;code&gt;/etc/systemd/system/peervpn@.service&lt;/code&gt; anlegen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=PeerVPN Node (%i)
After=syslog.target network.target
ConditionPathExists=/etc/peervpn/%i.conf
[Service]
Type=simple
ExecStart=/usr/local/bin/peervpn /etc/peervpn/%i.conf
[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;VPN Service Aktivieren und starten:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl enable peervpn@vpn.service
systemctl start peervpn@vpn.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="test"&gt;Test&lt;/h2&gt;
&lt;p&gt;Nachdem PeerVPN auf allen Hosts installiert und gestartet wurde, kann es einige Sekunden dauern, bis sich die Teilnehmer untereinander vernetzt haben. Den aktuellen Vernetzungsstatus eines Teilnehmers kann u.A. via&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl status peervpn@vpn.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;abrufen. Im Log wird mitprotokolliert, zu wie vielen anderen Hosts eine Verbindung besteht.&lt;/p&gt;
&lt;p&gt;Ein einfacher Verbindungstest kann via ping erfolgen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ping 10.0.2.1
ping 10.0.2.2
...
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;Bestehende Dienste wie z.B. Webserver oder Datenbankserver können nur an die jeweilige 10.0.2.x -IP-Adresse des Hosts gebunden werden, sodass sie nur über das VPN erreichbar sind.&lt;/p&gt;</description></item></channel></rss>