Christian Eirich

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.

Um die Datei herunterzuladen, führen wir die nachfolgenden Befehle aus:

wget "https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/mailserver.env"

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: ghcr.io/docker-mailserver/docker-mailserver:12
    container_name: mailserver
    hostname: mail.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
      - ./letsencrypt:/etc/letsencrypt
    restart: always
    stop_grace_period: 1m
    cap_add:
      - NET_ADMIN
      - SYS_PTRACE
    dns:
      - 8.8.8.8
      - 8.8.4.4
    healthcheck:
      test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"
      timeout: 3s
      retries: 0
    depends_on:
      - certbot

Hierbei muss meinserver.de in der Zeile „hostname“ durch eure jeweilige Domain ersetzt werden. Es ist generell eine Best-Practice den Mailserver unter der Subdomain mail laufen zu lassen.

SSL / TLS-Zertifikate installieren

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 certbot, welches die kostenlosen Zertifikate bei Let’s Encrypt anfordert. Damit Certbot funktioniert, benötigt Certbot den Port 80 zum Anfordern der Zertifikate. Hierzu wird ebenfalls ein Docker Container verwendet. In die docker-compose.yml fügen wir nun ganz ans Ende noch folgenden Inhalt ein:

  certbot:
    image: certbot/certbot
    container_name: certbot
    ports:
      - "80:80"
    volumes:
      - ./letsencrypt:/etc/letsencrypt
      - ./certbot/logs:/var/log/letsencrypt/
    command: certonly --standalone --force-renewal --email mail@meinemail.de -d mail.meinserver.de --agree-tos

Hierbei muss wieder meinserver.de durch eure jeweilige Domain ersetzt werden und die E-Mail angepasst werden.

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=letsencrypt
SSL_DOMAIN=mail.meinserver.de
#SSL_CERT_PATH=
#SSL_KEY_PATH=

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:

ENABLE_OPENDKIM=1
ENABLE_OPENDMARC=1
ENABLE_POLICYD_SPF=1
ENABLE_CLAMAV=0
ENABLE_RSPAMD=0
RSPAMD_LEARN=0
RSPAMD_GREYLISTING=0

und ersetzen diese mit:

ENABLE_OPENDKIM=0
ENABLE_OPENDMARC=0
ENABLE_POLICYD_SPF=0
ENABLE_CLAMAV=1
ENABLE_RSPAMD=1
RSPAMD_LEARN=1
RSPAMD_GREYLISTING=1

OpenDKIM, OpenDMARC und SPF sind veraltet und werden in Zukunft standardmäßig in Docker-Mailserver deaktiviert sein. Der Ersatz für diese drei Dienste ist rspamd. ClamAV ist der integrierte Virenscanner und sollte nur aktiviert werden, wenn der Mailserver mindestens 2GB RAM zur Verfügung hat. RSPAMD_LEARN=1 sorgt dafür, dass der Mailserver dazulernt, wenn man Mails in den Spam-Order verschiebt. RSPAMD_GREYLISTING=1 weist Mails, die nach Spam aussehen zunächst zurück. Während Spam-Mails häufig nur ein Mal zugestellt werden, versucht ein vertrauenswüriger Mailserver es einige Male mehr, eine Mail korrekt zuzustellen. Durch diese Einstellung können aber Mails bestimmter Absender die ersten Male um einige Minuten verzögert sein.

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
Eigenen Mailserver mit Docker installieren 1

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: mail.meinserver.de
MX Eintrag
Eigenen Mailserver mit Docker installieren 2

A-Eintrag

Die Subdomain mail muss nun ebenfalls noch eingetragen werden:

  • Host: mail
  • Typ: A
  • Ziel: IP-Adresse des Servers
A Eintrag 1
Eigenen Mailserver mit Docker installieren 3

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
Eigenen Mailserver mit Docker installieren 4

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
Eigenen Mailserver mit Docker installieren 5

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
Eigenen Mailserver mit Docker installieren 6

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:

docker exec -ti mailserver setup config dkim

Dann sollte ein Text, der in etwa so aussieht, auf der Kommandozeile ausgegeben werden (verkürztes Beispiel):

v=DKIM1; 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; k=rsa; p=gef2EmXQlgtJVSv/JKL3mTGRZcIYT8+ww2BRduuwERQRolxqP1/pvvAmYOvTsOSJeMhDuexXzyQ9ls87==
DMARC-Eintrag für sicheren Mailverkehr in einem Mailerver mit Docker
Eigenen Mailserver mit Docker installieren 7

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

Updates

20.09.2023: Anleitung auf Docker-Mailserver Version 12 geupdatet; Verwendung von rspamd

8 Kommentare zu „Eigenen Mailserver mit Docker installieren“

  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

  3. Hallo Christian,
    danke für Deine ausführliche und klare Anleitung. Ich habe sie mit der gegenwärtigen Version 12.1 ausgeführt und leider scheine ich ein ähnliches Problem zu haben, wie es der User „Jan“ beschreibt. Wenn ich mit einem anderen Mailaccount an postmaster@.de ein Mail zustellen will, kommt ein 550 Unknown user. Ich kann aber mit den Setup-Script die User auflisten, da erscheint dann der postmaster-Account. Auch das Verzeichnis für die Mailbox ist angelegt.
    Das nächste Phänomen ist, dass der Docker-Mailserver via Port 465 ein Mail an einen anderen Account annimmt. Das Protokoll z.B. in Thunderbird zeigt einen vollständigen Ablauf zum Abliefern des Mails. Das Mail kommt aber nie an der Zieladresse an.
    Ich habe, wie von Dir vorgeschlagen, OVERRIDE_HOSTNAME definiert, aber das hat ebenso nichts gebracht. Nun wäre die Frage, ob sich seit der V. 10.x, die Du benutzt hast, etwas geändert hat, das ich vielleicht berücksichtigen muss.
    Beste Grüße
    MM

    1. Moin!

      Versuch mal bitte in der mailserver.env „SPOOF_PROTECTION“ abzuändern auf:
      SPOOF_PROTECTION=

      Ich aktualisiere die Anleitung gerade auch, da sie mit der neuen Version nicht mehr reibungslos funktioniert.

      Viele Grüße!

Kommentar verfassen

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

Nach oben scrollen