Die
NERDBUDE, der
CCH! und das
DFK laufen nun schon seit geraumer Zeit auf dem NixOS Server und das stabil (vorausgesetzt ich
zerschiesse nicht irgendetwas -.- ). Der letzte Punkt der noch fehlte waren die Mails ... und das hat mich "etwas" Zeit gekostet.
Deswegen gibt es jetzt hier das Update auch nur drei Monate später - aber die Mails funktionieren jetzt.
SNM - Simple NixOS Mailserver
NixOS sei Dank gibt es eine fertige Implementierung eines Mailservers und zwar SNM, den Simple NixOS Mailserver.
Der SNM wird komplett in die
configuration.nix integriert und darüber configuriert.
Die gesamte Dokumentation und Konfiguration gibt es auf
SNM - Simple NixOS Mailserver. Es sind ein paar einfache Schritte um den Server aufzusetzen.
Die einzigen Voraussetzungen sind ein funktionierender Webserver mit public IP, eine Domain und die Möglichkeit einen rDNS Records zu hinterlegen.
Los geht's.
1. DNS Record
Als erstes wird ein DNS A Eintrag für den Mailserver angelegt. So ist der Mailserver auch von außen erreichbar:
NAME: mail.nerdbude.com
TTL: 10800
TYPE: A
VALUE: deine-ip
Wenn der DNS Eintrag eingerichtet ist, kann per
ping getestet werden, ob der der DNS record richtig gesetzt ist:
TERMINAL
ping mail.nerdbude.com
64 bytes from mail.nerdbude.com (162.55.61.209): icmp_seq=1 ttl=46 time=21.3 ms
...
Wenn das geglückt ist geht es weiter in die
configuration.nix. Hier kommen dir Grundlegenden Einstellungen für den Mailserver rein.
2. CONFIGURATION.NIX
Wie so ziemlich alles, kommt auch der Mailserver in die zentrale
configuration.nix.
CONFIGURATION.NIX
{ config, pkgs, ... }:
{
imports = [
(builtins.fetchTarball {
url = "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/A-COMMIT-ID/nixos-mailserver-A-COMMIT-ID.tar.gz";
sha256 = "enter_hashvalue_here";
})
];
mailserver = {
enable = true;
fqdn = "mail.nerdbude.com";
domains = [ "nerdbude.com" ];
loginAccounts = {
"post@example.com" = {
hashedPasswordFile = "/path/to/passwordfile";
aliases = ["@example.com"];
};
};
certificateScheme = 3;
};
}
Sieht erstmal nach viel aus, ist aber recht überschaubar. Schauen wir uns das mal an.
Im ersten Block legen wir erstmal die Quelle für alle benötigten Parts fest und verifizieren das ganze mit dem Hashvalue:
CONFIGURATION.NIX
{ config, pkgs, ... }:
{
imports = [
(builtins.fetchTarball {
url = "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/A-COMMIT-ID/nixos-mailserver-A-COMMIT-ID.tar.gz";
sha256 = "enter_hashvalue_here";
})
];
Danach wird der Mailserver selber konfiguriert:
CONFIGURATION.NIX
mailserver = {
enable = true;
fqdn = "mail.nerdbude.com";
domains = [ "nerdbude.com" ];
loginAccounts = {
"post@nerdbude.com" = {
hashedPasswordFile = "/path/to/passwordfile";
aliases = ["@nerdbude.com"];
};
};
certificateScheme = 3;
};
}
Als ersten Schritt aktivieren wir den Mailserver mit
enable = true;. Anschließend wird der Full Qualified Domain Name, kurz
FQDN, konfiguriert.
Das passiert mittels
fqdn = "mail.nerdbude.com";. Hier wird die Subdomain mail.nerdbude.com als Adresse für den Mailserverdefiniert. Mit
domain geben wir
dem Server den allgemeinen Domainnamen mit.
Der nächste Block kümmert sich um die Mail-Adressen und Aliases mit denen Mails verschickt und empfangen werden können. Neben den Accounts bzw. Mailadressen wird aber auch das Passwordfile definiert.
Im Passwordfile steht ein gehashtes Password, das später zum Login für die Mailadresse dient. Das File lässt sich recht simpel mit folgendem Befehl generieren:
TERMINAL
nix-shell -p mkpasswd --run 'mkpasswd -sm bcrypt > passwordfile
Ihr werdet anschließend nach einem Passwort gefragt. Das eingegebene Passwort wird dann gehasht und in das File "passwordfile" geschrieben. Das File packt ihr euch an einen beliebeigen Ort auf dem Server.
Der letzte Eintrag
certificateScheme = 3; regelt noch das SSL Zertifikat für unseren Mailserver. Fertig.
Nicht ganz. Der Mailserver braucht noch einen Eintrag
security.acme.certs da für das SSL Zertifikat ein Ansprechpartner bzw. eine dazugehörige Mailadresse notwendig sind.
CONFIGURATION.NIX
security.acme.certs = {
"mail.nerdbude.com".email = "post@nerdbude.com";
};
Jetzt kann die
CONFIGURATION.NIX neu gebaut werden mit
nixos-rebuild switch. Das ganze sollte durch laufen und ohne Probleme bauen. An dem Punkt ist zumindest auf Seite der NixOS Config alles erledigt.
Was jetzt noch fehlt sind die letzten DNS Einträge, damit der Mailserver auch seinen Platz im Internet findet.
3. WEITERE DNS EINTRÄGE
Als erstes setzen wir den MX Record:
NAME: nerdbude.com
PRIO: 10
TYPE: MX
VALUE: mail.nerdbude.com
Der nächste Eintrag ist der SPF Record:
NAME: nerdbude.com
TTL: 10800
TYPE: TXT
VALUE: v=spf1 a:mail.nerdbude.com -all
Dann noch die DKIM Signatur und der DMARC Record. Der DKIM Record sieht wie folgt aus:
NAME: mail._domainkey.nerdbude.com
TTL: 10800
TYPE: TXT
VALUE: v=DKIM1; p=key
Den Key der in den Value kommt, findet ihr unter
/var/dkim/nerdbude.com.mail.txt
Zu guter letzt noch den DMARC Record:
NAME: _dmarc.nerdbude.com
TTL: 10800
TYPE: TXT
VALUE: v=DMARC; p=none
Damit wäre eigentlich alles erledigt und Mails sollten rein und rausgehen. War bei mir leider nicht der Fall.
4. DEBUGGING
Der rebuild läuft durch und wirft keine Fehler und natürlich will man gleich probieren ob alles funktioniert.
Also kommt der ganze Kram in den Mailclient des geringsten Misstrauens und wird enttäuscht. Der Maileingang funktioniert und
Mails kommen rein. Wenn nun aber Mails rausgehen sollen, hakt es. Die gehen nämlich nicht raus.
Blöderweise spuckt
journalctl -fu postfix einen SPF-Error aus, der mich erstmal in diese Richtung gucken lies.
Das war aber die falsche Richtung, denn der SPF failed weil schlicht und ergreifend kein ReverseDNS Entry bestand bzw. falsch gelinkt war.
Also gehen wir in das Provider Web Interface und hinterlegen dort einen rDNS Entry von der IP auf die Domain.
BOOM! - Die Mails gehen raus.
5. FAZIT
Alles in allem ist das aufsetzen des Mailservers wirklich simple. Ein paar DNS Einträge und ein paar Zeilen in die
configuration.nix und schon läuft der eigene Mailserver.
Damit steht die grundlegende Infrastruktur für die
NERDBUDE, Podcasts usw.
Weiter geht es nun mit der Planung der Backups und anderen Spielereien. Mal schauen was da noch so kommt.
PARTS:
[01] - Intro
[02] - Vorraussetzungen
[03] - Webserver
[04] - Mailserver