[Postfixbuch-users] FILTER_README.html

Thomas Schwenski mailing-lists at thomasschwenski.de
Di Apr 19 09:39:24 CEST 2011


Hallo,

> ich beschaeftige mich mit dem fitler_readme.html unter
> http://www.postfix.org/FILTER_README.html
> 
> 1) Das "simple content filter" Beispiel habe ich durch und
> hoffentlich einigermaßen verstanden.
> Beim "advanced content filter" habe ich meine Probleme
> im Abschnitt "running the content filter".
> Dort ist beim spawn-Prozess zu lesen
>  argv=/path/to/filter.
> Im ersten Beispiel war das ein Shellskript. Kommt hier
> nun dann das weiter oben genannten "PERL/SMTP content 
> filtering framework" zum Einsatz?

Oder eben Dein eigener (selbstimplementierter) Filter.

Gemäß http://www.postfix.org/spawn.8.html darfst Du Dir Spawn wie inet.d
vorstellen.
D.h. er lauscht auf einem Port. Wird auf diesem Port eine Verbidnung
aufgebaut, dann startet Spawn das per Argument angegebene Script und
übergibt diesem dann die Verbindung die auf dem Port aufgebaut wurde.
(Wenn ich mich nicht ganz täusche dann entspricht STDIN und STDOUT dann
der Empfangs- bzw. Senderichtung auf dem Port.)

/path/to/filter zeigt demnach auf das Script welches die
Filter-Funktionalität zur Verfügung stellt.
Das kann ein beliebiger vorgefertigter oder eben selbstimplementierter
SMTP-Filter sein.

> 2) Mit folgendem Absatz habe ich auch noch meine Schwierigkeiten:
>  The simplest content filter just copies SMTP commands and data 
>  between its inputs and outputs. If it has a problem, all it 
>  has to do is to reply to an input of `.' from Postfix with 
>  `550 content rejected', and to disconnect without sending `.' 
>  on the connection that injects mail back into Postfix. 
> 
> Was soll da im Problemfall geschehen? Soll da eine Mail an 
> "." (?) erzeugt werden? 

Die einfachste Implementierung eines Filter ist ein SMTP-Proxy, d.h. die
komplette eingehende SMTP-Kommunikation wird einfach ausgehend
weiterverwendet.
Bei SMTP wird die Übertragung einer Mail mit einem einzelnen Punkt,
(".") der zwischen zwei Zeilenumbrüchen (<CR><LF>) steht, abgeschlossen
Also "<CR><LF>.<CR><LF>".

Der beschriebene "einfachste Filter" würde nun, wenn er auf dem
eingehenden Socket "<CR><LF>.<CR><LF>" empfängt seine Prüfungen des
Mail-Contents durchführen und im Ablehnungsfall einen SMTP-Code 5xx
senden um dem einliefernden Client mitzuteilen, dass er die Mail nicht
annehmen will.
(Denkbar wäre in bestimmten Szenarien (i.d.R. allerdings nur, wenn aus
technischen Gründen aktuell keine Überprüfung der Mail durchgeführt
werden kann) auch ein 4xx-Code um anzuzeigen, dass ein späterer
Zustellversuch eventuell angenommen werden könnte.)

Würde stattdessen die Mail angenommen werden, dann würde auf dem
eingehenden Socket ein 2xx-Code gesendet und die (eingehende)
SMTP-Kommunikation des eingehenden Sockets 1:1 ausgehend auf dem
ausgehenden Socket an den "Next Hop" gesendet.

Sinnvollerweise geschieht die Weitergabe der eingehenden
SMTP-Kommunikation auf den ausgehenden Socket blockweise 1:1 um eine
eventuelle Ablehnung des "Next Hop" direkt an den einliefernden Client
weiterzureichen.
Blockweise bezeichnet damit, dass der HELO, MAIL FROM, RCPT TO und der
Content der Mail (DATA) jeweils erst an den Next Hop weitergegeben
werden und dessen Antwort dann vom Filter an den einliefernden Client,
so dass sich Filter wirklich transparent verhält.

Als einfachster Filter wird dieses Konzept deshalb bezeichnet, da auch
in den früheren Stadien der SMTP-Kommunikation bereits eine Ablehnung
durch den Filter stattfinden könnte (also nach HELO/EHLO, MAIL FROM oder
RCPT TO).

Das Ganze funktioniert natürlich auch bei ESMTP.

Jetzt alles klar?

Viele Grüße
Thomas

Der Filter hat ja einen eingehenden und einen ausgehenden Socket.



Mehr Informationen über die Mailingliste Postfixbuch-users