Der mit Abstand meiste Müll lässt sich durch eine Prüfung des gegnerischen SMTP-Partners aussondern.
Das Ablehnen von Mail in dieser Phase ist auch rechtlich gesehen eine gute Idee, weil auf diese Art und Weise abgelehnte Mails wohl nicht als zugestellt gelten nach derzeitiger Rechtsauffassung.
So prüfe ich auf vorhandene DNS-Einträge für die Absender-IP-Adresse. Die gegnerische IP-Adresse wird auch durch zwei Blacklisten geprüft. So fallen schon mal viele Mails aus Bot-Netzen etc. raus, weil die befallenen PCs entweder nur über eine IP-Adresse ohne zugehörigen DNS-Eintrag verfügen bzw. weil die IP-Adressen meist sehr schnell auf einer Blacklist erscheinen, wenn sie denn mal missbraucht wurden.
Wenn Hosts auf Grund dieser Rules auffällig werden, werden sie zudem durch das kleine Script smtpblock für eine Weile daran gehindert, erneute Zustellversuche zu unternehmen. Diese Maßnahme allein senkt die Last des MTA erheblich.
In meiner main.cf steht dazu:
smtpd_client_restrictions = permit_mynetworks,check_client_access hash:/etc/postfix/client_is_good,reject_unknown_client,reject_rbl_client zen.spamhaus.org,reject_rbl_client bl.spamcop.net
Die beiden Einträge reject_rbl_client zen.spamhaus.org und reject_rbl_client bl.spamcop.net prüfen, ob die absendende IP-Adresse schon mal negativ aufgefallen ist oder ob diese Adresse zum dynamischen Einwahlpool von Internetprovidern gehört – von beiden Gruppen nehmen wir hier keine Mails an.
Der Eintrag reject_unknown_client entsorgt Verbindungsversuche von „Mailservern“ ohne DNS-Eintrag – meist verbergen sich hinter diesen Hosts verseuchte PCs von arglosen Anwendern, auf denen ein Bot sein Unwesen treibt.
Das permit_mynetworks sorgt dafür, dass die anderen Prüfungen auf Verbindungen aus dem internen Netz nicht geprüft werden.
Der Eintrag check_client_access hash:/etc/postfix/client_is_good ist eine Whitelist, die dafür sorgt, dass auch falsch konfigurierte MX von Partnern und Kunden nch Mails abladen können. Dazu gibt es die Datei /etc/postfix/client_is_good mit etwa folgendem Inhalt:
1.2.3.4 OK
Diese Zeile sorgt nach einem postmap sender_is_good dafür, dass Mails von 1.2.3.4 angenommen werden ohne erst eine Prüfung im DNS zu machen bzw. eine Blacklist dafür zu befragen.
Häufig sieht man in den Logfiles, dass ein MX versucht dutzende oder hunderte Verbindungen gleichzeitig aufzumachen. Diese bleiben dann offen bis zum Timeout. Da der Postfix so konfiguriert ist, dass ein Timeout erst sehr spät erfolgt und da die gleichzeitig möglichen Verbindungen limitiert sind, kann dies zu einem Denial of Service führen. Dies kann man ändern, indem man in der main.cf die Timeouts ändert. Folgende Werte haben sich bei mir bewährt:
smtp_connection_reuse_time_limit = 40s
smtpd_timeout = 20s
smtpd_idle_timeout = 20s
Ein weitere Aufgabe besteht darin, einmal negativ aufgefallene Clients von der Verbindungsaufnahme zu unserem Mailsystem abzuhalten, dazu dient mir ein kleines Perlscript mit dem Namen smtblock. Dieses Script parst das Maillog nach abgelehnten Mails aus oben genannten Regeln und erstellt eine Firewallregel für auffällige IP-Adressen. Aller einer Stunde werden diese Blockeinträge wieder gelöscht. Es gibt sicher Optimierungsmöglichkeiten dafür, so werden derzeit auch doppelte Einträge erzeugt. Ausserdem ist das Script ein Resourcenfresser, da es mehrfach pro Minute durch das Maillog auf Suche geht. Bei MTAs an der Lastgrenze ist das sicher keine gute Idee – für mich funktioniert das prima. Für Fehlerfreiheit garantiere ich nicht – für Schäden durch den Einsatz dieses Scripts hafte ich nicht!