Die sichere PMG-Pull-Schleife
Die einfachste Lösung wäre ein anpassen des MX Eintrags im DNS, das mein Provider komfortabel ermöglicht. Dann würde es keine Fragen oder Probleme geben. Aus Sicherheitsgründen will ich aber meinen internen Mailserver nicht direkt per Push-Verfahren (Port 25) aus dem Internet erreichbar haben. Außerdem werden bei einem Ausfall meines Heimservers oder der Internetverbindung die Mails bei meinem Provider trotzdem angenommen und ich kann sie jederzeit dort ansehen oder abholen.
Das Problem für mich: PMG unterstützt kein Multi-Drop -
außer man wühlt in den Tiefen der Konfigurationsdateien herum und hofft, daß die
Änderungen das nächste Update überleben bzw. man sich dann noch an die
Änderungen erinnert. Und wenn dann was im modifizierten PMG nicht glatt läuft,
steht man vermutlich ziemlich alleine da. Das lokale Postfix kann dagegen recht
gut und zuverlässig mit Multi-Drop umgehen.
Die Lösung: Ein aktives Pull-Verfahren via
Fetchmail auf meinen internen Postfix-Server, gepaart mit einer
geschickten Routing-Schleife durch das Proxmox Mail Gateway
(PMG) und zusätzlich serverseitigen Sieve-Filtern auf
dem Rückweg im Dovecot.
1. Der Aufbau der Routing-Schleife
Damit die Mails
nicht in einer unendlichen Endlosschleife im Kreis laufen, nutzt Postfix zwei
getrennte Ports:
Mails, die über Fetchmail auf dem Port 25 in mein Postfix
eingeliefert werden, werden über den content_filter Eintrag direkt
ungefiltert an das PMG übergeben. Das PMG scannt die Mails und liefert sie
zurück auf dem eigens dafür geöffneten Port z.B. 25025 an
Postfix zurück. Hier erst erfolgt die finale Zustellung an Dovecot und seine
Filter.
2. Postfix main.cf & master.cf Anpassungen
In der
main.cf wird das PMG als Content-Filter definiert. Wichtig: Die IP
des PMG [192.168.X.X] muss in eckige Klammern gesetzt werden, damit Postfix
nicht nach DNS-Einträgen sucht:
# Mails von Port 26 (!) direkt an das PMG schicken:
content_filter = smtp:[192.168.X.X]:26
Hinweis:Port 26 ist der Posteingang vom INTERNEN NETZ am PMG
In der master.cf wird der Rückgabe-Port 25025
geöffnet und für diesen der Content-Filter explizit abgeschaltet:
# Neuer Eingang für Mails, die VOM PMG ZURÜCKKOMMEN 25025
inet n - y - - smtpd
-o smtpd_authorized_xforward_hosts=127.0.0.0/8,192.168.X.X/32
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=
-o mynetworks=127.0.0.0/8,192.168.X.X/32
-o receive_override_options=no_unknown_recipient_checks
-o content_filter=
3. Der Fetchmail-Dienst
Fetchmail arbeitet als lokaler
Daemon und lädt einen externen Catch-All-Sammelaccount (MultiDrop) im sicheren POP3-Verfahren über
Port 995 herunter. Für die Testphase ist die Option keep sinnvoll,
um Mailverluste zu vermeiden:
poll pop3.mailprovider.com protocol imap
no envelope
localdomains meinedomain.tld
user "usernamevonsammelaccount"
password "strenggeheim"
is * here
ssl
keep
Hinweis:Im Produktivbetrieb wird das keep durch ein no keep ersetzt.
Fetchmail übergibt die Mail(s) dann an Postfix auf Port 25, daß aus den angelieferten Mails den richtigen Empfänger für die lokale Zustellungs auslesen kann.
4. Serverseitige Spam-Sortierung mit Sieve
Sobald eine Mail vom PMG als Spam erkannt wurde, wird der Header mit dem X-Spam-Flag:
YES ergänzt.
Da ist mir nicht so ganz klar, wie PMG Mails, die vom internen Zugang angenommen werden
(wo ja alle Mails von außen ankommen), behandelt. Die KI meint, sie werden nicht
gescannt - die Testmails von außen wurden das auch nicht, aber spätere schon. Das ist aber egal, da ja
schon All-inkl.com einen Spamfilter mitbringt und vom PMG wohl ALLES, egal woher es kommt, auf Viren
gescannt wird.
Die erste Sortierung übernimmt dann das Dovecot-Sieve-Plugin mit einem globalen Script vollautomatisch
auf dem Server, noch bevor der Nutzer sein Postfach öffnet.
Das globale Skript unter /var/vmail/sieve/global_spam.sieve sieht wie
folgt aus:
require ["fileinto", "mailbox"];
if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam-Status"
"Yes") { fileinto "Junk"; stop; }
Nach dem Kompilieren des Scripts mit sievec landen alle PMG-erkannten Werbemails ohne
Benutzerzutun direkt im Junk-Ordner.
Danach kommen dann noch die Benutzer-spezifischen Sieve-Filter, die man z.B. elegant über das Roundcube-Sieve-Plugin erstellen kann. So hat man immer ein sauberen Posteingang und kann Routine Mails gleich wegsortieren lassen, ohne die Filter auf jedem Arbeitsplatz einrichten zu müssen.