Einen zentralen Mailserver (Mail-Gateway) mit weiteren Hosts nutzen


Wer bereits ein Mail-System für den Versand und Empfang von E-Mails aufgesetzt hat, weiß, dass das je nach Funktionsumfang viel Arbeit sein kann. Wenn nicht nur ein Host E-Mails verschicken soll, sondern mehrere, kann es sich lohnen, einen zentralen Mailserver als “Mail-Gateway” zu nutzen. Das bedeutet: Für den Versand von E-Mails in das Internet und den Empfang aus dem Internet ist nur dieser eine Mailserver zuständig. Alle weiteren Hosts (“externe Hosts”) benötigen keine aufwendige Mailserver-Konfiguration, sondern kommen mit einer Minimalkonfiguration aus, welche es ihnen erlaubt, beim Versand auf das Gateway zurückzugreifen. DKIM, SPF und weitere Versand-spezifische Merkmale müssen dann nur auf dem Gateway eingerichtet und gewartet werden.

Mailserver Gateway

  • “Gateway”: Der Server, auf dem das Mailsystem eingerichtet ist.
  • Host” / “externer Host”: Ein Server, der für den Mailversand den Mailserver nutzen soll.
Im folgenden setze ich voraus, dass das Mail-Gateway nach meiner Mailserver-Anleitung aufgesetzt ist. Prinzipiell funktioniert es aber ähnlich auch mit anderen Gateways

Postfix-Grundkonfiguration auf dem externen Host

Externen Mailempfang auf den Hosts abschalten

Ẁenn ein Host nur für den Versand verwendet wird, kann der smtpd-Teil von Postfix abgeschaltet werden. In der Datei /etc/postfix/master.cf werden smtpd und ggf. submission-Teil einfach auskommentiert:

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
#smtp      inet  n       -       -       -       -       smtpd
#smtp      inet  n       -       -       -       1       postscreen
#smtpd     pass  -       -       -       -       -       smtpd
#dnsblog   unix  -       -       -       -       0       dnsblog
#tlsproxy  unix  -       -       -       -       0       tlsproxy
#submission inet n       -       -       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#smtps     inet  n       -       -       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

Eine main.cf nur für den Nachrichtenversand

In der /etc/postfix/main.cf müssen nur wenige Einstellungen festgelegt werden. Diese werden je nach Art des Setups (im Folgenden) erweitert.

myhostname = host1.mydomain.tld
inet_protocols = all
inet_interfaces = 127.0.0.1, 10.8.0.1

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

tls_ssl_options = NO_COMPRESSION
tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA


### Ausgehende Verbindungen (SMTP Client)

smtp_tls_security_level = dane
smtp_dns_support_level = dnssec
smtp_host_lookup = dns, native
smtp_tls_note_starttls_offer = yes
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_ciphers=high
smtp_tls_CAfile =/etc/ssl/certs/ca-certificates.crt
smtp_tls_loglevel = 0

(Bitte anpassen!)

Fall 1: Externer Host mit statischer IP-Adresse

Hosts, die über eine statische IP-Adresse (also eine immer gleich bleibende Adresse) erreichbar sind, kann sehr einfach der Zugriff auf das Gateway erlaubt werden. Dazu wird z.B. Host1 mit der IP-Adresse 10.8.0.1 in der Konfiguration des Gateways in mynetworks (main.cf) aufgenommen, z.B. so:

mynetworks =    127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
                10.8.0.1/32

Anwenden der neuen Einstellungen auf dem Mail-Gateway mail.mysystems.tld:

systemctl reload postfix

Auf dem externen Host host1.mydomain.tld wird Postfix via relayhost angewiesen, sämtliche Mails, die nicht lokal zugestellt werden können, an das Gateway weiterzureichen. Die Datei /etc/postfix/main.cf auf dem Host wird dazu um folgende Zeilen erweitert:

##
## Alle E-Mails an nicht-lokale Empfänger an das Gateway weiterleiten
##

relayhost = mail.mysystems.tld

Anwenden der Einstellungen auf dem externen Host host1.mydomain.tld

systemctl reload postfix

Fall 2: Externer Host mit dynamischer IP-Adresse (z.B. Homeserver)

Wenn ein Host über keine statische IP-Adresse verfügt, wie es z.B. bei den meisten Homeservern der Fall ist, muss zu einem etwas komplizierteren Setup gegriffen werden. In diesem Fall kann der Host nicht über die IP-Adresse autorisiert werden, sodass wir auf die normale SMTP-Authentifizierung zurückgreifen. Letztendlich ist die Postfix-Instanz auf dem Host für das Gateway also nichts weiteres als ein ganz normaler E-Mail-Client. Daher muss das Gateway auch über den Submission Port 587 angesprochen werden - nicht über Port 25!. Fügt die folgende Zeile am Host in der /etc/postfix/main.cf an:

relayhost = [mail.mysystems.tld]:587

Für die Authentifizierung wird außerdem der folgende Block unten angefügt:

##
## Authentifizierung am Relayhost
##

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_passwd
smtp_sasl_security_options = noanonymous

Die Postfix-Instanz auf dem Host meldet sich wie ein normaler MUA (Mail user Agent) an, und muss daher auch ein entsprechendes Mailkonto auf dem Mail-Gateway besitzen, z.B. host3@mysystems.tld. Die dazugehörigen Zugangsdaten werden in die Datei /etc/postfix/relay_passwd eingetragen:

[mail.mysystems.tld]:587 host3@mysystems.tld:meinpasswort

Via

postmap /etc/postfix/relay_passwd

wird eine Datenbank-Datei erzeugt, die von Postfix gelesen werden kann. Bei jeder Änderung an relay_passwd muss dieses Kommando erneut ausgeführt werden.

Eine Besonderheit gibt es bei dieser Art des Setups noch: Da Postfix einen normalen Benutzer-Account für die Verbindung zum Gateway nutzt, ist er auch den Beschränkungen unterworfen, die für solche Accounts gelten. So dürfen Benutzer gemäß meines Mailserver-Setups nur E-Mails in ihrem eigenen Namen versenden. Damit soll Adressfälschung bei ausgehenden E-Mails verhindert werden. Der Host dürfte also nur E-Mails mit dem Absender host3@mysystems.tld erzeugen. Alles andere würde vom Gateway blockiert werden. Nun senden einige Tools wie z.B. mdadm aber standardmäßig im Namen root@host3.mydomain.tld - der Versand würde scheitern.

Die Lösung für das Problem ist ein Neu-Schreiben des “Envelope-From”: E-Mails, die vom Host ausgehen, werden so umgeschrieben, dass deren Absender immer host3@mysystems.tld lautet. Damit wird das Problem umgangen. Zum Umschreiben wird die Einstellung sender_canonical_maps genutzt. Fügt das folgende Snippet unten an die main.cf an:

###
### Adressen von Absendern, z.B. root@host3.mydomain.tld müssen nach host3@mysystems.tld umgeschrieben werden
### Für außenstehende Systeme darf es nur host3@mysystems.tld als Absender geben.
###

sender_canonical_maps = hash:/etc/postfix/rewrite_from

… und erzeugt eine neue Datei /etc/postfix/rewrite_from mit folgendem Inhalt:

@host3.mydomain.tld    host3@mysystems.tld

Auch diese Datei wird via postmap in eine für Postfix lesbare Datenbank umgewandelt.

postmap /etc/postfix/rewrite_from

Anwenden der Einstellungen:

systemctl reload postfix

Lokale Mailzustellung auf externen Hosts verhindern und Mails weiterleiten

Standardmäßig werden E-Mails, die beispielsweise an den lokalen “root”-User eines externen Hosts gehen, nicht über das Gateway geschickt. Benachrichtigungsmails bzgl. RAID-Status, APT-Status und Mails von weiteren Softwarepaketen bleiben dann lokal in /var/mail/root liegen und geraten in Vergessenheit. Durch ein Umschreiben des Empfängers von selbst erzeugten Mails können diese Systemmails aber abgegriffen und an eine beliebige, andere Mailadresse weitergeleitet werden. Dazu wird in /etc/postfix/main.cf auf dem jeweiligen Host folgendes unten angefügt:

###
### Lokale Empfänger *@host1 (z.B. "root") umschreiben
### damit Mails nicht in /var/mail/root abgelegt werden, sondern an beliebigen Empfänger weitergeleitet werden.
###

recipient_canonical_maps = hash:/etc/postfix/rewrite_local_to

Die zugehörige Datei /etc/postfix/rewrite_local_to wird mit folgendem Inhalt angelegt:

@host1.mydomain.tld       postmaster@mysystems.tld

Damit würden sämtliche Mails an lokale Nutzer des Hosts an postmaster@mysystems.tld weitergeleitet werden. Wer das Umschreiben des Empfängers beschränken will, kann statt @host1.mydomain.tld auch vollständige Adressen wie z.B. root@host1.mydomain.tld angeben.

Nach dieser Konfigurationsänderung ist es notwendig, die passende Datenbankdatei für Postfix zu erzeugen und den Dienst neu zu starten:

postmap /etc/postfix/rewrite_local_to
systemctl reload postfix

Das Postmap-Kommando muss nach jeder Änderung in der Datei rewrite_local_to wiederholt werden!

Setup testen

Auf den Hosts kann das Verhalten von Postfix überprüft werden, indem eine kleine Testmail verschickt wird:

echo "Testmail an eine beliebige E-Mail-Adresse" | mail -s "Testmail" postmaster@mysystems.tld

Ob auch E-Mails an den lokalen “root” User eines Hosts erfolgreich eingesammelt und weitergeleitet werden, kann hiermit überprüft werden:

echo "Testmail an den lokalen root-User" | mail -s "Testmail" postmaster@mysystems.tld