Ich möchte lernen, wie genau Mailserver funktionieren und was DKIM, SPF, DMARC sind und wie das funktioniert und lernen, das richtig einzurichten.
- Ich habe Interesse
Ich möchte lernen, wie genau Mailserver funktionieren und was DKIM, SPF, DMARC sind und wie das funktioniert und lernen, das richtig einzurichten.
Ich kann Mailserver mit Postfix und Dovecot unter Debian bauen. Kann ich gerne zeigen.
Ich kann Mailserver mit Postfix und Dovecot unter Debian bauen. Kann ich gerne zeigen.
Wenn Ingo das als Experte macht, mach ich den Themenpaten.
@iw Wir sind ja gleich verabredet, dann können wir da kurz didaktisch
drüber reden.
Ich bin Themenpate; @iw Experte.
Wir wollen uns an einem Termin treffen und dann dort den Mailserver aufsetzen (jeder bei sich selbst).
Das Treffen soll über ein BBB stattfinden und wird etwa 3/4 Stunden treffen.
Wir wollen uns am Sonntag, den 09.02.2025 ab 10 Uhr (ungefähr 4-5h + Pausen) in einem BBB treffen.
2025-02-09T09:00:00Z→2025-02-09T14:00:00Z
Ich bin da nicht da, kann da jemand die wichtig(st)en Inhalte irgendwie festhalten (also aufschreiben, nicht mit den Händen umklammern oder so)?
Wir schreiben das alles als Sessionbericht auf.
Wer hier mitmacht, sollte idealerweise vorher auch bei Domains, DNS, URLs, (Web-)Server usw. verstehen mitmachen oder die Inhalte von dort verstanden haben.
sub.domain.tld. A 123.456.78
sub.domain.tld. AAAA 2a01:4f9:c013:5c3::1
Man kann nun auf sub.domain.tld.
gehen und das zeigt dann auf die IP-Adresse (also ssh sub.domain.tld
anstatt 123.456.78.9
)
# lsof = List open files
# Prüft, ob ein Port geöffnet ist
# Port 25 ist der Standardport für SMTP
lsof -i :25
SMTP = Simple Mail Transport Protocol
Das Protokoll ist sozusagen eine Norm, um Mails zu transportieren.
Es läuft standardmäßig auf Port 25.
apt install postfix
# Hier dann immer die Standard-Konfiguration wählen
# Also 'Internet site' wählen und den hostname so lassen
# Prüfen, ob installiert:
lsof -nPi :25
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# master 2359 root 13u IPv4 21807 0t0 TCP *:25 (LISTEN)
# master 2359 root 14u IPv6 21808 0t0 TCP *:25 (LISTEN)
Jetzt wären schon Mails empfangbar!
Auf der Clientseite swaks
installieren:
apt install swaks
Client-Software auf dem eigenen Computer - Swaks ist ein Mailclient.
Den installiert man auf seinem eigenen Computer und kann damit dann den neu installierten Postfix-Server testen:
swaks -f mail@meine-mail.de \ # f = from
-t root@domain.tld \ # t = to
-s sub.domain.tld # s = server
# So sieht die Ausgabe dann aus, also die Kommunikation zwischen Server und Client:
=== Trying sub.domain.tld:25...
=== Connected to sub.domain.tld.
<- 220 domain ESMTP Postfix (Debian/GNU)
# Im Moment weiß der Server nur die IP.
# Was kann man damit anfangen?
# - Alle auf Blacklists blockieren
# - Alle über Geoblocks (also z.B. alle aus Russland blockieren)
# 220 = Server bereit und Verbindung angenommen
-> EHLO client-hostname
# Server weiß jetzt den Hostnamen
# Man kann z.B. das DNS auflösen
# Das ist der eigene Hostname, also im eigenen Netz
# Das DNS ist also wahrscheinlich nicht auflösbar
# z.B.: 'dig client-hostname'
# Der Server macht aber normalerweise weiter, weil der Client kann ja später noch Authenitifzierung nachlegen
### Ab hier sagt der Server erstmal, was er alles kann (also z.B. Message size):
<- 250-domain
<- 250-PIPELINING
<- 250-SIZE 10240000
<- 250-VRFY
<- 250-ETRN
<- 250-STARTTLS
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250-SMTPUTF8
<- 250 CHUNKING
-> MAIL FROM:<mail@meine-mail.de> # Absenderadresse
# Hier kann der Server das Absender-DNS abfragen.
# Also: 'dig TXT meine-mail.de'
# Was kann man damit machen?
# - z.B. SPF überprüfen
<- 250 2.1.0 Ok
-> RCPT TO:<root@domain.tld> # Empfänger
# Wollen wir die Email überhaupt annehmen?
# Also: Ist der Empfänger-Server überhaupt einer der konfigurierten?
<** 454 4.7.1 <root@domain.tld>: Relay access denied
# Relay = Mail ist nicht für den Server, sondern soll einfach nur weitergesendet werden
# Das lehnt der Server ab
# Die Mail wäre aber für den Server, also muss man hier Postfix konfigurieren
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
# Zeigt nur nicht-Default Konfigurationen an
postconf -n
# Kürzer als:
cat /etc/postfix/main.cf
Das erste wichtige wäre:
mydestination = $myhostname, domain, localhost.localdomain, localhost
Hier wird der Hostname des Servers genutzt:
hostname -f
# domain
# Das ist 'domain', nicht 'domain.tld' -> Also nicht der FQDN
Es gibt zwei Möglichkeiten: Entweder wir ändern den Hostnamen des Servers oder wir ändern die Postfix-Konfiguration:
# Hostname in der Postfix-Konfiguration setzen
postconf -e "mydestination = domain.tld, tuxilio-1, local.host.localdomain, localhost"
Postfix sagt bei Änderungen mit postconf
Bescheid und lädt sich automatisch neu.
Jetzt kann man swaks
nochmal testen, die Mail sollte jetzt angenommen werden:
=== Trying sub.domain.tld:25...
=== Connected to sub.domain.tld.
<- 220 domain ESMTP Postfix (Debian/GNU)
-> EHLO client-hostname
<- 250-domain
<- 250-PIPELINING
<- 250-SIZE 10240000
<- 250-VRFY
<- 250-ETRN
<- 250-STARTTLS
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250-SMTPUTF8
<- 250 CHUNKING
-> MAIL FROM:<mail@meine-mail.de>
<- 250 2.1.0 Ok
-> RCPT TO:<root@domain.tld>
<- 250 2.1.5 Ok
-> DATA
<- 354 End data with <CR><LF>.<CR><LF>
-> Date: Sun, 09 Feb 2025 11:21:43 +0100
-> To: root@domain.tld
-> From: mail@sub.domain.tld
-> Subject: test Sun, 09 Feb 2025 11:21:43 +0100
-> Message-Id: <20250209112143.016322@ice-pad>
-> X-Mailer: swaks v20240103.0 jetmore.org/john/code/swaks/
->
-> This is a test mailing
->
->
-> .
<- 250 2.0.0 Ok: queued as EE53B414EA # Queue number, die der Server dem Client zurückgibt
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
Auf dem Server kann man die Queue number jetzt nehmen und die Logs dazu ansehen:
journalctl
ist ein Client, um die Log-Datenbank abzufragen.
# journalctl -e = ans Ende springen
# journalcrl -g = grep
journalctl -eg <Queue number>
# Also z.B.:
# journalctl -eg EE53B414EA
# Bzw:
journalctl -e --facility=mail | grep -C1 <Queue number>
# Das -C1 heißt Context, also dass eine Zeile oben drüber und dadrunter angezeigt wird
# Also z.B.:
# journalctl -e --facility=mail | grep -C1 EE53B414EA
# Mit 'journalctl -f' kann man alle neuen Logs ansehen, die nach der Ausführung ankommen
journalctl -f
Zum Schutz vor Sicherheitslücken läuft nur smtpd
(weil man für das Öffnen von Ports kleiner 1024 root-Rechte braucht) und gibt ihn an den Cleanup-Prozess weiter. Der sorgt dafür, dass keine Buffer Overflows und keine nichterlaubten Zeichen im Text sind.
Der Cleanup-Prozess gibt das dann an den Queue-Manager weiter und entscheidet Mail für Mail, was er mit der Mail macht.
Der gibt ihn weiter und local
speichert das in der Mailbox.
Man sieht die Mails mit:
tail /var/mail/root
swaks -f mail@meine-mail.de \ # f = from
-t root@domain-2.tld \ # t = to
-s sub.domain.tld # s = server
Das sollte jetzt ein Relay access denied
geben.
Wir wollen jetzt auch Mails verschicken könne.
swaks -f root@domain.tld \ # f = from
-t mail@meine-mail.de \ # t = to
-s sub.domain.tld # s = server
Das gibt im Moment noch ein Relay access denied
geben - schließlich soll nicht jeder Mails verschicken können.
Dazu nutzen wir Authenifizierung, also melden uns am Server an.
SASL = Simple Authentication and Security Layer
Die Idee ist, dass Postfix das SASL von Dovecot nutzt. Dovecot ist ein IMAP-Server, der Mails zwischen Client und Server transportiert.
Wichtigste Befehle mit Dovecot - Übersicht: https://wiki.lab.linuxhotel.de/doku.php/lpi2:dovecot-imapd
Erstmal braucht man IMAP:
apt install dovecot-imapd
Prüfen, ob es läuft:
lsof -nPi :imap
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# dovecot 38992 root 34u IPv4 81464 0t0 TCP *:143 (LISTEN)
# dovecot 38992 root 35u IPv6 81465 0t0 TCP *:143 (LISTEN)
doveconf -n
# Listet alle Konfigurationsdateien in /etc/dovecot/ als eine auf
Also legen wir einen neuen Nutzer an:
# Nutzer hinzufügen
ueradd -m -s /bin/false USERNAME
passwd USERNAME
# Dovecot testen
doveadm user USERNAME
doveadm auth login USERNAME
Im Moment werden Mails hier gespeichert:
doveconf mail_location
mail_location = mbox:~/mail:INBOX=/var/mail/%u
Man hat also alle Mails, immer in /var/spool/mail/root
.
less /var/spool/mail/root
Um eine Mail zu lesen, muss man also die gesamte Datei öffnen. Je mehr Mails es werden, desto langsamer wird es.
Man will die aber im home
-Verzeichnis des Nutzers speichern.
Wir möchten jetzt ein Maildir nutzen, sodass eine Email = eine Datei ist.
Also schreiben wir die Zeile
mail_location = maildir:~/Maildir
in die Datei /etc/dovecot/local.conf
. Wenn man Dine in diese Datei schreibt, haben die Vorrang zu allen anderen Dateien.
Und überprüfen:
doveconf mail_location
# mail_location = maildir:~/Maildir
Das geht z.B. mit dbus
über sog. Sockets. Das sind dann normalerweise TCP- und UDP-Sockets.
Dovecot soll bei uns über Sockets lauschen und Postfix soll die Mails rüberschieben.
Das Protokoll dazu heißt LMTP und ist so ähnlich wie SMTP.
apt install dovecot-lmtpd
In /etc/dovecot/local.conf
:
auth_username_format = %Ln
(Siehe https://wiki.lab.linuxhotel.de/doku.php/lpi2:postfix-dovecot-imapd)
Postfix läuft aber unter chroot
, also darf nur unter /var/spool/postfix
.
Also sagen wir Dovecot, dass es den Socket unter dem Postfix-Dir ablegen soll:
Also in /etc/dovecot/local.conf
:
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
user = postfix
group = postfix
mode = 0660
}
}
Testen:
systemctl restart dovecot.service
lsof /var/spool/postfix/private/dovecot-lmtp
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# dovecot 39612 root 26u unix 0x000000001bc34063 0t0 86067 /var/spool/postfix/private/dovecot-lmtp type=STREAM (LISTEN)
Jetzt noch Postfix konfigurieren:
postconf mailbox_transport
# mailbox_transport =
postconf -e 'mailbox_transport = lmtp:unix:private/dovecot-lmtp'
postconf mailbox_transport
# mailbox_transport = lmtp:unix:private/dovecot-lmtp
Jetzt nochmal testen (vom Client):
swaks -f mail@meine-mail.de \ # f = from
-t USERNAME@domain.tld \ # t = to
-s sub.domain.tld # s = server
Das sollte wieder eine Queue number geben, die man wieder abrufen kann.
Jetzt testen wir noch die Authentifizierung (vom Server):
curl -v --url imap://localhost:143 --user USERNAME
In: /etc/dovecot/local.conf
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
# Outlook braucht noch 'login', Standard ist 'plain'
auth_mechanisms = plain login
Testen:
doveconf auth_mechanisms
Jetzt soll Dovecot auch Postfix auth nutzen:
postconf -e 'smtpd_sasl_type = dovecot'
postconf -e 'smtpd_sasl_path = private/auth'
postconf -e 'smtpd_sasl_auth_enable = yes'
Neu laden und testen:
systemctl restart dovecot.service
lsof /var/spool/postfix/private/auth
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# dovecot 39940 root 55u unix 0x00000000ccbd44d1 0t0 89249 /var/spool/postfix/private/auth type=STREAM (LISTEN)
Und clientseitig mit swaks
:
swaks -f mail@meine-mail.de \ # f = from
-t USERNAME@domain.tld \ # t = to
-s sub.domain.tld \ # s = server
-a -au USERNAME # Authentifizierung
Dabei sollte im swaks neu nach einem Passwort gefragt werden und dort 250-AUTH PLAIN LOGIN
stehen.
Dann kann man wieder Logs ansehen mit
journalctl -e --facility=mail | grep -C1 <QUEUE ID>
Mit DKIM wird die Mail vom Server signiert. Es gibt dann jeweils einen Private und einen Public key, wobei der Public key im DNS steht.
Es gibt bei der DNS-Auflösung zwei Möglichkeiten:
Vorwärts: Domain Name → IP
Rückwärts (das wäre dann rDNS / reverse DNS): IP → Domain Name
Man kann das abfragen mit:
dig -x 123.456.789.1
Der ist dafür da, dass Server wissen, an wen sie sich wenden müssen.
Wir wollen an domain.tld senden, aber der Server ist unter sub.domain.tld:
domain.tld. MX 10 sub.domain.tld
Man kann auch mehrere MX Records machen, damit, falls ein Server ausfällt, noch Mails empfangen werden können.
Die Zahl hinter MX sagt, welches der bevorzugte Server ist. Dabei ist die kleinste Nummer der bevorzugste.
postconf -e 'relay_domains = $mydestination, andere-domain.tld.'
postqueue -p
Zeigt die Queue.
sendmail -q
versucht, Mails neu zu senden.
postsuper -d <QUEUE ID>
löscht etwas aus der Queue.
KLAPPT LEIDER NOCH NICHT
postconf -e 'smtpd_helo_restrictions = permit_mynetworks, reject_invalid_helo_hostname'
Mit swaks
sollte es jetzt nicht mehr klappen:
swaks -f mail@meine-mail.de \ # f = from
-t USERNAME@domain.tld \ # t = to
-s sub.domain.tld \ # s = server
-a -au USERNAME # Authentifizierung
-ap 'PASSWORD' # Passwort
Wir wollen uns am 2025-02-23T12:00:00Z→2025-02-23T14:00:00Z treffen, wo @nik uns rspamd
erklärt.
Das muss leider verschoben werden, da wir fast alle Kick-Offs der neuen AGs auf diesen Tag planen mussten.
Wir wollen uns für 2-3 h treffen, um rspamd erklärt zu bekommen.
Ich gehe davon aus, dass Sonntag, 30.3. gemeint war