Howto: Greylisting mit Postgrey, Postfix und Confixx einrichten

Seit einiger Zeit ärgern sogar mich böse böse Spammer sehr auf meinem vServer mit Confixx. Obwohl ich nur fünf Domains auf dem kleinen vServer gehostet habe, gibts/gab es Tage, an dem bis zu 20.000 Spammails zugestellt werden sollen. Das geht an die virtuellen Nieren - sprich den Spamassassin...
Um die Ressourcen meines Servers nicht auszulasten, habe ich mich nach Alternativen wegen umgeschaut, um den ganzen Spam-Müll loszuwerden.
Die Antwort: Greylisting! Greylisting beruht auf dem Konzept, dass die meisten Spammer sich nicht die Zeit nehmen, eine ordentliche Kommunikation mit deinem smtp-Server abzuhalten, sonder einfach nach dem "fire'n'forget"-Prinzip ihre Mails auf den Server bomben. Natürlich würden die Spammer sich auch nicht noch ein zweites mal melden, um bei einem temporären Fehler die eMail ein zweites mal abzusetzen. Somit wird beim Greylisting eine unbekannte eMail erstmal mit einem temporären Fehler abgelehnt. Ordentlich konfiguierte Server melden nicht mehrere Tage lang wieder, bis die eMail zugestellt ist - Spammer nicht! So wird man den meisten Spam los, ohne den rechenintensiven Spamassassin arbeiten zu lassen.

In einem Standard-Confixx System setzt normalerweise auf Debian auf und benutzt Postfix als MTA. Das kommt uns in diesem Fall sehr zu Gute, denn die Implementierung eines Greylisting Filterst ist hier,durch Postgrey besonders einfach.

Zunächst sollte man die Paketliste seines Systems aktualisieren.

apt-get update

Wenn das abgeschlossen ist, kann man direkt postgrey installieren.

apt-get install postgrey

mit

ps aux | grep postgrey

kann man nur direkt testen, ob der Daemon läuft... die Ausgabe sollte etwa so aussehen

postgrey   978  0.0  2.3  10460  4912 ?        Ss   Dec10   0:00 /usr/sbin/postgrey --pidfile=/var/run/postgrey.pid --daemonize --inet=127.0.0.1:60000

Sollten noch Änderungen nötig sein, z.B. die IP-Adresse ändern, so kann man das in der /etc/default/postgrey tun

vim /etc/default/postgrey

Nachdem wir nur stolze Besitzers eines Greylistingfilters sind, wäre es ja auch super, wenn Postfix ihn benutzen würde.
Um das zu bewerkstelligen, öffnen wir die /etc/postfix/main.cf

vim /etc/postfix/main.cf

und fügen check_policy_service inet:127.0.0.1:60000 bei den smtpd_recipient_restrictions ein.
Der Abschnitt sollte dann etwa so aussehen:

smtpd_recipient_restrictions =
                permit_sasl_authenticated,
                permit_mynetworks,
                reject_unauth_destination,
                check_policy_service inet:127.0.0.1:60000,
                check_policy_service unix:private/policy,
                reject_non_fqdn_sender,
                reject_non_fqdn_recipient,
                reject_unknown_hostname,
                reject_unknown_sender_domain,
                reject_rbl_client ix.dnsbl.manitu.net,
                reject_rbl_client sbl-xbl.spamhaus.org,
                reject_rbl_client list.dsbl.org,
                reject_rbl_client relays.org,

Jetzt noch ein kleines

postfix reload

und der Filter arbeitet im Postfix.

Um zu sehen ob er auch wirklich arbeitet, sollten in /var/log/mail.log folgende Einträge zu lesen sein:

Dec 13 13:34:28 bender postfix/smtpd[30419]: NOQUEUE: reject: RCPT from unknown[xxx.xxx.xxx.xxx]: 450 4.7.1 : Recipient address rejected: Greylisted, see http://isg.ee.ethz.ch/tools/postgrey/help/deinedomain.de.html; from= to= proto=ESMTP helo=

Postfix Greylisting Suse!

Für Postgrey unter SuSE gibt es bisher kein fertiges RPM-Paket. Und selbst, wenn es mal eins geben wird, so wird es wohl eher für openSuSE 10 oder höher sein. Daher bringe ich hier eine Anleitung inkl. start-Script für SuSE 9.x und höher.

Postgrey nutzt eine Berkeley-DB zum Speichern seiner Daten und verwaltet sie vollkommen autonom. Die passenden Libraries und Perl-Module sind meistens schon installiert. Sollten später beim Start von postgrey Fehler mit dbm-Zugriffen auftauchen, schaut erstmal im yast nach, ob alle nötigen Pakete vorhanden sind.

#Download
cd /usr/local/src
wget http://postgrey.schweikert.ch/pub/postgrey-1.31.tar.gz
tar xzf postgrey-1.31.tar.gz
cd postgrey-1.31

#Installation
cp postgrey /usr/local/sbin/.
cp postgrey_whitelist_clients /etc/postfix/.
cp postgrey_whitelist_recipients /etc/postfix/.
#wer einen Report lesen will
cp contrib/postgreyreport /usr/local/bin/.
#nötiges Verzeichnis anlegen
mkdir /var/spool/postfix/postgrey
chown postfix /var/spool/postfix/postgrey
chmod 700 /var/spool/postfix/postgrey

Theoretisch steht einem direkten Aufruf nix im Wege. Aber da Postgrey als Daemon läuft, sollte es auch ein passendes Startscript erhalten:

#Startscript
cd /usr/local/src
wget http://www.huschi.net/download/rcpostgrey.tgz
tar xzf rcpostgrey.tgz
mv rcpostgrey /usr/local/sbin/.
#verlinken und automatischen Start setzen
ln -s /usr/local/sbin/rcpostgrey /etc/init.d/postgrey
insserv postgrey

#testen
/etc/init.d/postgrey
#Auftretende Fehler sofort untersuchen!
#ggf. CPAN-Module nachinstallieren:
cpan -i Net::Server
cpan -i IO::Multiplex
cpan -i BerkeleyDB

Nun sollte Postgrey als Server-Prozess laufen und an Port 60000 lauschen. Wir überprüfen es mit folgenden 2 Befehlen:

#Software
ps aux|grep postgrey
#Netzwerk
netstat -lpn | grep 60000

Integration in Postfix

Um Postgrey in den MTA von Postfix zu integrieren benötigt es lediglich eine kleine Änderung in der /etc/postfix/main.cf. Die Direktive smtpd_recipient_restrictions muß wie folgt ergänzt werden:

# check_policy_service inet:127.0.0.1:60000

Danach muß Postfix nur neu geladen werden (/etc/init.d/postfix reload) und schon ist Postgrey aktiviert.