[OT] Exim + SpamAssassin = CPU/Memory killer
Liebe Liste, ich hoffe das jemand eine Kombination aus Exim (+exiscan) und SpamAssassin auf einem Produktionssystem einsetzt. Bei unserem Testsystem bin ich auf jeden Fall auf einige schwerwiegende Probleme gestossen. Ich habe SpamAssassin und Exim (die aktuellsten Versionen) installiert und konfiguriert. Beides funktioniert auch wunderbar und Spam wird auch zu 99% gefiltert. Nach einem Spam(Load)-Test auf den Server (1.000 Nachrichten) war auf dem Server schon nach kurzer Zeit kein Speicher mehr verfügbar. Logischerweise fing die Box dann an auf den Swap auszulagern und einige Minuten später war nicht mal mehr das Keyboard für jegliche Eingaben empfänglich. Der einzige Weg den Rechner wiederzubeleben ist der Reset-Taster -- nicht so toll, vor allem für Fernwartung, dachte ich mir. Wie es aussieht versucht Exim alle reinkommenden Nachrichten auf einmal zu Scannen und überfordert somit den Spamd, welcher unter 'top' in einem einzigen Prozess den ganzen Speicher aufbraucht. Der Kernel fängt zum Schluss dann an andere Prozesse wie die mysql-Datenbank zu killen. Ich lasse SpamAssassin als spamd laufen, und Exim (wie in der exiscan-Doku beschrieben) über eine lokale Socket drauf zugreifen. Es macht jedoch kein Unterschied wenn ich TCP als Socket verwende. Mit der "-m 2" Option habe ich schon versucht die Prozesse von Spamd zu limitieren, hat aber auch nichts gebracht. Spamd wird 'at SMTP-time' aufgerufen, dass heisst, noch während die Nachricht vom anderen Server empfangen wird kann diese mit einem möglichen Spam-Score direkt zurückgewiesen werden. Falls jemand dieses Problem schon hatte, gibt es eine Lösung? Gibt es eine Option in Exim um zu verhindern dass Spamd überfordert wird? PS: Tut mir leid wenn ich hier frage, aber auf google-groups und anderen Listenarchiven finde ich keine sinnvollen Informationen -- es scheint jedoch als wenn ich nicht der einzige bin der dieses Problem hat. Ich bin wirklich dankbar für jede Hilfe! -- Mit freundlichen Grüßen, Bastian Bense
Hallo, auf einem Produktionssystem nicht, aber auf der Kiste, die mal meine Diplomarbeit werden soll :-) Bin leider im Moment krank und deshalb nicht in der Firma, wo die Kiste steht, sonst könnte ich das ausprobieren. Es sieht aber so aus, als ob du recht hättest und Exim einfach alles gleichzeitig annimmt und zuzustellen versucht. In jedem Fall sollten auf einem Produktions-Server Resourcen-Limits gesetzt werden, das geht bei Exim schon mit Bordmitteln recht gut. Schau dir am besten die Doku an und zwar u.a. folgende Optionen: smtp_accept_queue,smtp_accept_queue_per_connection,queue_only, queue_only_load, queue_smtp_domains In der Doku sind noch weitere Optionen referenziert, die ich jetzt nicht mehr alle auswendig weiss. Läuft auf jeden Fall darauf raus, dass Exim nach einer bestimmten Anzahl Mails oder bei bestimmter Systemlast aufhört, gleichzeitige Zustellversuche zu unternehmen und die Mails nur in die Queue stellt. Wenn du schon dabei bist, prüfe auch die exiscan-Konfiguration. Per Default ist das Ding u.U. auch anfällig für gezippte Riesen-Attachments. Man kann z.B. ein 10GB grosses File anlegen mit einem Bit am Anfang und einem am Ende und jeder Menge Nullen dazwischen, das gibt gezippt so ungefähr 1KB. Wenn exiscan bzw. der Virenscanner versucht, das auszupacken und zu scannen, dürfte in etwa das gleiche Problem auftreten. Bye, Andreas
On Thu, Dec 09, 2004 at 03:42:30PM +0100, Bastian Bense wrote:
Liebe Liste,
ich hoffe das jemand eine Kombination aus Exim (+exiscan) und SpamAssassin auf einem Produktionssystem einsetzt. Bei unserem
Klar!
Testsystem bin ich auf jeden Fall auf einige schwerwiegende Probleme gestossen. Ich habe SpamAssassin und Exim (die aktuellsten Versionen) installiert und konfiguriert. Beides funktioniert auch wunderbar und Spam wird auch zu 99% gefiltert.
Nach einem Spam(Load)-Test auf den Server (1.000 Nachrichten) war auf dem Server schon nach kurzer Zeit kein Speicher mehr verfügbar.
Das ist so -- bei viel Speicherbedarf hilft nur viel Speicher. (Oder Auslagern zB des Scanners auf zusaetzliche Maschinen)
Logischerweise fing die Box dann an auf den Swap auszulagern und einige Minuten später war nicht mal mehr das Keyboard für jegliche Eingaben empfänglich. Der einzige Weg den Rechner wiederzubeleben ist der Reset-Taster -- nicht so toll, vor allem für Fernwartung, dachte ich mir.
Wie es aussieht versucht Exim alle reinkommenden Nachrichten auf einmal zu Scannen und überfordert somit den Spamd, welcher unter 'top' in einem einzigen Prozess den ganzen Speicher aufbraucht. Der Kernel fängt zum Schluss dann an andere Prozesse wie die mysql-Datenbank zu killen. Ich lasse SpamAssassin als spamd laufen, und Exim (wie in der exiscan-Doku beschrieben) über eine lokale Socket drauf zugreifen. Es macht jedoch kein Unterschied wenn ich TCP als Socket verwende. Mit der "-m 2" Option habe ich schon versucht die Prozesse von Spamd zu limitieren, hat aber auch nichts gebracht.
Schon probiert, den Speicherverbrauch mittels ulimit zu begrenzen?
Spamd wird 'at SMTP-time' aufgerufen, dass heisst, noch während die Nachricht vom anderen Server empfangen wird kann diese mit einem möglichen Spam-Score direkt zurückgewiesen werden.
Falls jemand dieses Problem schon hatte, gibt es eine Lösung? Gibt es eine Option in Exim um zu verhindern dass Spamd überfordert wird?
Du solltest ein paar Limits setzen, wie von Andreas bereits beschrieben. Die exiscan Regeln sollten etwas wie condition = ${if <{$message_size}{500k}{1}{0}} enthalten (jede der scannenden Regeln braucht die Bedingung!). Verwende ausserdem die queue_only_load u.ae. Direktiven. Auch message_size_limit wuerde ich erwaegen.
PS: Tut mir leid wenn ich hier frage, aber auf google-groups und anderen Listenarchiven finde ich keine sinnvollen Informationen -- es scheint jedoch als wenn ich nicht der einzige bin der dieses Problem hat.
Ich bin wirklich dankbar für jede Hilfe!
Auf der exim-users Liste waerest Du auf jeden Fall richtig. Peter
Hallo nochmal, ich habe das Problem anscheinend gelöst -- und zwar filtert mein Exim wie folgt: - Ganz wichtig: ist die Zieladresse postmaster-, hostmaster- oder webmaster@domain.com, BITTE BITTE annehmen! Es gibt nichts nerfigeres als eine mail an Postmaster welche im Spamfilter hängen bleibt! - Exim prüft jetzt ob der Empfänger auf dem Server existiert (bei mir via mysql), falls nicht, wird überprüft ob der SMTP-Benutzer authentifiziert ist. Wenn dies auch nicht der Fall ist, wird die Verbindung abgebrochen. Das Problem war nähmlich das bei "Spamwellen", wo viele hundert Mails die Minute reinkamen die Maschine sich einfach verabschiedet hat. Dies wird jetzt vermienden und verhindert ausserdem noch unnötigen Traffic auf der Leitung das keine Bounce-Mails mehr geschickt werden müssen. -- Dies bedeutet wiederum das die Queues leer bleiben und die Festplattenaktivität und der RAM-Verbrauch nicht so hochgehen. 99% der Mails die reinkommen sind sowieso Spam die an nicht-existente Mailadressen geschickt werden. Die Authorisierung ist notwendig um Benutzern im LAN oder Mitarbeiter von Aussen einen SMTP-Versandt zu ermöglichen. Wenn gewollt kann die Autorisierung auch durch einen IP-Adressbereich automatisch auf OK gesetzt werden. - Ich habe exim mit "smtp_accept_queue = 5" verhindert das zu viele SMTP-Verbindungen gleichzeitig ein Überlasten der Datenbank oder der Spamd-Prozesse passiert. Dies macht wiederum nötig, dass acl_not_smtp konfiguiert wird um mails die noch nicht gecheckt, aber in der Queue liegen, auf Spam zu überprüfen. Bitte auch nicht vergessen Exim mit "-bd -q10m" (mit Queue-Runs) oder ähnlich zu starten. (In diesem Fall wird alle 10 minuten ein Queue-Run gemacht.) - Nach dem Entgegennehmen des Mails (aber noch während der SMTP-Verbindung und wenn authorisiert oder Zieladresse existiert) wird das Mail auf Spam und Viren überprüft. Wenn ein Virus gefunden gefunden wird oder der Spam-Level (laut SpamAssassin) grösser als 5 wird, wird die Mail direkt zurückgewiesen - ein Bounce-Mail sollte dann vom anderen SMTP-Serer an den Benutzer geschickt werden. Alle anderen Mails bekommen ein "X-Spam-Flag"-Header damit der Mail-Client des Users diese Mails direkt aussortieren kann. Zusätzlich wird noch ein RBL-Lookup gemacht welcher nach option noch zusätzlich einen "X-Warning:" Header hinzfügt. - Damit selbst bei einer (aber Unwahrscheinlichen) Situation nicht tausende von Mails in der Queue als 'frozen' hängenbleiben, hilft ein "timeout_frozen_after = 3h", der die 'frozen'-Mails automatisch bei einem Queue-Run entfernt. Ein "log_selector = -skip_delivery" verhindert zusätzlich noch die Notiz in den Logs das diese Mails aus der Queue gelöscht wurde. Ich hoffe dies Hilft einigen die vielleicht die gleichen Probleme haben. Wenn nötig, stelle ich auch die nötige Konfigurationsdatei zur verfügung! Da ich das aber Vorbereiten muss währe eine Mail an mich ganz Hilfreich! :) Bis dann! Bastian Bense
participants (3)
-
Andreas Heinlein
-
Bastian Bense
-
poeml@cmdline.net