Mailserver mit Dovecot, Postfix, MySQL und Rspamd unter Debian Trixie (v1.0)
Es geht weiter in der Serie meiner Mailserver-Tutorials. Nachdem meine letzte Anleitung zu Debian Bullseye schon einige Jahre alt ist, ist es an der Zeit, sich dem Thema nochmal zu widmen - in Hinblick auf das nun aktuelle Debian Trixie.
Für alle, die schon den Mailserveranleitungen aus den letzten Jahren gefolgt sind: Euer Mailserver lässt sich mit wenig Aufwand gut auf den Stand aus dieser Anleitung aktualisieren. Das Datenbank-Layout hat sich (mit Ausnahme der entfernten tlspolicies Tabelle) nicht geändert und auch sonst sind alle Datenstrukturen aus den Verzeichnissen gleich geblieben - einzig der Funktionsumfang hat sich leicht geändert und die Konfigurationen wurden auf den aktuellen Stand der Technik angepasst. Außerdem wurde die Anleitung umformuliert und an einigen Stellen aus Gründen der Übersichtlichkeit gekürzt. Alle Änderungen seit der letzten Version meiner Anleitung könnt ihr im Changelog am Ende des Beitrags einsehen.
Was und für wen?
Mithilfe dieser Anleitung werdet ihr in der Lage sein, einen einfachen Open Source basierten Mailserver unter Debian Trixie aufzusetzen. Der Server wird euch ermöglichen, eure E-Mails unter einer eigenen Domain selbst zu hosten. Was der Featureset angeht, bekommt ihr eine solide Grundausstattung, die sich bei Bedarf problemlos um weitere Features erweitern lässt.
Was ihr bekommt:
- Senden und Empfang von E-Mails über einen E-Mail Client (z.B. Thunderbird, Evolution, Outlook, … K9 Mail, etc)
- Moderne Spamabwehr inkl. Spam Learning
- DKIM-Signierung ausgehender E-Mails für bessere Akzeptanz bei fremden Mailsystemen und Fälschungssicherheit
- Filterregeln / Autoresponder bei Urlaub / …
- E-Mail Weiterleitungen (Aliase)
- Verwaltung aller Mailaccounts und Weiterleitungen / Aliase über eine MySQL-Datenbank.
- Sichere Verschlüsselung der Kommunikation zwischen E-Mail Servern, falls verfügbar
- Größenbeschränkung von Postfächern
- “Send-only” Account, die nur zum Senden, aber nicht zum Empfangen vorgesehen sind (z.B. für Nextcloud, Forensoftware, …)
Was ihr mit dieser Anleitung nicht bekommt:
- Eine vollständige E-Mail Suite mit Webmail, Office, Kalender, Kontakte …
- Einen Server zum massenhaften Senden von E-Mails (Newsletter etc.)
Zielgruppe dieser Anleitung sind professionelle Linux-Systemadministratoren und Hobbyisten, die verstehen wollen, wie ihr Mailsetup funktioniert und einen sicheren E-Mail Server ohne Schnickschnack aufsetzen wollen.
Für all diejenigen, die eigentlich lieber “nur kurz etwas installieren” würden und sich eher ein Rundumpaket wünschen, das die Komplexität eines E-Mail Servers versteckt, ist möglicherweise ein Docker-basierter Mailcow-Server besser geeignet.
Voraussetzungen für den Betrieb eines E-Mail Servers
- Je nach Anzahl der Nutzer ein passender vServer oder physischer Server. Für eine zweistellige Nutzeranzahl reicht ein Quadcore-Server mit 4 GB RAM bereits völlig aus. Für eine kleine bis mittlere zweistellige Nutzerzahl reicht auch ein Raspberry Pi schon aus. Passende Hoster sind z.B. Hetzner, OVH, Scaleway.
- Eine vernünftige Internetanbindung mit statischer IP-Adresse und der Möglichkeit, einen Reverse-DNS (PTR) Record für diese Adresse zu setzen (idR. trifft das auf Privatkundenanschlüsse bei denen gängigen ISPs nicht zu!)
- Eine Domain, für die beliebige DNS-Records gesetzt werden können
- Vorinstalliertes Debian 13 “Trixie”. Die “minimal” bzw. Server-Version reicht aus - eine grafische Oberfläche wird nicht genutzt. Am besten eine frische Installation ohne Vorbelastung.
Annahmen und Bezeichnungen
Um der Anleitung besser folgen zu können, treffe ich einige Annahmen zum Setup.
- Primäre Domain, die für den Mailserver genutzt wird:
mysystems.tld - (Optionale) weitere Domains, für die ebenfalls Postfächer betrieben werden sollen:
domain2.tld,domain3.tld - Hostname des Mailservers:
mail.mysystems.tld(ich empfehle,mailals Subdomain zu nutzen!) - Öffentliche IPv4-Adresse:
203.0.113.1 - Öffentliche IPv6-Adresse:
2001:db8::1
All diese Domains und IP-Adressen sind selbstverständlich auf die eigenen Gegebenheiten anzupassen. Achtet also im Laufe der Anleitung darauf, diese immer durch eure eigenen Domains oder Adresse zu ersetzen!
Mailserverkomponenten und ihre Aufgaben
Dovecot
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.
Postfix
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.
MariaDB (MySQL-Datenbank)
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.
Rspamd
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.
Nginx
Nginx ist ein weit verbreiteter und schlanker Webserver / Webproxy. In diesem Setup hat er mehrere Aufgaben: Zum einen kann er als Endpunkt für den Ausstellungsprozess von Let’s Encrypt-Zertifikaten dienen, zum anderen als Proxy für die Rspamd-Weboberfläche.
Redis
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. Statistiken, “gelernte” Spammails, …).
Vorbereitungen
Bevor es mit dem Setup der einzelnen Mailserverkomponenten losgeht, muss das System noch ein Stück weit vorkonfiguriert werden. Wie oben bereits erwähnt, empfiehlt sich die Installation auf einem frischen Debian Trixie System, d.h. ohne Vorbelastungen, ohne einen parallel Betriebenen Webserver oder ähnliches. So kann am besten sichergestellt werden, dass die Schritte aus dieser Anleitung zum Ziel führen.
Login als root
Loggt euch über SSH auf eurem Debian System ein. Falls ihr euch nicht eh schon direkt als User root einloggt, sorgt dafür, dass ihr eine Root-Shell bekommt:
sudo su
Aktualisierung des Systems
Das System soll nicht direkt nach Fertigstellung schon veraltet und Sicherheitslücken ausgeliefert sein, richtig? Aktualisiert euer Debian auf den aktuellen Stand:
apt update && apt upgrade
Hostnamen und Server-FQDN setzen
Damit der Mailserver Mails der eigenen Nutzer vernünftig erkennen kann, muss das Betriebssystem wissen, wie es heißen soll. Dazu wird der Hostname mail.mysystems.tld gesetzt:
hostnamectl hostname --static mail
In der Hosts-Datei /etc/hosts sollten FQDN und lokaler Hostname hinterlegt sein. Die Datei kann beispielsweise so aussehen:
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
Die Ausgaben der Kommandos hostname und hostname --fqdn sollten nach den Änderungen wie folgt aussehen:
root@mail:~# hostname
mail
root@mail:~# hostname --fqdn
mail.mysystems.tld
Der FQDN (in diesem Beispiel “mail.mysystems.tld”) wird außerdem nach /etc/mailname geschrieben:
echo $(hostname -f) > /etc/mailname
(Der Hostname im Shell-Prompt z.B. root@meinhost: passt sich erst nach einem erneuten Login an.)
Unbound DNS Resolver installieren
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 Namensauflösung bringt also Performancevorteile für das ganze Mailsystem. Für den Zugriff auf Spamhaus-Blocklists 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.
Unbound installieren:
apt install unbound
dnsutils und resolvconf installiert sein. Wenn bei der Installation von Debian die “Standard-Systemwerkzeuge” ausgewählt wurden, sind die dnsutils schon installiert.Ein dig @::1 denic.de +short +dnssec sollte eine ähnliche Ausgabe wie folgt erzeugen:
# dig @::1 denic.de +short +dnssec
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
Wenn der dig-Befehl funktioniert hat, kann der lokale Resolver als primärer Resolver gesetzt werden:
apt install resolvconf
echo "nameserver ::1" >> /etc/resolvconf/resolv.conf.d/head
ein nslookup denic.de | grep Server sollte nun
Server: ::1
zurückliefern. Damit ist der lokale DNS-Resolver als Haupt-Resolver einsatzbereit.
Einrichtung des DNS
Zu Beginn dieser Anleitung wurde für den Mailserver der FQDN “mail.mysystems.tld” festgelegt. Für diesen Domain-Namen werden nun A-Records im DNS-Zonefile der Domain “mysystems.tld” 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!
mail.mysystems.tld. 86400 IN A 203.0.113.1
mail.mysystems.tld. 86400 IN AAAA 2001:db8::1
“mail.mysystems.tld” ist damit im DNS bekannt. Wenn keine IPv6-Adresse genutzt wird, kann der zweite Record entfallen. Bleiben noch “imap.mysystems.tld” und “smtp.mysystems.tld”, die als Alias-Domains für “mail.mysystems.tld” angelegt werden. Sie sind nicht unbedingt notwendig, werden von vielen Mailclients bei der Einrichtung eines neuen Accounts aber gesucht und erleichtern ggf. die Autokonfiguration:
imap.mysystems.tld. 86400 IN CNAME mail.mysystems.tld.
smtp.mysystems.tld. 86400 IN CNAME mail.mysystems.tld.
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.
Im Zonefile der Domain “mysystems.tld” wird dazu dieser Record angelegt:
mysystems.tld. 86400 IN MX 0 mail.mysystems.tld.
In die Zonefiles der anderen Domains werden entsprechend die Records
domain2.tld. 86400 IN MX 0 mail.mysystems.tld.
und
domain3.tld. 86400 IN MX 0 mail.mysystems.tld.
angelegt. Wichtig ist hier wieder der abschließende Punkt nach den Hostnamen!
Reverse DNS
Ein DNS-Eintrag löst einen Hostnamen zu einer IP-Adresse auf. Nun geht es um den umgekehrten Weg: Das Auflösen einer IP-Adresse zu einem Hostnamen. Das ist wichtig, weil andere Mailserver idR. ermittlen, ob unser Mailserver tatsächlich der ist, der er vorgibt zu sein. Dazu wird die IP-Adresse unseres Servers zu einem Hostnamen aufgelöst und dann mit dem Hostnamen verglichen, den unser Server bei der Kontaktaufnahme präsentiert wird.
Der Reverse DNS-Eintrag ist also unverzichtbar und sollte für alle IP-Adressen, mit denen unser System nach außen kommuniziert, gesetzt sein. Vergesst also nicht, auch für eure ggf. vorhandene IPv6-Adresse einen passenden Eintrag anzulegen.
Üblicherweise könnt ihr das Reverse DNS über die Verwaltungsoberfläche eures Serveranbieters pflegen oder über den Support bei eurem Netzbetreiber. Ist hier nicht der korrekte Hostname mail.mysystems.tld für alle öffentlich genutzten IP-Adressen eingetragen, schlägt der Versand zu den meisten anderen Mailsystemen fehl! Hier ist also besondere Vorsicht geboten.
SPF-Records
Im Kampf gegen Spam und Phishing wurde das sog. Sender Policy Framework entwickelt (Siehe auch Beitrag: “Voraussetzungen für den Versand zu großen E-Mail Providern”). 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:
mysystems.tld. 3600 IN TXT v=spf1 a:mail.mysystems.tld mx ?all
Hiermit erhält nur der im A-Record “mail.msystems.tld” genannte Server für mysystems.tld eine Sendeberechtigung. Die Neutral-Einstellung “?all” 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.
Falls vorhanden, wird in den Zonefiles der beiden Domains “domain2.tld” und “domain3.tld” jeweils dieser Record angelegt:
domain2.tld. 3600 IN TXT v=spf1 include:mysystems.tld ?all
Über das “include” wird der Original DNS Record der Domain mysystems.tld eingebunden.
DMARC Records
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:
_dmarc.mysystems.tld. 3600 IN TXT v=DMARC1; p=reject;
Der Record wird entsprechend auch für die anderen Domains gesetzt:
_dmarc.domain2.tld. 3600 IN TXT v=DMARC1; p=reject;
Einen DMARC-Record mit einer abweichenden Policy könnt ihr euch unter https://elasticemail.com/dmarc/ selbst generieren lassen.
Erstkonfiguration Nginx Webserver
Wie bereits angemerkt, übernimmt Nginx in diesem Setup verschiedene Aufgaben. Für’s erste dient er aber nur als HTTP-Endpunkt, um Let’s Encrypt Zertifikate zu beantragen. Das ist zwar prinzipiell auch ohne Nginx im standalone-Modus möglich, macht uns aber das Leben einfacher, wenn wir ihn sowieso in Betrieb haben (=> belegte Ports durch Nginx, ACME client …).
Dazu wird Nginx installiert …
apt install nginx
… und unter /etc/nginx/sites-available/mail.mysystems.tld eine neue Konfiguration mit diesem Inhalt angelegt:
server {
listen 80;
listen [::]:80;
# listen 443 ssl;
# listen [::]:443 ssl;
server_name mail.mysystems.tld imap.mysystems.tld smtp.mysystems.tld;
# http2 on;
# ssl_certificate /etc/acme.sh/mail.mysystems.tld/fullchain.pem;
# ssl_certificate_key /etc/acme.sh/mail.mysystems.tld/privkey.pem;
# add_header Strict-Transport-Security max-age=15768000;
# if ($ssl_protocol = "") {
# return 301 https://$server_name$request_uri;
# }
}
Einige Zeilen sind zu diesem Zeitpunkt bewusst auskommentiert und werden später wieder aktiviert, sobald TLS-Zertifikate verfügbar sind.
Der neue vHost kann nun aktiviert werden:
ln -s /etc/nginx/sites-available/mail.mysystems.tld /etc/nginx/sites-enabled/mail.mysystems.tld
systemctl reload nginx
Beantragung der TLS-Zertifikate (via Let’s Encrypt)
Gültige TLS-Zertifikate von anerkannten Zertifizierungsstellen (CAs) sind heute für jeden Mailserver ein “muss”. 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’s Encrypt kostenlos und sehr unkompliziert. Im folgenden beziehe ich mich daher auf die Generierung von Let’s Encrypt-Zertifikaten. Selbstverständlich können stattdessen auch Zertifikate anderer CAs genutzt werden.
Für Postfix und Dovecot benötigen wir Zertifikate zu folgenden Domains:
- mail.mysystems.tld
- imap.mysystems.tld
- smtp.mysystems.tld
Um die Zertifikate von der Let’s Encrypt Zertifizierungsstelle abholen, nutze ich das schlanke acme.sh Script. Dieses verfügt über einen “Nginx-Mode”, in dem das Script den Nginx Webserver automatisch so konfiguriert, dass die Domains von LE verifiziert werden können.
acme.sh installieren:
curl https://get.acme.sh | sh
Nach der Installation muss das Shell-Profil neu geladen werden, damit das “acme.sh” Kommando verfügbar gemacht wird:
source ~/.profile
Zertifikate beantragen und herunterladen:
acme.sh --issue --server letsencrypt --nginx \
-d mail.mysystems.tld \
-d imap.mysystems.tld \
-d smtp.mysystems.tld
Zertifikate installieren:
mkdir -p /etc/acme.sh/mail.mysystems.tld
acme.sh --install-cert -d mail.mysystems.tld \
--key-file /etc/acme.sh/mail.mysystems.tld/privkey.pem \
--fullchain-file /etc/acme.sh/mail.mysystems.tld/fullchain.pem \
--reloadcmd "systemctl reload nginx; systemctl reload dovecot; systemctl reload postfix;"
Infolge unseres Reload-Commands wird acme.sh versuchen, Dovecot und Postfix neu zu laden. Da beide Softwarepakete noch nicht installiert sind, werden euch Fehler angezeigt. Ihr könnt diese zum gegenwärtigen Zeitpunkt aber ignorieren.
Die vorher im Nginx auskommentierten Zeilen in /etc/nginx/sites-available/mail.mysystems.tld können durch Entfernen der Hashzeichen nun aktiviert und Nginx mittels
nginx -t
systemctl reload nginx
getestet und neu gestartet werden.
Damit die automatische Zertifikatserneuerung funktioniert, wird noch der Cronjob für acme.sh aktiviert:
acme.sh --install-cronjob
MySQL Datenbank einrichten
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.
Als DBMS wird die neue Debian Standard-MySQL-Datenbank “MariaDB” installiert:
apt install mariadb-server
Nach der Installation sollte MariaDB bereits gestartet sein. Den Status könnt ihr mittels systemctl status mariadb überprüfen. Falls das nicht der Fall ist, startet den Datenbankserver: systemctl start mariadb.
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
mysql
bringt euch in eine MySQL Root Shell. Über diese werden nun ein paar SQL-Befehle ausgeführt.
Ein SQL-Kommando endet immer mit einem Semikolon ;. Mehrzeilige Befehle könnt ihr ohne weiteres einfach mit ENTER umbrechen, so wie sie im Folgenden dargestellt werden.
Achtet auf den Unterschied zwischen “Tick” (') und “Backtick” ( \ `) – der Backtick wird mit Shift + 2x Accent-Taste erzeugt. Kopiert die SQL-Statements am besten direkt in eure Zwischenanlage, statt sie mühsam abzutippen.
Im ersten Schritt wird eine neue Datenbank “vmail” angelegt.
CREATE DATABASE vmail
CHARACTER SET 'utf8'
COLLATE utf8_unicode_ci;
Ein neuer DB-User vmail mit dem Passwort vmaildbpass bekommt Zugriff auf diese neue Datenbank (Wählt ein eigenes Passwort statt “vmaildbpass”!):
vmaildbpass nur die Zeichen 0-9 a-z und A-z. Einigen Berichten nach können Sonderzeichen zu Problemen führen.GRANT SELECT ON vmail.* TO 'vmail'@'localhost' IDENTIFIED BY 'vmaildbpass';
Alle weiteren Kommandos zu Erstellung der Datenbank-Tabellen sollen sich auf die eben erzeugte Datenbank beziehen:
use vmail;
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.
Domain-Tabelle
Die Domain-Tabelle enthält alle Domains, die mit dem Mailserver genutzt werden sollen.
CREATE TABLE `domains` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`domain` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY (`domain`)
);
Account-Tabelle
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`)
);
Die Account-Tabelle enthält alle Mailserver-Accounts. Das Feld “quota” enthält die Volumenbegrenzung für die Mailbox in MB (Megabyte). Im Feld “enabled” 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. “sendonly” wird auf “true” 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.
Alias-Tabelle
CREATE TABLE `aliases` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`source_username` varchar(64),
`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`)
);
Die Alias-Tabelle enthält alle Weiterleitungen / Aliase und ist eigentlich selbsterklärend. Zur temporären Deaktivierung von Weiterleitungsadressen gibt es wieder ein “enabled”-Feld.
Die Datenbank wird mit Datensätzen befüllt, sobald die Server fertig konfiguriert sind. Bis dahin könnt ihr die MySQL-Kommandozeile mit quit; verlassen.
vmail-Benutzer und -Verzeichnis einrichten
Alle Mailboxen werden direkt im Dateisystem des Debian Servers abgelegt. Für die Zugriffe auf die Mailbox-Verzeichnisse wird ein eigener Benutzer “vmail” (“Virtual Mail”) 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.
Das Verzeichnis /var/vmail/ soll alle Mailserver-relevanten Dateien (also Mailboxen und Filterscripts) enthalten und wird für den vmail-User als Home Directory festgelegt.
vmail-Benutzer erstellen:
useradd --create-home --home-dir /var/vmail --user-group --shell /usr/sbin/nologin vmail
vmail Unterverzeichnisse erstellen:
mkdir /var/vmail/mailboxes
mkdir -p /var/vmail/sieve/global
Verzeichnis /var/vmail rekursiv an vmail-User übereignen und Verzeichnisrechte passend setzen:
chown -R vmail /var/vmail
chgrp -R vmail /var/vmail
chmod -R 770 /var/vmail
Dovecot installieren und konfigurieren
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 /var/vmail/. Zuerst müssen jedoch alle Serverkomponenten installiert werden:
apt install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved
dovecot-core: Dovecot-Kerndovecot-imapd: Fügt IMAP-Funktionalität hinzudovecot-lmtp: Fügt LMTP (Local Mail Transfer Protocol)-Funktionalität hinzu; LMTP wird als MTP-Protokoll zwischen Postfix und Dovecot genutztdovecot-mysql: Lässt Dovecot mit der MySQL-Datenbank zusammenarbeitendovecot-sieve: Fügt Filterfunktionalität hinzudovecot-managesieved: Stellt eine Schnittstelle zur Einrichtung der Filter via Mailclient bereit
Nach der Installation wird Dovecot automatisch gestartet. Beendet Dovecot, solange wir keine fertige Konfiguration haben:
systemctl stop dovecot
Nun geht es an die Konfiguration. Die Dovecot-Konfigurationsdateien liegen im Verzeichnis /etc/dovecot/. 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:
rm -r /etc/dovecot/*
cd /etc/dovecot
Für Dovecot reicht die Konfigurationsdatei /etc/dovecot/dovecot.conf aus. Gebt ihr über einen Editor eurer Wahl folgenden Inhalt:
# Dovecot config and storage versions
dovecot_config_version = 2.4.0
dovecot_storage_version = 2.4.0
###
### Protocol settings
#############################
protocols {
lmtp = yes
imap = yes
sieve = yes
}
protocol imap {
mail_plugins {
imap_quota = yes
imap_sieve = yes
}
imap_idle_notify_interval = 29 mins
}
protocol lmtp {
mail_plugins {
sieve = yes
quota = yes
notify = yes
push_notification = yes
}
postmaster_address = postmaster@mydomain.tld
}
##
## TLS Config
## Quelle: https://ssl-config.mozilla.org/#server=dovecot&version=2.3.9&config=intermediate&openssl=1.1.1d&guideline=5.4
##
ssl = required
ssl_server_cert_file = /etc/acme.sh/mydomain.tld/fullchain.pem
ssl_server_key_file = /etc/acme.sh/mydomain.tld/privkey.pem
ssl_server_dh_file = /etc/dovecot/dh4096.pem
ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
###
### Dovecot services
################################
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
group = postfix
user = postfix
}
}
service auth {
### Auth socket für Postfix
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
###
### SQL settings
###
sql_driver = mysql
mysql /var/run/mysqld/mysqld.sock {
user = vmail
password = mypassword
dbname = vmail
}
###
### Client authentication
#############################
auth_mechanisms = plain login
auth_username_format = %{user | lower }
passdb sql {
query = SELECT username AS user, domain, password FROM accounts WHERE username = '%{user | username | lower }' AND domain = '%{user | domain | lower}' and enabled = true;
default_password_scheme = ARGON2ID
}
userdb sql {
query = SELECT concat(quota, 'M') AS quota_storage_size FROM accounts WHERE username = '%{user | username | lower }' AND domain = '%{user | domain | lower}' AND sendonly = false;
iterate_query = SELECT username, domain FROM accounts where sendonly = false;
}
##
### Address tagging
###
recipient_delimiter = +
###
### Mail location
#######################
mail_uid = vmail
mail_gid = vmail
mail_privileged_group = vmail
mail_home = /var/vmail/mailboxes/%{user | domain }/%{user | username }
mail_driver = maildir
mail_path = ~/mail
mailbox_list_layout = fs
###
### Mailbox configuration
########################################
namespace inbox {
inbox = yes
mailbox Spam {
auto = subscribe
special_use = \Junk
}
mailbox Trash {
auto = subscribe
special_use = \Trash
quota_storage_extra = 10M
}
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
}
###
### Mail plugins
############################
mail_plugins {
quota = yes
}
sieve_plugins {
sieve_imapsieve = yes
sieve_extprograms = yes
}
sieve_script spam-global {
type = before
path = /var/vmail/sieve/global/spam-global.sieve
}
sieve_script personal {
type = personal
path = /var/vmail/sieve/%{user | domain }/%{user | username }/scripts
active_path = /var/vmail/sieve/%{user | domain }/%{user | username }/active-script.sieve
}
# From Mailbox to Spam
mailbox Spam {
sieve_script spam {
type = before
cause = copy
path = /var/vmail/sieve/global/learn-spam.sieve
}
}
# From Spam to another folder (learn HAM)
imapsieve_from Spam {
sieve_script ham {
type = before
cause = copy
path = /var/vmail/sieve/global/learn-ham.sieve
}
}
# Sieve extensions only allowed in global context
sieve_global_extensions {
vnd.dovecot.pipe = yes
}
sieve_pipe_bin_dir = /usr/bin
###
### IMAP Quota
###########################
quota "User quota" {
driver = count
}
Anzupassende Stellen:
postmaster_address: Domain anpassenssl_server_cert_file: Pfad zur Zertifikatsdateissl_server_key_file: Pfad zur Zertifikatsdateipassword = mypasswordinmysqlBlock
Nach dem Speichern ist es wichtig, nur dem root-User das Lesen der Datei zu erlauben, weil das MySQL-Passwort für den vmail hierin in Klartext abgelegt ist:
chmod 600 /etc/dovecot/dovecot.conf
Diffie-Hellman Parameter für Dovecot generieren
In neueren Versionen generiert Dovecot die Diffie-Hellman-Parameter für TLS-Verbindungen nicht mehr selbst. Also müssen wir selbst Hand anlegen und die Parameter mittels OpenSSL-Tool generieren lassen:
openssl dhparam -out /etc/dovecot/dh4096.pem 4096
Das kann je nach Auslastung des Mailservers durchaus eine viertel Stunde oder länger dauern. Um den Vorhang zu beschleunigen, kann ein sog. Entropy Harvester wie z.B. haveged installiert werden (apt install haveged).
Globales Sieve-Filterscript für Spam
Unter /var/vmail/sieve/global/ wird das Sieve-Filterscript spam-global.sieve erstellt, das erkannte Spammails in den Unterordner “Spam” jeder Mailbox einsortiert. Rspamd markiert erkannte E-Mails mit einem speziellen Spam-Header, den das Script erkennt. Inhalt von spam-global.sieve:
require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
fileinto "Spam";
}
if header :is "X-Spam" "Yes" {
fileinto "Spam";
}
Spam Learning mit Rspamd
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.
Dazu werden zwei Sieve-Scripts in /var/vmail/sieve/global/ angelegt:
learn-spam.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_spam"];
learn-ham.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
if environment :matches "imap.mailbox" "*" {
set "mailbox" "${1}";
}
if string "${mailbox}" "Trash" {
stop;
}
pipe :copy "rspamc" ["learn_ham"];
Das learn-ham.sieve Script besitzt noch einen Check, der überprüft, ob eine E-Mail aus dem Spam in den Papierkorb verschoben wurde. In diesem Fall sollen die betroffenen Mails ja nicht wieder als “Ham” markiert werden, daher wird in so einem Fall die Ausführung des Lernvorgangs verhindert.
Postfix installieren und konfigurieren
Für unseren Postfix-Server benötigen wir nur zwei Pakete: Das Kernpaket postfix und die Komponente postfix-mysql, die Postfix mit der MySQL-Datenbank kommunizieren lässt.
apt install postfix postfix-mysql
Während der Installation werdet ihr nach der “Allgemeinen Art der Konfiguration” gefragt. Wählt an dieser Stelle “Keine Konfiguration” und beendet den Postfix-Server wieder:
systemctl stop postfix
Im Postfix-Konfigurationsverzeichnis /etc/postfix befinden sich trotz unserer Wahl “Keine Konfiguration” ein paar Konfigurationsdateien, die zunächst entfernt werden:
cd /etc/postfix
rm -r sasl
rm master.cf main.cf.proto master.cf.proto
Legt dann folgende Dateien im Verzeichnis /etc/postfix an:
/etc/postfix/main.cf
##
## Netzwerkeinstellungen
##
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
inet_interfaces = 127.0.0.1, ::1, 203.0.113.1, 2001:db8::1
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
## Quelle: https://ssl-config.mozilla.org/#server=postfix&version=3.4.8&config=intermediate&openssl=1.1.1d&guideline=5.4
##
### Allgemein
tls_preempt_cipherlist = no
tls_ssl_options = NO_COMPRESSION
tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
### Ausgehende SMTP-Verbindungen (Postfix als Sender)
smtp_tls_security_level = dane
smtp_tls_mandatory_protocols = >=TLSv1.2
smtp_tls_protocols = >=TLSv1.2
smtp_dns_support_level = dnssec
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_ciphers = medium
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
### Eingehende SMTP-Verbindungen
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_ciphers = medium
smtpd_tls_mandatory_protocols = >=TLSv1.2
smtpd_tls_protocols = >=TLSv1.2
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_cert_file=/etc/acme.sh/mail.mysystems.tld/fullchain.pem
smtpd_tls_key_file=/etc/acme.sh/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_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 proxy: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
##
## MySQL Abfragen
##
proxy_read_maps = proxy:mysql:/etc/postfix/sql/aliases.cf
proxy:mysql:/etc/postfix/sql/accounts.cf
proxy:mysql:/etc/postfix/sql/domains.cf
proxy:mysql:/etc/postfix/sql/recipient-access.cf
proxy:mysql:/etc/postfix/sql/sender-login-maps.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/sql/aliases.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/sql/accounts.cf
virtual_mailbox_domains = proxy: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 "Address Tagging"
recipient_delimiter = +
### Keine Rückschlüsse auf benutzte Mailadressen zulassen
disable_vrfy_command = yes
Anzupassen:
inet_interfaces: IP-Adressen203.0.113.1, 2001:db8::1müssen durch eigene IPv4- (und optional IPv6)-Adresse ersetzt werden.myhostname: Ersetzen durch eigenen Hostnamensmtpd_tls_cert_file: Pfad zur Zertifikatsdateismtpd_tls_key_file: Pfad zur Zertifikatsschlüsseldatei
Wenn der Mailserver (entgegen meiner Empfehlung) nicht einen mail.domain.tld Hostnamen hat, sondern unter dem Domainnamen läuft (domain.tld), muss zur Konfiguration eine Zeile mit
mydestination =
(ohne Inhalt nach dem “=”) hinzugefügt werden, sonst werden E-Mails an der falschen Stelle gespeichert.
/etc/postfix/master.cf
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
# ==========================================================================
###
### SMTP-Serverbindungen aus dem Internet
### Authentifizuerung hier nicht erlaubt (Anmeldung nur via smtps/submission!)
smtp inet n - y - - smtpd
-o smtpd_sasl_auth_enable=no
###
### SMTPS Service (Submission mit implizitem TLS - ohne STARTTLS) - Port 465
### Für Mailclients gelten andere Regeln, als für andere Mailserver (siehe smtpd_ in main.cf)
###
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-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=proxy:mysql:/etc/postfix/sql/sender-login-maps.cf
-o smtpd_helo_required=no
-o smtpd_helo_restrictions=
-o cleanup_service_name=submission-header-cleanup
###
### Submission-Zugang für Clients (mit STARTTLS - für Rückwärtskompatibilität) - Port 587
###
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=proxy: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
Diffie-Hellman-Parameter für Postfix generieren
Neben Dovecot bekommt auch Postfix “von Hand generierte” DH-Parameter. Hier allerdings nur 2048 Bit starke, um zu älteren Mailservern kompatibel zu bleiben.
openssl dhparam -out /etc/postfix/dh2048.pem 2048
SQL-Konfiguration
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:
mkdir /etc/postfix/sql && cd $_
Erstellt dann die folgenden Konfigurationsdateien mit dem zugehörigen Inhalt:
accounts.cf
user = vmail
password = vmaildbpass
hosts = unix:/run/mysqld/mysqld.sock
dbname = vmail
query = select 1 as found from accounts where username = '%u' and domain = '%d' and enabled = true LIMIT 1;
aliases.cf
user = vmail
password = vmaildbpass
hosts = unix:/run/mysqld/mysqld.sock
dbname = vmail
query = SELECT DISTINCT concat(destination_username, '@', destination_domain) AS destinations FROM aliases
WHERE (source_username = '%u' OR source_username IS NULL) AND source_domain = '%d'
AND enabled = true
AND NOT EXISTS (SELECT id FROM accounts WHERE username = '%u' and domain = '%d');
domains.cf
user = vmail
password = vmaildbpass
hosts = unix:/run/mysqld/mysqld.sock
dbname = vmail
query = SELECT domain FROM domains WHERE domain='%s';
recipient-access.cf
user = vmail
password = vmaildbpass
hosts = unix:/run/mysqld/mysqld.sock
dbname = vmail
query = select if(sendonly = true, 'REJECT', 'OK') AS access from accounts where username = '%u' and domain = '%d' and enabled = true LIMIT 1;
sender-login-maps.cf
user = vmail
password = vmaildbpass
hosts = unix:/run/mysqld/mysqld.sock
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;
Vergesst nicht, vmaildbpass in jeder der Dateien durch euer eigenes Passwort zu ersetzen!
Alle SQL-Konfgurationsdateien in /etc/postfix/sql werden vor dem Zugriff durch unberechtigte User geschützt:
chown -R root:postfix /etc/postfix/sql
chmod g+x /etc/postfix/sql
Zusätzliche Konfigurationsdatei without_ptr
Außerdem gibt es noch eine weitere Datei /etc/postfix/without_ptr, die zunächst leer bleiben kann:
touch /etc/postfix/without_ptr
Die Datei kann später einmal Einträge wie den folgenden beinhalten:
[2001:db8::beef] OK
Der Server mit der IP 2001:db8::beef muss dann keinen gültigen PTR-Record (Reverse DNS) mehr besitzen und wird trotzdem akzeptiert. Die without_ptr-Datei muss dann nach jeder Änderung in eine Datenbankdatei umgewandelt und Postfix neu geladen werden:
postmap /etc/postfix/without_ptr
systemctl reload postfix
Im Moment reicht es aber aus, einfach nur eine leere Datenbankdatei zu generieren:
postmap /etc/postfix/without_ptr
Zum Schluss wird einmal
newaliases
ausgeführt, um die Alias-Datei /etc/aliases.db zu generieren, die Postfix standardmäßig erwartet.
Rspamd
Da die Rspamd-Pakete für Debian nicht besonders aktuell sind und offiziell davon abgeraten wird, diese zu nutzen, nutzen wir an dieser Stelle das Debian-Repository des Rspamd-Projekts:
# Add Rspamd repository GPG key (modern method)
curl -fsSL https://rspamd.com/apt-stable/gpg.key | \
sudo gpg --dearmor -o /usr/share/keyrings/rspamd.gpg
# Add Rspamd repository
echo "deb [signed-by=/usr/share/keyrings/rspamd.gpg] https://rspamd.com/apt-stable/ $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/rspamd.list
# Update package list
sudo apt update
# Install Rspamd and Redis
sudo apt install rspamd redis-server
Neben Rspamd wird auch Redis installiert, damit Rspamd seine Daten ablegen kann (Key-Value Datenbank).
Rspamd stoppen:
systemctl stop rspamd
Grundkonfiguration
Die Konfiguration von Rspamd wird im Verzeichnis /etc/rspamd/local.d/ abgelegt. Die folgenden Konfigurationsdateien werden darin erstellt:
/etc/rspamd/local.d/worker-proxy.inc:
# Enable milter mode for Postfix integration
milter = yes;
timeout = 120s;
upstream "local" {
default = yes;
self_scan = yes; # Scan messages directly
}
/etc/rspamd/local.d/worker-controller.inc: Einstellung des Worker controllers: Passwort für den Zugriff via Weboberfläche, z.B.:
password = "$2$qecacwgrz13owkag4gqcy5y7yeqh7yh4$y6i6gn5q3538tzsn19ojchuudoauw3rzdj1z74h5us4gd3jj5e8y";
Der Passworthash ($2$qecacwg...) wird via
rspamadm pw
generiert und in die Datei eingefügt. Vergesst nicht das abschließende ";!
/etc/rspamd/local.d/logging.inc: Error logging
type = "syslog";
level = "warning";
Milter Headers /etc/rspamd/local.d/milter_headers.conf
use = ["x-spam-status", "authentication-results"];
authenticated_headers = ["authentication-results"];
routines {
x-spam-status {
header = "X-Spam-Status";
remove = 0;
}
}
…und in /etc/rspamd/local.d/redis.conf:
# Redis connection for statistics and caching
servers = "127.0.0.1:6379";
Für den Bayes’schen Filter (Textanalyse) wird “Auto-Learning” aktiviert:
/etc/rspamd/local.d/classifier-bayes.conf:
# Configure Bayes classifier to use Redis
servers = "127.0.0.1:6379";
backend = "redis";
# Auto-learning thresholds
autolearn = true;
min_learns = 200; # Minimum learned messages before classification
Wird eine E-Mail bereits beim Empfang abgelehnt, weil sie ausgrund der Metadaten offensichtlich von einem Spammer kommt, nutzt Rspamd die Gelegenheit und lernt, dass der Text in dieser E-Mail als Spam einzustufen ist. So wird die Erkennungsrate mit jeder Spammail besser. (https://rspamd.com/doc/configuration/statistic.html)
Manuell gepflegte Black-/Whitelists
Über das Multimap-Modul kann das Verhalten von Rspamd für bestimmte E-Mail-Merkmale personalisiert gesteuert werden. Merkmale können zum Beispiel die Absender-IP-Adresse oder die Absendermailadresse sein. Für beide registrieren wir in /etc/rspamd/local.d/multimap.conf jeweils eine Black- und eine Whitelist:
WHITELIST_IP {
type = "ip";
map = "$CONFDIR/local.d/whitelist_ip.map";
description = "Local ip whitelist";
action = "accept";
}
WHITELIST_FROM {
type = "from";
map = "$CONFDIR/local.d/whitelist_from.map";
description = "Local from whitelist";
action = "accept";
}
BLACKLIST_IP {
type = "ip";
map = "$CONFDIR/local.d/blacklist_ip.map";
description = "Local ip blacklist";
action = "reject";
}
BLACKLIST_FROM {
type = "from";
map = "$CONFDIR/local.d/blacklist_from.map";
description = "Local from blacklist";
action = "reject";
}
Für alle vier Listen werden nun Listendateien erstellt:
cd /etc/rspamd/local.d
touch whitelist_ip.map
touch whitelist_from.map
touch blacklist_ip.map
touch blacklist_from.map
cd -
“IP”-Listen können IPv6- und IPv4-Adressen bzw. Adressbereiche enthalten - in jeder Zeile ein Eintrag. “From”-Listen enthalten vollständige Absendermailadressen. Die Listen können zunächst leer bleiben. Sie eignen sich gut, wenn man später einmal für einzelne Absender oder Server Ausnahmen einstellen möchte.
Damit die Listendateien (.map-Dateien) auch vom Rspamd Webinterface aus bearbeitbar sind, bekommen sie nun noch die passenden Berechtigungen:
chown -R _rspamd:_rspamd /etc/rspamd/local.d/*.map
DKIM Signing
Rspamd übernimmt auch das Signieren von ausgehenden E-Mails. Damit signiert werden kann, muss zunächst ein Signing Key generiert werden. Der Parameter -s 2026 gibt den sogenannten Selektor an - einen Namen für den Key (hier das Erstellungsjahr).
mkdir /var/lib/rspamd/dkim/
rspamadm dkim_keygen -b 2048 -s 2026 -k /var/lib/rspamd/dkim/2026.key > /var/lib/rspamd/dkim/2026.txt
chown -R _rspamd:_rspamd /var/lib/rspamd/dkim
chmod 440 /var/lib/rspamd/dkim/*
Zum Signing Key (/var/lib/rspamd/dkim/2026.key) gehört ein dazu passender Public Key, welcher in Form eines vorbereiteten DNS-Records in der Datei /var/lib/rspamd/dkim/2026.txt liegt.
DKIM Record ausgeben lassen:
cat /var/lib/rspamd/dkim/2026.txt
Die Ausgabe sieht z.B. so aus:
2026._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2/al5HqXUpe+HUazCr6t9lv2VOZLR369PPB4t+dgljZQvgUsIKoYzfS/w9NagS32xZYxi1dtlDWuRfTU/ahHO2MYzE0zHE4lMfwb6VkNCG+pM6bAkCwc5cFvyRygwxAPEiHAtmtU5b0i9LY25Z/ZWgyBxEWZ0Wf+hLjYHvnvMqewPsduUqKVjDOdUqeBb1VAu3WFErOAGVUYfKqFX"
"+yfz36Alb7/OMAort8A5Vo5t5k0vxTHzkYYg5KB6tLS8jngrNucGjyNL5+k0ijPs3yT7WpTGL3U3SEa8cX8WvOO1fIpWQz4yyZJJ1Mm62+FskSc7BHjdiMHE64Id/UBDDVjxwIDAQAB"
) ;
Der Werte-Abschnitt des Records (beginnend mit v=DKIM1 bis zum Ende der Zeichenkolonne - hier AQAB) 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 mit dem Selector “2026” und meiner Beispieldomain “mysystems.tld” durchgeführt:
Wichtig: Der Selektor “2026” wird im DNS-Record zusammen mit ._domainkey als Name verwendet! Der DKIM-Record muss für jede verwendete Domain (domain2.tld, domain2.tld) im jeweiligen Zonefile erstellt werden!
rspamadm dkim_keygen Kommando nochmals mit -b 1024 statt mit -b 2048 ausführen.Der erzeugte DKIM-Key und der verwendete Selektor werden in der Konfigurationsdatei /etc/rspamd/local.d/dkim_signing.conf angegeben:
path = "/var/lib/rspamd/dkim/$selector.key";
selector = "2026";
### Enable DKIM signing for alias sender addresses
allow_username_mismatch = true;
Diese Konfiguration wird in die Datei /etc/rspamd/local.d/arc.conf kopiert, sodass das ARC-Modul korrekt arbeiten kann. Es greift auf dieselben Einstellungen zurück:
cp -R /etc/rspamd/local.d/dkim_signing.conf /etc/rspamd/local.d/arc.conf
Rspamd starten
Rspamd und Redis können nun gestartet werden:
systemctl enable --now redis-server
systemctl enable rspamd
systemctl start rspamd
Nginx Proxy für Rspamd Weboberfläche
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 (siehe unten).
Für den Rspamd-Webproxy wird in /etc/nginx/sites-enabled/mail.mysystems.tld ein location Block wie folgt hinzugefügt:
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name mail.mysystems.tld imap.mysystems.tld smtp.mysystems.tld;
http2 on;
ssl_certificate /etc/acme.sh/mail.mysystems.tld/fullchain.pem;
ssl_certificate_key /etc/acme.sh/mail.mysystems.tld/privkey.pem;
add_header Strict-Transport-Security max-age=15768000;
location /rspamd/ {
proxy_pass http://localhost:11334/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
if ($ssl_protocol = "") {
return 301 https://$server_name$request_uri;
}
}
Anzupassen:
- ssl_certificate: Pfad zu Zertifikat
- ssl_certificate_key: Pfad zu Zertifikatsschlüssel
- server_name
Konfiguration testen und Nginx neu laden:
nginx -t
systemctl reload nginx
Weboberfläche aufrufen
Unter https://mail.mysystems.tld/rspamd/ ist die Rspamd-Weboberfläche nun erreichbar. Als Passwort wird das weiter oben erzeugte Passwort für die Weboberfläche verwendet.
Via SSH-Tunnel mit der Weboberfläche verbinden (Alternative)
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
ssh -L 8080:localhost:11334 benutzer@mail.mysystems.tld -N
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.
Domains, Accounts und Aliase in Datenbank definieren
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:
mysql
… und wechselt in die vmail-Datenbank:
use vmail;
Neue Domain anlegen
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 “domains”-Tabelle eingetragen sind:
INSERT INTO domains (domain) VALUES ('mysystems.tld');
Neuen E-Mail-Account anlegen
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
doveadm pw -s ARGON2ID
(in der Bash Shell! - Nicht in der MySQL Shell!) kann ein solcher Hash erzeugt werden. Beispiel für einen ausgegebenen Hash:
{ARGON2ID}$argon2id$v=19$m=65536,t=3,p=1$VmQU9clttB7MGvxZj+Ua8A$CULlB3rPd0GCof/tRyne6Tv4f9yvZcvm3B/AMxs91uE
Dieser Hash ist für jedes Passwort einzigartig und ändert sich sogar bei jeder Generierung. Legt den Hash (von vorne bis hinten, inkl. {ARGON2ID}!) am besten gleich in eurer Zwischenablage oder einem Textdokument ab - ihr benötigt ihn gleich!
Das SQL-Kommando zum Erzeugen eines neuen Accounts lautet beispielsweise:
INSERT INTO accounts (username, domain, password, quota, enabled, sendonly) VALUES ('user1', 'mysystems.tld', '{ARGON2ID}$argon2id$v=19$m=65536,t=3,p=1$VmQU9clttB7MGvxZj+Ua8A$CULlB3rPd0GCof/tRyne6Tv4f9yvZcvm3B/AMxs91uE', 2048, true, false);
Folgende Werte müssen / können dabei ersetzt werden:
{ARGON2ID}...: Der Passworthash von oben muss selbstverständlich durch den eigenen ersetzt werden.20248: In diesem Beispiel erhält der Account 2 GiB Speicher (2048 MB).true: Außerdem ist er aktiviertfalse: … und ist kein “sendonly-Account” - er darf also auch E-Mails senden
Tipp: Legt am besten gleich den postmaster@mysystems.tld Account an. Er sollte auf jedem Mailserver vorhanden sein, um den Administrator bei technischen Problemen mit dem Server erreichen zu können.
Neuen Alias anlegen
INSERT INTO aliases (source_username, source_domain, destination_username, destination_domain, enabled) VALUES ('alias', 'mysystems.tld', 'user1', 'mysystems.tld', true);
… legt einen Alias für den Benutzer “user1@mysystems.tld” an. E-Mails an “alias@mysystems.tld” werden dann an die Mailbox dieses Users zugestellt.
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 “?all” gestellt zu lassen und auf Weiterleitungen zu fremden Servern möglichst zu verzichten. Aliase von lokalen Adressen auf andere lokale Adressen sind kein Problem.
Wenn ein E-Mail-Verteiler eingerichtet werden soll, werden mehrere Datensätze mit derselben Quelladresse eingerichtet, also z.B. so:
team@domain.tld => user1@domain.tld
team@domain.tld => user2@domain.tld
team@domain.tld => user3@domain.tld
Ein Catch-All hingegen kann erreicht werden, indem der source_username auf null gesetzt wird, z.B. so:
insert into aliases (source_username, source_domain, destination_username, destination_domain, enabled) values (null, 'domain1.tld', 'catchall', 'mysystems.tld', true);
Ein Catch-All kann mit anderen Aliasen auf derselben Domain ko-existieren und “fängt” alle Benutzernamen auf der jeweiligen Domain auf, für die noch kein Alias gesetzt wurde. So kann man Mails zentral aufsammeln, welche an Mailboxen verschickt wurden, die auf dem Mailserver nicht existieren. Beachtet, dass dadurch das Spamaufkommen ggf. höher ist.
Optional: Firewall konfigurieren
Wer vor / auf dem Mailserver eine Firewall betreibt, die den Zugriff auf Ports beschränkt, sollte zuerst alle Mailserver-Ports freischalten:
IMAP: 143/tcp
IMAPS: 993/tcp
Submission: 587/tcp
SMTPS: 465/tcp
SMTP: 25/tcp
ManageSieve: 4190/tcp
Web HTTP: 80/tcp
Web HTTPS: 443/tcp
Denkt unbedingt daran, auch eure IPv6-Ports zu öffnen! - Euer Mailsetup spricht IPv6! :-) Die Ports 143 und 587 können geschlossen bleiben, wenn keine StartTLS-basierenden Verbindung genutzt werden sollen (siehe Hinweis weiter unten).
Start all the things!
Euer neuer Mailserver ist jetzt fertig konfiguriert. Zeit für einen ersten Start!
systemctl start dovecot
systemctl start postfix
(Redis und Rspamd wurden bereits gestartet)
Eine Verbindung zum Mailserver herstellen
Eine Verbindung könnt ihr über jeden IMAP-fähigen E-Mail-Client und den folgenden Verbindungsparametern herstellen:
- IMAP(S)
- Host: imap.mysystems.tld
- Port: 993
- Verschlüsselung: TLS
- (dieser Server gilt auch für domain2 und domain3, falls vorhanden!)
- SMTP(S)
- Host: smtp.mysystems.tld
- Port: 465
- Verschlüsselung: TLS
- (dieser Server gilt auch für domain2 und domain3, falls vorhanden!)
- Managesieve (optional, zur Konfiguration der benutzerspezifischen Sieve-Filterregeln)
- Host: imap.mysystems.tld
- Port: 4190
- Verschlüsselung: StartTLS
- Benutzername: Die vollständige E-Mail-Adresse, also
@<domain.tld>
Sollten Verbindungen über die IMAPS (993) und SMTPS (465) Ports nicht möglich sein, kann auch auf die StartTLS-Ports zurückgegriffen werden:
- IMAP-Server:
- Host: imap.mysystems.tld
- Port: 143
- Verschlüsselung: StartTLS
- SMTP-Server:
- Host: snmtp.mysystems.tld
- Port: 587
- Verschlüsselung: StartTLS
Die IETF (Internet Engineering Task Force) empfiehlt seit 2018 allerdings, auf StartTLS Verbindungen zu verzichten und auf native TLS-Verbindungen zu setzen: https://tools.ietf.org/html/rfc8314. Siehe auch: Golem.de: “Sicherheitsrisiko STARTTLS”
Debugging
Sollten Probleme auftreten, hilft ein Blick ins Log!
Das Rspamd Log kannst du z.B. so einsehen und live mitlesen:
journalctl -f -u rspamd
Postfix so:
journalctl -f -u postfix
… und Dovecot so:
journalctl -f -u dovecot
Falls du alle Mail-relevanten Logs einsehen willst, kannst du das Kommando auch so zusammenfassen:
journalctl -f -u rspamd -u postfix -u dovecot
Datensicherung / Backup
Folgende Verzeichnisse sollten ins Backup aufgenommen werden:
/etc/postfix(Postfix Konfiguration)/etc/dovecot(Dovecot Konfiguration)/etc/rspamd(Rspamd Konfiguration)/var/vmail(E-Mail Daten, Benutzerkonteneinstellungen und Sieve-Filter)/var/lib/rspamd/dkim(DKIM-Schlüssel)/var/lib/redis/(Rspamd-Daten)
Außerdem sollte unbedingt regelmäßig ein MySQL-Dump der vmail Datenbank generiert, in eine Datei geschrieben und ins Backup aufgenommen werden, z.B:
mysqldump vmail > /root/backups/vmail.sql
Das war’s auch schon! Hat dir diese Anleitung geholfen?
Wenn ich dir mit dieser Anleitung helfen konnte, deinen Mailserver aufzusetzen, ist dir das vielleicht ein paar Euro wert.
Wie du dir sicherlich vorstellen kannst, war es eine Menge Arbeit, diese Anleitung zu schreiben und zu erproben. 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.
Wie du mir etwas zukommen lassen kannst, erfährst du hier: Unterstützen
Herzlichen Dank!
Häufige Fehler
Wähle eine Fehlermeldung, um mögliche Lösungen zu öffnen.
Das neue E-Mail System kann keine E-Mails nach extern senden
Neben Fehlermeldungen in den Postfix-Logs sollte auch geprüft werden, ob womöglich der Serverhoster den Versand blockiert. So blockiert Hetzner beispielsweise die TCP Ports 25 und 465 ausgehend per default. Man kann diese Sperre für seinen VPS allerdings über einen Support-Request aufheben lassen. Dann funktioniert der Mailversand wieder wie gewohnt, siehe: “Hetzner FAQ: Warum kann ich keine Mails von meinem Server verschicken?”
“fatal: no SASL authentication mechanisms” / “SASL: Connect to private/auth failed: No such file or directory”
Das Problem: Postfix kann Benutzer nicht authentifizieren, weil in /var/spool/postfix/private kein “auth” 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
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
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.
“5.7.1 Service unavailable; client [1.3.3.7] blocked using zen.spamhaus.org”
Das Problem: Der Mailserver akzeptiert keine E-Mails vom Mailclient und gibt die oben genannte Fehlermeldung zurück.
Das Problem lässt sich sehr einfach lösen, indem statt SMTP-Port 25 der SMTS-Port 465 oder 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 die beiden anderen Ports nicht. Mailclients sollten niemals Port 25 zum Versenden nutzen.
Mailclient verbindet sich nicht zum Server
- Evtl. blockiert der Virenschutz die Verbindung?
- Blockiert die Server-Firewall die Verbindung von außen?
- Ist die richtige Serveradresse angegeben? (siehe Verbindungseinstellungen oben - möglicherweise hat dein E-Mail Client versucht, “schlau” zu sein und hat falsche Verbindungsdaten erraten.)
- Werden die richtigen Ports genutzt und ist der Verschlüsselungstyp richtig eingestellt?
- Wurde als Benutzernamen die vollständige E-Mail Adresse angegeben (und nicht nur der reine Benutzername)?
Changelog im Vergleich zur letzten Anleitung (“Mailserver unter Debian Bullseye v1.2”)
Dovecot:
- Dovecot: Umstellung auf Version 2.4 - Änderungen siehe auch: https://thomas-leister.de/mailserver-migrate-config-to-dovecot-2.4-debian-trixie/
- Dovecot / IMAP:
mail_max_userip_connectionsentfernt, somit gilt default-Wert von 10 statt 50. Sollte für die meisten Setups genügen - verringert potential für Missbrauch bei geknackten Accounts. - Dovecot:
quota_exceeded_messageentfernt (Vereinfachung) - Dovecot:
quota_storage_extrahinzugefügt für “Trash” Mailbox. Ermöglicht es, 10 MB mehr Speicher zu verwenden, wenn der Speicher eigentlich schon voll ist. - Dovecot:
service lmtp:mode = 0600stattmode = 0660 - Dovecot:
service imap-loginundservice managesieve-loginentfernt - Dovecot:
protocol lmtp:quota = yesgesetzt - Dovecot:
service auth>auth-userdbgestrichen, wird nicht benötigt. Vereinfachung. - Dovecot:
service imap-logingestrichen. Wird nicht benötigt. Vereinfachung. - Dovecot:
service managesieve-logingestrichen. Wird nicht benötigt. Vereinfachung. - Dovecot:
ARGON2IDals neuer Passworthash-Algorithmus. Auch als Default. SHA512-CRYPT wird noch genutzt wenn es so in der DB eingetragen ist.
Rspamd:
- Rspamd/ DNS: DKIM Key auf “2026” (statt “2023”) aktualisiert
- Rspamd:
milter_headers.confangepasst fürx-spam-statusfür Mozilla Thunderbird hinzugefügt.x-spam-barundx-spam-levelsentfernt. - Rspamd: Korrekte Berechtigungen für
.mapDateien in/etc/rspamd/local.d/ - Rspamd:
worker-proxy.inceingeführt. Empfohlen von Rspamd Dokumentation. - Rspamd:
/etc/rspamd/local.d/classifier-bayes.conferweitert - Rspamd:
/etc/rspamd/override.d/classifier-bayes.confgelöscht
Postfix:
- Postfix:
smtpd_tls_dh1024_param_fileausmain.cfentfernt (obsolet) - Postfix: Parameter
smtp_tls_mandatory_protocols,smtp_tls_protocolshinzugefügt undsmtpd_tls_mandatory_protocols,smtpd_tls_protocolsvereinfacht. - Postfix: Submission header cleanup entfernt (Vereinfachung)
- Postfix:
milter_protocolentfernt. Default ist okay. (Vereinfachung) - Postfix:
milter_mail_macrosentfernt (Vereinfachung)
Sonstiges:
- acme.sh: Reload command angepasst. Bei Dovecot und Postfix “reload” statt “restart”
- Thema “Autoconfig” entfernt (Vereinfachung)
- TLS Policies entfernt (
smtp_tls_policy_maps,proxy_read_maps, SQL Tabelletlspolicies) - Nginx Webserver: “http2” aus “listen” Directive entfernt, stattdessen “http2 on;” gesetzt (neue Config-Syntax)
- Postfix / Dovecot: Erklärungen zu Parametern entfernt (Vereinfachung)
Changelog zu diesem Beitrag
- v1.0 (2026-02-07): Erster Release