[~] BACK



~~ HIY (IV) ~~

** MAILSERVER **

[HOW] | [20230526] | [0] | [0x17]




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




[~] BACK