Postifx und AMaViS - content-filter oder smtpd-proxy-filter?

Das amavisd-new eine sehr schöne Lösung ist um eingehende E-Mails nach Viren oder Spam zu filtern, muss ich kaum einem erklären. Dass es aber zwei verschiedene Lösungen zur Anbindung an Postfix gibt schon. In den meisten großen HowTo´s zu Postfix und Amavis wird fast immer der Weg über content_filter beschrieben. Daher ist es wohl der verbreitetste! Es gibt zusätzlich noch die Möglichkeit amavis per smtpd_proxy_filter mit Postfix zu verknüpfen, mein persönlicher Favorit. Natürlich haben beide Lösungen wieder Vor- und Nachteile.... Für mich wiegen die Vorteile der smtpd_proxy_filter Lösung schwerer. Eine kurze und grobe Beschreibung sollte ausreichen damit es nachvollziehbar wird! Am besten wir gehen einmal den Weg einer E-Mail, wenn amavis per content_filter angebunden und einmal wenn amavis per smtpd_proxy_filter arbeitet.

 

content_filter:

Im ersten Fall nimmt Postfix die Verbindung vom einsendenden Mailserver an und nimmt die komplette E-Mail entgegen. Der einsendende Mailserver bekommt also von unserem System ein: OK, ich habe die E-Mail komplett und ohne Fehler erhalten und bin nun für alles weitere verantwortlich. Der einsendende Mailserver baut die Verbindung ab und ist damit fertig und zufrieden :-) Unser Mailsystem hat diese E-Mail nun zwischengespeichert und schiebt sie weiter an amavis, welches sich um die Filterung und Bewertung der E-Mail kümmert. Hat amavis gerade alle Hände voll zu tun, versucht der lokale Postix es einfach immer wieder, bis die Mail durch ist. Erkennt amavis die E-Mail nun als Virus/Spam passiert (je nach Konfiguration) folgendes. Amavis sendet über Postfix eine Info an den Absender/Empfänger, schiebt die Nachricht in Quarantäne, Tag sie und gibt sie weiter an Postfix, oder lässt sie im schlechtesten Fall „verschwinden“. Verschwindet die E-Mail nicht, landet sie in jedem Fall erst einmal wieder bei Postfix. Dieser kümmert sich jetzt erst um die weitere Zustellung der Nachricht. Also lokal weiter in ein Postfach oder Dovecot, usw. oder an einen weiteren nachgeschalteten Mailserver.

 

smtpd_proxy_filter:

Arbeitet amavis als smtpd_proxy_filter, wird die E-Mail wieder vom einliefernden Mailserver von Postfix angenommen. Nun muss man sich vorstellen das Postfix dabei die E-Mail direkt durch amavis leitet und die Nachricht somit direkt Gefiltert/Bewertet werden kann. Der einliefernde Mailserver bekommt also zum Abschluss vom Postifx nicht einfach ein: OK, E-Mail ist angekommen“ sondern direkt die durchgereichte Nachricht von Amavis: „Ne, das ist SPAM, die lehnen wir ab.“ oder „Ne, da ist ein Virus im Anhang, die E-Mail nehmen wir nicht an!“. Unser Mailsystem nimmt die E-Mail also nur an, wenn amavis nichts dagegen hat. Das bringt uns rechtlich schon mal auf eine ganz andere Seite. Denn man kann uns nicht nachsagen, dass wir eine uns zur Übermittlung anvertraute Nachricht „unterdrückt“ oder dem Empfänger „vorenthalten“ hätten. Denn wir haben die Nachricht ja erst überhaupt nicht angenommen! Zusätzlich müssen wir die E-Mail nicht erst annehmen, zwischenspeichern, an amavis weiterleiten, dort wird die e-mail bearbeitet, dann wird sie wieder an postfix durchgereicht welcher sich erst nun um den weiteren Versand kümmert. Der größten Nachteile sind sicher: Amavis braucht zur Bewertung und Filterung der E-Mail etwas Zeit. Genau diese Zeit halten wir natürlich den Einliefernden Mailserver fest und auch die Verbindung offen. Zusätzlich braucht eine Bewertung/Filterung von E-Mails deutlich mehr Systemresoucen. Es werden also über diesen Weg deutlich weniger E-Mails gleichzeitig eingeliefert werden können, also wenn Postfix die E-Mails erst einmal nur annimmt und zwischenspeichert.
Um so mehr Leistung das System hat um so mehr gleichzeitig Amavis Prozesse sind natürlich möglich. Kann unser Mailserver eine E-Mail gerade nicht annehmen, da kein amavis Prozess frei ist, wird die E-Mail aber nicht einfach als unzustellbar abgewiesen. Nein es gibt einen temporären Fehler 4xx und der einliefernde Mailserver wird es einfach später noch einmal probieren.

 

Um nun amavis als smtpd_proxy_filter arbeiten zu lassen und nicht über die Funktion content_filter, müssen in der Datei: /etc/postfix/master.cf folgende Änderungen vorgenommen werden:

smtp inet n - - - 100 smtpd
    -o smtpd_proxy_filter=127.0.0.1:10024
 
amavis unix - - n - 6 smtp
    -o smtp_data_done_timeout=1800
    -o smtp_send_xforward_command=yes
    -o disable_mime_output_conversion=yes
    -o disable_dns_lookups=yes
 
127.0.0.1:10025 inet n - - - - smtpd
    -o content_filter=
    -o smtpd_proxy_filter=
    -o local_recipient_maps=
    -o smtpd_authorized_xforward_hosts=127.0.0.0/8
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_data_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks

 

Postfix muss noch die Funktion content_filter genommen werden. Dazu müssen in der Datei /etc/postfix/main.cf noch die beiden folgenden Zeilen auskommentiert werden:

 

#content_filter = smtp-amavis:[127.0.0.1]:10024
#receive_override_options = no_address_mappings

Wichtig ist, nicht zu vergessen auch die receive_override_options = no_address_mappings auszukommentieren. Denn sonst gibt es lustige Fehler... Zum Beispiel schaut dovecot bei der lokalen E-Mail Zustellung nicht nach virtuellen alias Einträgen. Diese E-Mail werden einfach mit dieser Meldung zurückgewiesen:

 

Oct 28 00:00:12 postfix/pipe[18488]: 5FC6EE20C1: to=<kernel-error@kernel-error.com>;, relay=dovecot, delay=11, delays=10/0.01/0/1.3, dsn=5.1.1, status=bounced (user unknown)

 

Oct 31 16:00:47 dovecot: auth(default): master in: USER#0111#011kernel-error@kernel-error.com#011service=deliver
Oct 31 16:00:47 dovecot: auth(default): prefetch(kernel-error@kernel-error.com): passdb didn't return userdb entries, trying the next userdb
Oct 31 16:00:47 dovecot: auth-worker(default): sql(kernel-error@kernel-error.com): SELECT email as user, concat('*:storage=', quota_kb, 'K') AS quota_rule2, password, 5000 as uid, 5000 as gid, '/zpool/mailbox/kernel-error.com/kernel-error' as home FROM virtual_users WHERE email='kernel-error@kernel-error.com';
Oct 31 16:00:47 dovecot: auth-worker(default): sql(kernel-error@kernel-error.com): Unknown user
Oct 31 16:00:47 dovecot: auth(default): passwd(kernel-error@kernel-error.com): lookup
Oct 31 16:00:47 dovecot: auth(default): passwd(kernel-error@kernel-error.com): unknown user
Oct 31 16:00:47 dovecot: auth(default): master out: NOTFOUND#0111