Eigenen Mailserver mit Docker installieren

Will man einen eigenen Mailserver mit Docker installieren, erfordert dieses Vorhaben dank Software wie Docker Mailserver keinen großen Aufwand und ist recht schnell und einfach getan. Das Docker-Image kombiniert viele der benötigten Dienste, um einen eigenen E-Mail-Server aufzusetzen und nach seinen Wünschen anzupassen. So beinhaltet Docker Mailserver beispielsweise Dienste, die automatisch Spam erkennen, E-Mails mit schädlichen Anhängen filtern, Angreifer blockieren und viele weitere.

Voraussetzungen

  • Linux als Betriebssystem
  • Server (z.B. von netcup; kontaktiert mich gerne für Gutschein im Wert eines Gratis-Monats oder im Wert von 5€)
  • Docker (Tutorial)
  • Docker-compose (Tutorial)
  • Mindestens:
    • 512 MB Arbeitsspeicher
    • 1 vCore
  • Empfohlen:
    • 2 GB Arbeitsspeicher
    • 1 Core

Vorbereitung

Generell

Ordner anlegen

Zunächst legen wir uns einen Ordner an, in dem wir unsere Konfigurationsdateien ablegen wollen und navigieren in diesen. In meinem Beispiel nutzen wir hierfür das Verzeichnis /opt/containers/.

mkdir /opt/containers/mailserver/
cd /opt/containers/mailserver/

Konfigurationsdateien herunterladen

Nun besorgen wir uns eine Konfigurationsdatei, die wir für unseren Server benötigen und ein kleines Skript, welches uns später etwas die Arbeit erleichtern wird.

Um die Dateien herunterzuladen und diese ausführbar zu machen, führen wir die nachfolgenden Befehle aus:

DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'
wget "${DMS_GITHUB_URL}/mailserver.env"
wget "${DMS_GITHUB_URL}/setup.sh"
chmod a+x ./setup.sh

SSL-/TLS-Zertifikat erzeugen

Mithilfe eines SSL- bzw. TLS-Zertifikates ermöglichen wir es unserem Mailserver, verschlüsselt mit anderen Servern kommunizieren. Dies ist notwendig, damit unsere E-Mails nicht im Klartext durch das Internet versendet werden. Zudem würden unsere versendeten E-Mails ohne ein gültiges Zertifikat von den allermeisten Mailservern wie beispielsweise WEB.DE, Gmail, GMX, usw. abgelehnt werden.

Zur automatischen Austellung und Erneuerung der Zertifikate nutzen wir in diesem Beispiel acme.sh, welches die kostenlosen Zertifikate bei Let’s Encrypt anfordert.

Acme.sh installieren

Mit dem folgenden Befehl können wir acme.sh herunterladen und direkt installieren. Die E-Mail max.mustermann@mustermail.de ersetzen wir durch unsere derzeit genutzte E-Mail:

sudo sh -c "wget -O -  https://get.acme.sh | sh -s email=max.mustermann@mustermail.de"

Das Skript installiert neben dem eigentlichten Programm zudem einen Cronjob, der dafür sorgt, dass das Zertifikat automatisch erneuert wird, wenn dieses kurz davor ist abzulaufen.

Automatische Zertifizierung konfigurieren

Für die automatische Zertifizierung muss acme.sh auf unsere DNS-Einträge zugreifen können.

Wird euer Server bei netcup gehostet, kann im Customer Control Panel unter Stammdaten im Reiter API ein API-Schlüssel sowie das dazugehörige API-Passwort generiert werden. Solltet ihr statt Netcup einen anderen Hoster verwenden, könnt ihr euch in der Dokumentation von acme.sh das Vorgehen für diesen anschauen.

Um die API-Zugangsdaten für acme.sh zugänglich zu machen, geben wir folgende Befehle in unser Terminal ein und ersetzen die Werte mit den bei unserem Hoster generierten:

export NC_Apikey="GenerierterApiSchluessel"
export NC_Apipw="GeneriertesApiKennwort"
export NC_CID="NetcupKundennummer"

Zertifikat anfordern

Nun müssen wir dafür sorgen, dass unser Zertifikat das erste Mal von Let’s Encrypt angefordert wird. Dies kann je nach Einstellung des DNS-Servers bis zu einer Stunde dauern. meinserver.de muss wieder durch die eigene Domain ersetzt werden:

sudo acme.sh --issue --dnssleep 480 --dns dns_netcup -d 'meinserver.de' -d '*.meinserver.de' --server  letsencrypt

Hat das Anfordern der Zertifikate geklappt, erscheint die Meldung Success, gefolgt von einigen weiteren Informationen.

Mailserver installieren

Docker Container erstellen

Die docker-compose.yml, die unseren Docker-Container erzeugen wird, erstellen wir mit nano (oder einem anderen Texteditor eurer Wahl):

nano docker-compose.yml

Anschließend fügen wir folgenden Inhalt ein:

services:
  mailserver:
    image: docker.io/mailserver/docker-mailserver:10.5
    container_name: mailserver
    hostname: meinserver.de
    env_file: mailserver.env
    ports:
      - "25:25"    # SMTP  (explicit TLS => STARTTLS)
      - "143:143"  # IMAP4 (explicit TLS => STARTTLS)
      - "465:465"  # ESMTP (implicit TLS)
      - "587:587"  # ESMTP (explicit TLS => STARTTLS)
      - "993:993"  # IMAP4 (implicit TLS)
    volumes:
      - ./docker-data/dms/mail-data/:/var/mail/
      - ./docker-data/dms/mail-state/:/var/mail-state/
      - ./docker-data/dms/mail-logs/:/var/log/mail/
      - ./docker-data/dms/config/:/tmp/docker-mailserver/
      - /etc/localtime:/etc/localtime:ro
      - /root/.acme.sh/meinserver.de/:/etc/letsencrypt/
    restart: always
    stop_grace_period: 1m
    cap_add:
      - NET_ADMIN
      - SYS_PTRACE
    dns:
      - 8.8.8.8
      - 8.8.4.4

Hierbei muss meinserver.de durch eure jeweilige Domain ersetzt werden. Einmal in der Zeile „hostname“ sowie in der Zeile kurz vor „restart: always„. Der Rest ist bereits richtig konfiguriert.

Gespeichert wird das Dokument mit STRG + O und verlassen mit STRG + X.

Docker Container konfigurieren

In der mailserver.env befinden sich einige Parameter, mit denen wir unseren Docker Mailserver nach Wunsch anpassen können. Zu jedem Parameter steht in der Datei eine kleine Erklärung zu dessen Funktion.

Nutzung der Zertifikate

Zunächst konfigurieren wir die Nutzung der zuvor erstellen SSL-/TLS-Zertifikate.

Die Datei öffnen wir mit:

nano mailserver.env

Nun suchen wir nach den Zeilen:

SSL_TYPE=
SSL_CERT_PATH=
SSL_KEY_PATH=

und ersetzen diese durch die folgenden:

SSL_TYPE=manual
SSL_CERT_PATH=/etc/letsencrypt/fullchain.cer
SSL_KEY_PATH=/etc/letsencrypt/meinserver.de.key

Hierbei ersetzen wir natürlich wieder meinserver.de durch unsere eigene Domain.

Spamschutz aktivieren

Damit unser Mailserver richtig mit Spam umgeht, suchen wir die Zeilen:

SPOOF_PROTECTION=
ENABLE_CLAMAV=0
ENABLE_SPAMASSASSIN=0
POSTMASTER_ADDRESS=

und ersetzen diese mit:

SPOOF_PROTECTION=1
ENABLE_CLAMAV=1
ENABLE_SPAMASSASSIN=1
POSTMASTER_ADDRESS=postmaster@meinserver.de

Die Domain ersetzen wir wieder durch unsere eigene Domain. Das E-Mail-Konto postmaster muss zwingend vorhanden sein, weswegen wir auch nur die Domain anpassen.

Mailserver konfigurieren

Docker Mailserver starten

Für die weitere Konfiguration muss unser Docker Mailserver gestartet werden:

docker-compose up -d

Der Befehl sorgt dafür, dass im aktuellen Verzeichnis /opt/containers/mailserver/ im Hintergrund ein Docker-Container gestartet wird. In unserem Fall ist das der Mailserver.

Nachdem wir den Docker-Container nun einmal händisch gestartet haben, muss dieser im Normalfall nicht mehr von hand gestartet werden. Tritt beispielsweise ein Fehler im Mailserver auf, startet dieser wieder von alleine. Selbst nach einem Neustart des gesamten System startet der Container von selbst.

E-Mail-Adressen anlegen

Nachdem im vorherigen Schritt unser eigener Mailserver gestartet wurde, können nun die E-Mail-Adressen angelegt werden. Hier kommt das zu Beginn heruntergeladene Skript setup.sh zum Einsatz.

Zunächst muss die E-Mail-Adresse postmaster angelegt werden:

./setup.sh email add postmaster@meinserver.de meinSuperGeheimesPasswort123

Weitere Adressen werden nach dem gleichen Schema angelegt:

./setup.sh email add kontakt@meinserver.de meinZweitesSuperGeheimesPasswort321

Darüber hinaus können auch E-Mail-Weiterleitungen festgelegt werden. Dieses Beispiel bewirkt, dass alle E-Mails die an hallo@meinserver.de gesendet werden, an kontakt@meinserver.de weitergeleitet werden.

./setup.sh alias add hallo@meinserver.de kontakt@meinserver.de

Domain richtig konfigurieren

Damit unser Mailserver E-Mails korrekt senden und empfangen kann, müssen wir unsere Domain entsprechend konfigurieren.

rDNS

Der Server, auf dem der Mailserver betrieben wird, sollte eine Möglichkeit bieten, einen rDNS-Eintrag zu setzen. Dies bewirkt, dass über die IP-Adresse des Server auch unsere Domain ermittelt werden kann.

Bei Netcup findet sich diese Option in eurem Hosting-Produkt unter dem Reiter rDNS:

rDNS-Einstellung vornehmen, um einen Docker Mailserver schnell, einfach und kostenlos zu installieren

Dort tragen wir als Hostnamen die Domain unseres Servers ein.

DNS-Einträge erstellen

Jede Domain besitzt sogenannte DNS-Einträge. Diese lassen sich über den eigenen Hoster konfigurieren.

Bei Netcup befindet sich diese Option in den Einstellungen eurer Domain unter DNS.

MX-Eintrag

Um anderen Servern mitzuteilen, wo unser Mailserver liegt, müssen wir einen MX-Eintrag vornehmen:

  • Host: @
  • Typ: MX
  • Priorität: 10
  • Ziel: meinserver.de
MX-Eintrag zur korrekten Konfiguration eines kostenlosen Mailserver mit Docker

SPF-Eintrag

Der SPF-Eintrag ist eine Sicherheitsmaßnahme und teilt anderen Mailservern mit, dass wir auch wirklich die Berechtigung haben, E-Mails über unsere Domain zu versenden:

  • Host: @
  • Typ: TXT
  • Ziel: v=spf1 a mx ~all
SPF-Eintrag zur korrekten Konfiguration eines eigenen Mailserver mit Docker

CAA-Eintrag

Dieser Eintrag ist eine weitere Sicherheitsmaßnahme. Er definiert von welchem Zertifizierer unser SSL-/TLS-Zertifikat ausgestellt wird.

  • Host: @
  • Typ: CAA
  • Ziel: 0 issue „letsencrypt.org“
CAA-Eintrag um einen eigenen Mailserver mit Docker zu installieren

DMARC-Eintrag

Dieser Eintrag informiert andere Mailserver darüber, dass unser Server DKIM und SPF einsetzt. Zudem können wir Berichte über den Missbrauch unserer E-Mail-Adressen empfangen.

  • Host: _dmarc
  • Typ: TXT
  • Ziel: v=DMARC1; p=quarantine; rua=mailto:postmaster@meinserver.de; ruf=mailto:postmaster@meinserver.de; sp=none; ri=86400
DMARC-Eintrag zur korrekten Konfiguration von einem Docker Mailserver

DKIM-Eintrag

Mithilfe dieses Eintrages stellen andere Mailserver fest, dass eine E-Mail, die wir versenden, auch wirklich von unserem Server stammt.

Um diesen Eintrag vornehmen zu können, generieren wir zuerst einen DKIM-Schlüssel:

./setup.sh config dkim

Im Ordner /opt/containers/mailserver/docker-data/dms/config/opendkim/keys/meinserver.de/ ist nun die Datei mail.txt zu finden.

Dort löschen wir in jeder Zeile den Text bis zum einschließlich ersten Anführungszeichen.

Außerdem löschen wir den Text in jeder Zeile nach dem anderen Anführungszeichen und bringen alles in eine Zeile.

Übrig bleiben sollte Text, der in etwa so aussieht (verkürztes Beispiel):

v=DKIM1; h=sha256; k=rsa; p=gef2EmXQlgtJVSv/JKL3mTGRZcIYT8+ww2BRduuwERQRolxqP1/pvvAmYOvTsOSJeMhDuexXzyQ9ls87==

Diesen riesigen Text müssen wir nun ebenfalls als DNS-Eintrag hinterlegen:

  • Host: mail._domainkey
  • Typ: TXT
  • Ziel: v=DKIM1; h=sha256; k=rsa; p=gef2EmXQlgtJVSv/JKL3mTGRZcIYT8+ww2BRduuwERQRolxqP1/pvvAmYOvTsOSJeMhDuexXzyQ9ls87==
DMARC-Eintrag für sicheren Mailverkehr in einem Mailerver mit Docker

DNS-Einträge übernehmen

Zu guter letzt darf natürlich nicht vergessen werden, die vorgenommenen DNS-Einstellungen zu speichern. Nach der Speicherung dauert es wieder bis zu einer Stunde, bis die Einstellungen übernommen wurden.

Sobald die Änderungen aktiv sind, können mit dem Mailserver bereits problemlos E-Mails gesendet und empfangen werden.

Mailserver nutzen und testen

IMAP und SMTP

E-Mails können ganz einfach per IMAP von unserem E-Mail-Server abgeholt werden und per SMTP versendet. Im eigenen E-Mail-Programm (z.B. Thunderbird) findet der Login ganz normal mit einer bereits erstellen E-Mail-Adresse sowie dem dazugehörigen Passwort statt.

Sollte das E-Mail-Programm auf der eigenen Domain (wie z.B. meinserver.de) keine IMAP/SMTP-Dienste finden, kann als Server auch imap.meinserver.de bzw. smtp.meinserver.de eingetragen werden. Diese Subdomains haben wir eigentlich nicht explizit erstellt. Der Host, den wir in unserem MX-Eintrag als @ eingetragen haben, fungiert als ein Wildcard. Dies bedeutet also, dass unser Mailserver unter jeder Subdomain unserer Domain lauscht.

Fordert das E-Mail-Programm einen Benutzernamen, entspricht dieser einfach der E-Mail-Adresse.

Korrekte Konfiguration des Mailservers testen

Damit wir sicherstellen können, dass wir unseren Mailserver korrekt installiert und konfiguriert haben, lassen wir die Qualität unser versendeten E-Mails bewerten. Auf der Webseite mail-tester.com erhalten wir eine E-Mail angezeigt, an die wir unsere Test-E-Mail senden werden. Wir schreiben zudem ein paar wenige Worte in den Betreff und den Inhalt der E-Mail und senden diese ab.

Klicken wir nun auf den Button der Webseite, sollte bei korrekter Einstellung unsere Test-E-Mail mit einem Score von 10 von 10 bewertet werden.

Wenn du deinen Mailserver erfolgreich mit Docker installiert hast, ist es wichtig, dass du ihn auch regelmäßig aktualisierst, um Sicherheitslücken zu schließen und die Performance zu verbessern. Um diesen Prozess zu automatisieren, kannst du dir den Beitrag Docker Container automatisch aktualisieren anschauen.

Quellen

https://github.com/docker-mailserver/docker-mailserver

https://github.com/acmesh-official/acme.sh

5 Kommentare

  1. Hallo Christian,
    eine super Anleitung hast du dort geschrieben. Mit deiner Hilfe bin ich jetzt weiter gekommen als je zuvor. Einzig alleine die DKIM Geschichte verursacht noch Probleme. Hier passen meine Schlüssel nicht überein.
    Schöner Blog. Weiter so.

    1. Moin PixelTrace,
      wie genau meinst du, dass die Schlüssel nicht passen?
      Wenn der Kommandozeilenbefehl zur Generierung der DKIM-Keys ausgeführt wird, muss bereits ein E-Mail-Konto bestehen. Diese Reihenfolge wird mit dem Tutorial aber eigentlich auch eingehalten.
      Ist der DNS-Eintrag korrekt gesetzt?

      Viele Grüße!

  2. Hallo, schöne, übersichtliche Anleitung.
    Mein Webmailer quittiert mir den Sende-Versuch mit:
    Das Senden der Nachricht an folgende Empfänger ist fehlgeschlagen: [„…“ ] (550 – 550 5.1.1 host v2202112163575172935.hotsrv.de [185.232.70.86] said: : Recipient address rejected: User unknown in local recipient table (H-BADRCPT)
    )
    Der User/Empfänger wurde aber auf dem Mail-Server korrekt angelegt.
    Weiß jemand was da falsch läuft?

    1. Für mich klingt das so, als ob der Mailserver nicht gefunden wird.
      Kannst du mal folgendes kontrollieren:
      – Deine DNS Records
      – Ist in deiner docker-compose.yml „hostname“ korrekt gesetzt?

      Falls beides korrekt eingestellt ist, versuch mal folgendes:
      Suche in der mailserver.env nach dem Eintrag „OVERRIDE_HOSTNAME“. Falls nicht vorhanden, einfach hinzufügen.
      Sollte dann in etwa so aussehen: OVERRIDE_HOSTNAME=meinedomain.de

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert