Mailserver verstehen und einrichten

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
0 Teilnehmer
1 „Gefällt mir“

Ich kann Mailserver mit Postfix und Dovecot unter Debian bauen. Kann ich gerne zeigen.

1 „Gefällt mir“

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.

  • Samstag, 25.01.
  • Samstag, 08.02.
  • Sonntag, 09.02
  • Samstag, 15.02.
  • Sonntag, 16.02.
  • Samstag, 22.02.
  • Sonntag, 23.02.
0 Teilnehmer

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:00Z2025-02-09T14:00:00Z

1 „Gefällt mir“

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.

Mailserver verstehen und einrichten - Session am 09.02.25

Vorraussetzung:

  • Ein Server mit Debian
  • Ein Client auf dem z.B. Debian läuft

DNS-Einrichtung

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)

SMTP

Schauen, ob schon ein Mailserver läuft

# lsof = List open files
# Prüft, ob ein Port geöffnet ist
# Port 25 ist der Standardport für SMTP
lsof -i :25

SMTP - Was ist das?

SMTP = Simple Mail Transport Protocol

Das Protokoll ist sozusagen eine Norm, um Mails zu transportieren.

Es läuft standardmäßig auf Port 25.

SMTP-Software installieren

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!

Testen!

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.

Postfix konfigurieren

# 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.

Was hat Postfix mit der Mail jetzt gemacht?

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 

Gegenprobe: Nimmt der Server jetzt Mails als Relay an?

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.

IMAP

Mails relayen

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

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.

Dovecot

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)

Dovecot konfigurieren

doveconf -n
# Listet alle Konfigurationsdateien in /etc/dovecot/ als eine auf

Systembenutzer nutzen

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

Postfix soll Emails an Dovecot weitergeben

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

Wie können Dovecot und Postfix jetzt miteinander spechen?

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.

LMTP von Postfix → Dovecot

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

SASL vom Dovecot auch für Postfix nutzen

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>

Mails an alle verschicken

DKIM

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.

rDNS

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

MX record

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.

Backup-Server konfigurieren

postconf -e 'relay_domains = $mydestination, andere-domain.tld.'

Andere Befehle

postqueue -p

Zeigt die Queue.

sendmail -q

versucht, Mails neu zu senden.

postsuper -d <QUEUE ID>

löscht etwas aus der Queue.

Mailserver sicherer machen

Wenn jemand seinen FQDN nicht sagen kann

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

Weitere Dinge zum selber porbieren:

  • Keine Systemnutzer verwenden: https://wiki.lab.linuxhotel.de/doku.php/lpi2:dovecot-virtual-domains & https://wiki.lab.linuxhotel.de/doku.php/lpi2:postfix-virtual-domains
  • DKIM nutzen: PDF in Projektchat Hack’n’Fun

Wir wollen uns am 2025-02-23T12:00:00Z2025-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.

  • Samstag, 15.03.
  • Sonntag, 16.03.
  • Samstag, 29.03.
  • Sonntag, 29.03.
0 Teilnehmer

Ich gehe davon aus, dass Sonntag, 30.3. gemeint war

1 „Gefällt mir“