← Zurück zur Übersicht Postfix / PMG / Sieve

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.