Mail Reputation (postfix, SPF, DKIM)

von Frank Rocholl am Montag, 30. August 2021

Wer einen eigenen Mailserver betreibt kennt das Problem. Einige Mailprovider lehnen die Annahme der Mails dieses Mailservers ab. Oft werden E-Mails einfach anhand der IP-Adresse gebounced. Ich habe die Erfahrung gemacht, dass anscheinend ganze Netzblöcke gebounced werden, weil sich darin IP-Adressen befinden, von denen eventuell schon mal SPAM versendet wurde.

Hier hilft es nur aufmerksam den Logfile des eigenen Mailserver zu beobachten und sich bei Bounces and den Postmaster des anderen Mailserves zu wenden.

Was man selbst machen kann ist, die Reputation des eigenes Mailservers zu erhöhen. Hierzu gibt es ein Reihe von Maßnahmen. Diese seien am Beispiel der Domain any2any.de hier erläutert. Der MTA (MailTransportAgent) dieser Domain ist ein postfix unter Debian 11.

Einfache Maßnahmen

Der zu konfigurierende Mailserver sollte natürlich im Nameservice als Mailexchanger eingetragen sein:

rocholl@heinzelmann:~$ dig +short any2any.de  MX
10 mail.hottemax.org.

Die IP-Adressen sind reverse zum gleichen Namen aufzulösen:

rocholl@heinzelmann:~$ dig +short -t A mail.hottemax.org
94.130.57.108

rocholl@heinzelmann:~$ dig +short -t AAAA mail.hottemax.org
2a01:4f8:c0c:81d7::1

rocholl@heinzelmann:~$ dig +short -x  94.130.57.108
mail.hottemax.org.

rocholl@heinzelmann:~$ dig +short -x  2a01:4f8:c0c:81d7::1
mail.hottemax.org.

Der Mailname des Mailsserver sollte ebenfalls der des Mailsexchangers sein

root@ehli8:~# cat /etc/mailname 
mail.hottemax.org

root@ehli8:~# grep myorigin /etc/postfix/main.cf
myorigin = /etc/mailname

Ein transportverschlüssltes Versenden der E-Mail kann bei gewissen "Gegenstellen" ebenfalls erforderlich sein. Ich verwende einfach letsencrypt Zertifikate. Die notwendigen Einstellungen in der /etc/postfix/main.cf sind

smtpd_tls_cert_file=/etc/letsencrypt/live/mail.hottemax.org/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.hottemax.org/privkey.pem
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

SPF - Sender Policy Framework

Die Verwendung von SPF ist für die Verbesserung der Reputation sehr zu empfehlen.

Hierzu ist im DNS-Zone der Domain ein Record vom Type TXT zu erstellen, der die IP-Adressen des Mailserver enthält.

rocholl@heinzelmann:~$ dig +short TXT any2any.de 
"v=spf1 mx ip4:94.130.57.108 ip6:2a01:4f8:c0c:81d7::1 -all

DKIM - DomainKeys Identified Mail

Etwas aufwändiger ist die Konfiguration von DKIM. Diese soll an der Beispieldoman any2any.de gezeigt werden. Zuerst erfolgt die Installation der opendkim-Pakete

apt install opendkim opendkim-tools

Dann sind die Schlüssel zu erstellen. Eigentümer sollte der opendkim-Nutzer sein. Wenn mehrer Domains mit DKIM versorgt werden sollen, ist es m.E. sinnvoll eigene Verzeichnisse zu erstellen:

mkdir  /etc/dkimkeys/any2any.de
chown opendkim:opendkim /etc/dkimkeys/any2any.de
chmod 700 /etc/dkimkeys/any2any.de

Dann können die Zertifikate erstellt werden. Als Zahl kann eine beliebige Zahl gewählt werden z.B. die alte PLZ von Münster:

sudo -u opendkim opendkim-genkey -D /etc/dkimkeys/any2any.de -d any2any.de -s 4400

Man erhält ein Schlüsselpaar. Der öffentliche Teil des Schlüssels sieht wie folgt aus:

cat dkimkeys/any2any.de/4400.txt 
4400._domainkey IN  TXT ( "v=DKIM1; h=sha256; k=rsa; "
      "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx5vnqsfJyWKKnTtHviUJqrBF6jDDGe81S+UFli5s50epu4m1YWD27wE1MFABWk2M6LfZCKdYG8VT5SDHBRtPv/W4cWvr+0UfZpmwh6/D8gYTgtZi1Eqyg9c1uhYbZTsw6iBZ147+x1K7ciaKy4naU1lRvqzLRjTSFSjtP2dD8kLE/NhGpE5D8ZPcCq2fu+5u9ZV6aoU1ZbEaEm"
      "n7vRx148oZekG8AaqbDPNlm2dDiXQBRpoXTZbLKwj3IAv/y2ejWVi5mtZdGARsvzzwOrJoTJImGV6zdgDMi3M0x9ADAUpvCEkNjEVjSpaksSFB5xmUw2eutv739eyGO+r3yShL2QIDAQAB" )  ; ----- DKIM key 4400 for any2any.de

Dieser ist im Nameservice einzutragen. Es gibt einige Checker im Internet mit dennen das Format des eintrages gecheckt werden kann (z.B. https://www.dmarcanalyzer.com/de/dkim-de/dkim-record-check). Es hat sich gezeigt, dass der Check nur erfolgreich war, wenn der Eintrag ein eine Zeile als ein String angegeben wurde:

rocholl@heinzelmann:~$ dig +short TXT 4400._domainkey.any2any.de
"v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx5vnqsfJyWKKnTtHviUJqrBF6jDDGe81S+UFli5s50epu4m1YWD27wE1MFABWk2M6LfZCKdYG8VT5SDHBRtPv/W4cWvr+0UfZpmwh6/D8gYTgtZi1Eqyg9c1uhYbZTsw6iBZ147+x1K7ciaKy4naU1lRvqzLRjTSFSjtP2dD8kLE/NhGpE5D8ZP" "cCq2fu+5u9ZV6aoU1ZbEaEmn7vRx148oZekG8AaqbDPNlm2dDiXQBRpoXTZbLKwj3IAv/y2ejWVi5mtZdGARsvzzwOrJoTJImGV6zdgDMi3M0x9ADAUpvCEkNjEVjSpaksSFB5xmUw2eutv739eyGO+r3yShL2QIDAQAB"

Wenn die Konfiguration im Nameservice abgeschlossen ist, kann man sich an die opendkim/postfix Konfiguration machen. In /etc/opendkim.com sind folgende Einträge anzupassen bzw. hinzuzufügen.

KeyTable                /etc/dkimkeys/keytable
SigningTable refile:/etc/dkimkeys/signingtable
InternalHosts refile:/etc/dkimkeys/trustedhosts


# Socket for the MTA connection (required). If the MTA is inside a chroot jail,
# it must be ensured that the socket is accessible. In Debian, Postfix runs in
# a chroot in /var/spool/postfix, therefore a Unix socket would have to be
# configured as shown on the last line below.
#Socket                 local:/run/opendkim/opendkim.sock
Socket                  inet:8891@localhost
#Socket                 inet:8891

In der keytable wird der Pfade zu den Schlüsseln konfiguriert:

root@ehli8:~# head /etc/dkimkeys/keytable  
4400._domainkey.any2any.de any2any.de:4400:/etc/dkimkeys/any2any.de/4400.private

Die signingtable konfiguriert

root@ehli8:~# /etc/dkimkeys/signingtable 
# Domain yourdomain.org
*@any2any.de 4400._domainkey.any2any.de

In trustedhostd habe ich die IP-Adresse des mailservers angeben:

root@ehli8:~# /etc/dkimkeys/trustedhosts
==> /etc/dkimkeys/trustedhosts <==
127.0.0.1
94.130.57.108/32

In postfix ist opendkim wie folgt einzubinden:

root@ehli8:~# tail -n 5 /etc/postfix/main.cf
## DKIM configuration
milter_default_action = accept
milter_protocol   = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = $smtpd_milter

Nach Restart der Dienste werden die ausgehende Mails signiert. Im Maillogfile findet sich:

Aug 30 11:15:20 ehli8 opendkim[658]: B3F551F7B4: DKIM-Signature field added (s=4400, d=any2any.de)

Es ist zu empfehlen zu checken, ob auch korrekt signiert wurde. Hier leistet der Checker von appmaildev gute Dienste.

Links