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.
- “Gateway”: Der Server, auf dem das Mailsystem eingerichtet ist.
- Host" / “externer Host”: Ein Server, der für den Mailversand den Mailserver nutzen soll.
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" root