Mail-Server » Qmail

ID #1124 Plesk & Qmail: Spamprotection mit Greylisting

Was macht greylist?

Greylisting ist eine effektive Methode zur Spam-Protection. Es block jede Email beim ersten Versuch. Erst wenn diese Email ein zweites Mal eingeliefert werden soll, wird sie angenommen.
Warum das funktioniert? Weil jeder echte Email-Server mehrmals versucht seine Emails bei dem Empfänger abzuliefern. Schließlich könnte ja mal ein Server ausgefallen oder überlastet sein. Spam-Versender-Programme hingegen arbeiten anders: Sie liefern einfach nur ein, ohne die Antwort zu registrieren. Es versucht also abgelehnte Emails i.d.R. kein zweites Mal einzuliefern. Und deshalb ist Greylisting so effektiv.

Das eigentliche Problem liegt daran, daß Greylisting sich in die Abarbeitung der Emails bereits beim Einliefern (SMTPd) einklinken muß. Bei Programmen wie Postfix ist dies recht einfach. Qmail ist etwas schwieriger, da die qmail-smtpd ersetzt werden muß. Bei einer std. Installation von Qmail wäre dies kein Problem, aber im Zusammenhang mit Plesk schon, da SWsoft eine spezielle Version von Qmail mit Plesk ausliefert.

Lösung:
(Aus dem SWsoft-Forum: qmail & greylisting spam control bzw. Adding Greylisting support to qmail on Plesk 8)

Installation

Vorbereitung der MySQL-Datenbank:

Mit mysql oder phpMyAdmin folgende User, Datenbank und Tabelle anlegen:

# Datenbank 'qmail':
CREATE DATABASE qmail;
# User 'greylist' (ändert evtl. das Passwort):
GRANT ALL ON qmail.* TO 'greylist'@'localhost' IDENTIFIED BY 'passwort';
FLUSH PRIVILEGES;
# Tabelle 'relaytofrom':
USE qmail;
CREATE TABLE relaytofrom (
  id bigint(20) NOT NULL auto_increment,
  relay_ip varchar(16) default NULL,
  mail_from varchar(255) default NULL,
  rcpt_to varchar(255) default NULL,
  block_expires datetime NOT NULL default '0000-00-00 00:00:00',
  record_expires datetime NOT NULL default '0000-00-00 00:00:00',
  blocked_count bigint(20) NOT NULL default '0',
  passed_count bigint(20) NOT NULL default '0',
  aborted_count bigint(20) NOT NULL default '0',
  origin_type enum('MANUAL','AUTO') NOT NULL default 'MANUAL',
  create_time datetime NOT NULL default '0000-00-00 00:00:00',
  last_update timestamp(14) NOT NULL,
  PRIMARY KEY  (id),
  KEY relay_ip (relay_ip),
  KEY mail_from (mail_from(20)),
  KEY rcpt_to (rcpt_to(20))
) TYPE=MyISAM;

Sourcen laden und bearbeiten

Zum Kompilieren werden folgende Pakete benötigt: mysql-devel und openssl-devel

#SuSE:
yast -i mysql-devel openssl-devel zlib-devel
#Debian:
apt-get install libmysqlclient12-dev libssl-dev

Download der Greylist-Sourcen:
(Diese Sourcen entahlten bereits die Patches von SWsoft.)
PS: Da Meshier den direkten Download unterbindet stelle ich die Pakete unter huschi.net bereit.)

cd /usr/local/src/
#für Plesk 7.5:
wget http://www.huschi.net/download/qmail-1.03-psa-published-greylist.tar.gz
#für Plesk 8:
wget http://www.huschi.net/download/qmail-103-greylist-psa8.tar.gz

#auspacken
tar xfz qmail-1*
cd qmail-1.03

#bei Plesk 8 fehlt leider eine Datei:
echo "-lssl -lcrypto" >ssl.lib

Nun müssen die o.g. Datenbank-Zugangsdaten in die Datei local_scan.c eingetragen werden:

#define MYSQLHOST "localhost"
#define MYSQLUSER "greylist"
#define MYSQLPASS "passwort"
#define MYSQLDB   "qmail"
#define BLOCK_EXPIRE  4   /* minutes until email is accepted */
#define RECORD_EXPIRE 1500  /* minutes until record expires */
#define RECORD_EXPIRE_GOOD  36 /* days until record expires after accepting email */

Distributionsabhängige Änderungen:

Unter Debian muß man noch das Makefile anpassen:

edit Makefile
#ersetzte alle Vorkommen von "/usr/lib/mysql/libmysqlclient.a"
#durch "/usr/lib/libmysqlclient.a"

Auch bei einem 64bit-SuSE müssen Anpassungen im Makefile vorgenommen werden:

edit Makefile
#ersetzte alle Vorkommen von "/usr/lib/mysql/libmysqlclient.a"
#durch "/usr/lib64/mysql/libmysqlclient.a"

Wer Plesk 7.5 hat und in Haggybear's Plesk Greylisting Config Panel die Domain-Whitelist-Funktion nutzen will, muß folgenden Bugfix in die Datei local_scan.c einbauen:

#Suche nach "checkWhiteListDomain"
#Suche nun nach "sprintf(sql" (ca. 11 Zeilen weiter)
#gehe ans Ende der Zeile und ersetze:
rcpt_to = '%s'
#durch
rcpt_to LIKE '%%%s'

Greylist kompilieren

Nun geht es ans kompilieren:

make

ACHTUNG! Auf Fehlermeldungen achten und entsprechend reagieren!

Z.B. folgende

tls.c:12: error: conflicting types for 'strerror'
/usr/include/string.h:256: error: previous declaration of 'strerror' was here"

Wird gelöst indem man in tls.c Zeile 12 auskommentiert.

Greylist installieren

Die Installation besteht aus den Schritten: Qmail stoppen, nötige Dateien drüber kopieren, Qmail starten und Aufräum-Script installieren.

# Email-Empfang stoppen:
/etc/init.d/inetd stop
# oder:
/etc/init.d/xinetd stop
#(Qmail selbst muß nicht beendet werden.)

# installieren:
cp -p /var/qmail/bin/qmail-smtpd /var/qmail/bin/qmail-smtpd.old
cp qmail-envelope-scanner /var/qmail/bin/.
chown root.qmail /var/qmail/bin/qmail-envelope-scanner
cp -pf qmail-smtpd /var/qmail/bin/.
chown root.qmail /var/qmail/bin/qmail-smtpd

# qmail wieder starten:
/etc/init.d/inetd start
# bzw.  /etc/init.d/xinetd start

Erste Ergebnisse kann man mit tail -f /tmp/greylist_dbg.txt verfolgen. Dort sollte sowas drin stehen. (Falls nicht, weiter unten weiter lesen.)

protocol = notneeded4qmail tiqprotagofuj@protago.com
tiqprotagofuj@protago.com -> mail@meine-domain.de (88.235.162.111) Doesn't Exists Block

Aufräum-Script

Damit die Datenbank und das Logfile nicht überlaufen, schreiben wir ein Perl-Script (Download unter Software für Qmail) nach /etc/cron.daily/qmail-greylist-cleanup.pl:

#!/usr/bin/perl -w
use strict;

use constant DBD => 'DBI:mysql:qmail:localhost:3306';
use constant DBUSER => 'greylist';
use constant DBPASS => 'passwort';

use DBI;

system ('cat /dev/null > /tmp/greylist_dbg.txt');

my $dbh = DBI->connect(DBD,DBUSER,DBPASS) or die "can't connect to db ", $DBI::errstr, ":$!";

$dbh->do("DELETE FROM relaytofrom WHERE record_expires < NOW() - INTERVAL 1 HOUR AND origin_type = 'AUTO'");
$dbh->do("OPTIMIZE TABLE relaytofrom");

$dbh->disconnect;

Nicht vergessen: Ausführbar machen:

chmod +x /etc/cron.daily/qmail-greylist-cleanup.pl

Probleme / Debugging

Wie immer gilt der Grundsatz: Logfiles!
Gerade das Debug-Log von Greylisting ist wichtig: /tmp/greylist_dbg.txt
Aber auch das allgemeine Maillog: /var/log/mail.info

Logging von MySQL-Fehlern:

Ein häufiges Problem ist, daß qmail-envelope-scanner sich nicht in die Datenbank einloggen kann. Hier hilft nur ganz genau nochmal alle eingetragenen Passwörter zu prüfen.
Falls das immer noch nicht hilft muß eine kleines Debugging in die local_scan.c eingebaut werden: (ca. Zeile 284)

// if(mysql) mysql_close(mysql);
 if (dbglog) {
   if (mysql) {
       if (mysql_errno(mysql)) 
           fprintf(dbglog, "MySQL-Error: %s\n", mysql_error(mysql));
       mysql_close(mysql);
   } else {
       fprintf(dbglog, "MySQL-Error: %s\n", "cannot initialize!");
   }
   fprintf(dbglog, "--------\n");
   fclose(dbglog);
 }

Danach nochmal make durchlaufen lassen und wieder die Programm-Datei qmail-envelope-scanner nach /var/qmail/bin/ kopieren.
Nun sollte der Grund für die Login-Probleme in der Datei /tmp/greylist_dbg.txt ersichtlich sein.

Problem mit TLS

Ein weiteres Problem ist in Verbindung mit TLS aufgetaucht. Bitte testet qmail-smtpd nach der Installation mit openssl ob der TLS-Handshake funktioniert:

openssl s_client -crlf -starttls smtp -connect localhost:25

Bricht er direkt nach 2 oder 3 Zeilen ab, so war er nicht erfolgreich. Bringt er hingegen das ganze TLS-Zertifikat und noch einige Debug-Informationen dazu, so muß man den Connect mit quit beenden.

Wenn es nicht erfolgreich war, muß eine Cipher-List erstellt werden:

openssl ciphers > /var/qmail/control/tlsclientciphers
openssl ciphers > /var/qmail/control/tlsserverciphers

Direkt im Anschluß wieder den TLS-Handshake mit o.g. Befehl testen.

 

sozial Bookmarking
Bookmarken bei YIGG Bookmarken bei Mister-Wong Bookmarken bei Icio Bookmarken bei del.icio.us Bookmarken bei Technorati Bookmarken bei Furl Bookmarken bei Spurl Bookmarken bei Yahoo Bookmarken bei Google

vom 2006-02-14 12:00, zuletzt 2008-07-28 20:39     Artikel ausdrucken Artikel weiterempfehlen Als PDF-Datei anzeigen

Dieser Inhalt ist unter der Creative-Commons Lizenz lizensiert.

Probleme bitte im Server-Support-Forum diskutieren.

Rubriken zu diesem Artikel
überflüssig 1 2 3 4 5 wertvoll  
Durchschnittliche Bewertung:   4.54 von 5 (26 Bewertungen)

Artikel kommentieren

Kommentar von Frank (2038-01-19 04:14:07):
Nachdem gerade frisch Plesk 8 erschienen ist, solltest Du bei Deinen Plesk HowTos angeben, für welche Plesk Versionen sie gelten. Das spart sicher einige Nachfragen.

Gruß, Frank

Kommentar von hacknix (2006-10-12 11:06:06):
Hallo
habe alles laut anleitung gemacht Mail funktioniert, aber in der greylist_dbg.txt passiert nichts. Was kann ich tun/testen?

Gruß

Kommentar von flyingoffice (2006-10-16 22:09:00):
Hallo!

Die Greylist-Sourcen sind unter der angegebenen Adresse nicht mehr zu bekommen. Ich habe danach gesuch und noch welche unter folgender Adresse gefunden:

http://utkalika.net/projects/qmail/

Weiter ist mir noch aufgefallen, daß bei der Datenbankanlage als Benutzer "greylisting" benutzt wird, bei der Sourceanpassung jedoch "greylist"

HTH, flyingoffice

Kommentar von sAm (2006-11-10 12:48:04):
Die installation klappte reibungslos. Toll!!!

Aber eine Frage hätte ich da noch. Im Netz ließt man, das es einige Provider gibt, die nicht der RFC-Norm entsprechende Mailer nutzt, wohin dann bounce-Mails gehen.

Ist es sinnvoll eine Whitelist (siehe hier : http://greylisting.org/whitelisting.shtml) für diese Mailer anzulegen?

Ist das sinnvoll? Wie genau geht man dabie vor?

Kommentar von Manfred (2007-03-01 19:25:19):
Hallo Leute,

auf unseren Plesk 8.1 Kisten läuft alles piko bello - allerdings...

Wir hätten für unsere Kunden ein Webinterface (Vorlage meshier.com) gebaut und dazu eine Spalte "dom_id" in die relayfromto eingefügt. Ein kleines Update-Script liest dann die Werte aus der PSA-DB aus und trägt die Werte (dom_id) in die relayfromto ein. Jedoch trägt der qmaild jetzt nix mehr in die Tabelle ein. Nur ein rausnehmen der Spalte "dom_id" hat wieder geholfen.

Hat jemand eine Ahnung, wie man z.B. die localscan.c modifizieren muss damit wir mit der abgeänderten relayfromto weiterarbeiten können ???

Danke für eure Impressionen.
Manfed

Kommentar von Manfred (2007-03-02 18:31:25):
Hurra, hab's selber gefunden - Danke

Kommentar von nh2 (2007-03-09 16:21:00):
Ein sehr gutes HowTo.
Dazu empfehle ich folgendes das Plesk Geylisting Control Panel:
http://serversupportforum.de/forum/plesk/14835-plesk-greylisting-control-panel-0-1-a.html

Kommentar von Bernd (2008-03-13 14:40:54):
Das Greylisting scheint nach obiger Anleitung zu funktionieren.
Die Emails werden im Plesk Greylsting Plugin richtig behandelt.
Zuzustellende Email werden grün markiert.

Allerdings funktioniert der POP3 im Moment nicht. Es sind seit Stunden keine Emails vorhanden. Die grün markierten Mails bekomme ich nicht.

Kommentar von mok (2008-03-18 18:00:55):
Tausend Dank für diese super Anleitung! Hab es heute morgen auf meinem Server mit Suse 9.1 und Plesk 7.5 installiert und es funktioniert einwandfrei.

Daumen hoch :-)

Kommentar von Alex (2008-03-25 12:35:44):
Hallo, ich habe versucht lt. dieser Anleitung das Greylisting auf meinen Server (Debian Etch) mit Plesk 8.2 zu installieren, beim "make" kam folgender Fehler:
make: *** Keine Regel vorhanden, um das Target »/usr/lib/mysql/libmysqlclient.a«,
benötigt von »qmail-envelope-scanner«, zu erstellen. Schluss.

Was mache ich falsch????

Gruss Alex

Kommentar von neutron (2008-04-05 11:30:55):
Einfach das Paket build-essentials mal nachinstallieren, dann geht es.

Kommentar von Dirk Becker (2008-04-27 11:21:20):
Etch / Plesk 8.3

Hatte das Problem dass zumindest der Mailverkehr weiterhin funktionierte aber keine /tmp/greylist_dbg.txt erstellt wurde.
In den Logs gab es auch keine Fehler, ich konnte das Problem dann beheben indem ich die Tabelle über phpMyAdmin von Hand angelegt habe und den Benutzer dann ebenfalls von Hand.

Kommentar von marneus (2008-05-06 10:22:18):
Mittlerweile ist libmysqlclient15-dev aktuell.

Grüße,
marneus

Kommentar von J. Kröger (2008-05-06 11:42:57):
Super hat alles geklappt auf meinem Strato V-Server (Plesk 8.1)

Kommentar von Robert (2008-05-31 23:55:15):
Habe folgende fehlermeldung wenn ich make ausführe, was macht man da?

spfquery.c: In function âmainâ:
spfquery.c:30: warning: incompatible implicit declaration of built-in function âstrdupâ
spfquery.c:24: warning: return type of âmainâ is not âintâ
./load spfquery spf.o ip.o ipme.o ipalloc.o strsalloc.o \
now.o dns.o datetime.a stralloc.a alloc.a str.a substdio.a \
case.a error.a fs.a `cat dns.lib` `cat socket.lib`

Kommentar von huschi (2008-06-04 09:22:52):
@Robert:
An dieser Stelle kann man bereits aufhören, da alle später gebrauchten Dateien fertig kompiliert sind.

huschi.

Kommentar von Martin P. (2008-07-13 13:18:39):
Hallo!

Super Anleitung! Als Hinweis: Wenn ihr - wie ich - versucht die Logdatei unter /var/log/greylist_dbg.txt abzulegen: Qmail hat an dieser Stelle anscheined keien Berechtigung in /var/log zu schreiben. Ergebnis: Greylisting funktioniert überhaupt nicht.

Mfg, Martin

Kommentar von piloly (2008-09-19 16:24:38):
Ist die Anleitung auch noch für Plesk 8.4 gültig?

Kommentar von Andre (2008-09-20 12:20:54):
Moin,

Klasse, das Greylisting. Habs gestern auf Plesk8.6 installiert und bin total begeistert.

Wollte es heute auf meinem Zweitserver installen (auch Plesk 8.6), aber da werde ich dann mit einer Fehlermeldung beworfen:
auto-str.c:17: warning: return type of âmainâ is not âintâ
./load auto-str substdio.a error.a str.a
/usr/lib/gcc/i586-suse-linux/4.2.1/../../../../i586-suse-linux/bin/ld: cannot find -lssl
collect2: ld returned 1 exit status
make: *** [auto-str] Error 1

Scheinbar endet hier einfach das make ... was soll ich tun?

Andre

Kommentar von huschi (2008-09-21 17:11:27):
Erstaunlich, wieviel Leute hier den Hinweis auf das Server-Support-Forum nicht lesen... :(

@Andre:
Dir fehlt das Paket "openssl-devel".

huschi.

Kommentar von malibuq (2008-09-30 23:24:02):
das Tutorial funzed perfekt ^^

cu

Kommentar von Blackbit (2009-01-19 14:48:07):
Wir epmfehlen den Einsatz von Spamdyke zur Entlastung des Mailservers. Das kann komplett ohne Kompilierung und Restarts des Mailsystems implementiert werden. Die Implementierung in Plesk 8.x, bei uns momentan 8.6 ist völlig problemlos.

Kommentar von Jens (2009-02-18 21:12:37):
Danke Huschi,
es herrscht, nach dem Plesk Updatem dank Deinem Tut wieder Ruhe.

Ich schicke Dir mal ein paar Kölsch rüber ;)

Gruß Jens

Kommentar von Peter (2009-04-15 14:49:31):
package openssl-devel is not installed

Ich kriegs nicht installiert...

OpenSuse 10.3

Hat jmd. ne Idee wie ich trotzdem installiert bekomme? Mit yast -i openssl-devel geht es nicht.

Kommentar von huschi (2009-04-16 18:01:04):
Für alle die es von selber nicht fertig bringen:
Sucht im Yast nach "openssl"!!!
Ab openSuSE 10.3 heißt das Paket wohl "libopenssl-devel".
Ob es bei Euch auch so ist, bekommt Ihr mit der Suchfunktion raus.

huschi.

Kommentar von Chris (2009-04-28 19:39:35):
Hi,
die Installation war lief reibungslos, jedoch wird weder die DB noch die greylist_dbg.txt befüllt (spam mails kommen trotzdem an)
auch nach mehrmaligem Prüfen der DB-Zugangsdaten und kompilieren

gruß Chris

Kommentar von Chris (2009-04-29 02:39:21):
ich hab es nun hinbekommen

man muss die DB + User über Plesk domain.de -> Datenbanken -> Datenbank erstellen -> User erstellen anlegen.

leider läuft das ganze dann nur auf einer domain global hab ichs nicht zum laufen bekommen hab ich da irgendetwas übersehen? oder falsch gemacht/interpretiert?

gruß Chris

Kommentar von Stefan (2009-05-04 14:50:51):
Ich wollte nur kurz mitteilen, dass die openSuse 10.3 64-Bit Variante auch für openSuSe 11 mit Plesk 9.0.1 tut.

Nur Mut :)

P.S.: Danke für diese tolle Anleitung, weiter so!

Kommentar von 1ApRiL (2009-05-12 16:10:36):
Ich habe es auf zwei fast indentischen Servern eingerichtet. Beide 64bit und PLESK 8.2.
Beim einen geht alles wunderbar beim anderen kommt in /var/log/messages ständig:
kernel: qmail-envelope-[15395]: segfault at c0 rip 2b7494a37659 rsp 7fff16981280 error 4

Wenn ich qmail-envelope-scanner zum test ausführe so:
export TCPREMOTEIP=127.0.0.1
./qmail-envelope-scanner von@domain.tld an@domain.tld

Dann geht es:
protocol = notneeded4qmail von@domain.tld
von@domain.tld -> an@domain.tld (127.0.0.1) Doesn't Exists Block

Aber wenn qmail-smtpd es aufruft kommt der segfault.
Email Verkehr funktioniert jedoch noch genauso wie vorher. Keine sonstigen Auffälligkeiten.

Woran kann das liegen, wie kann ich es lösen?

Kommentar von 1ApRiL (2009-05-13 09:06:15):
Problem gelöst.
Er konnte die /tmp/greylist_dbg.txt nicht öffnen und in der local_scan.c steht vor vielen fprintf(dbglog kein if(dbglog)
Desshalb kommt es zu einem segfault, weil in dbglog keine gültige Adresse steht.
Lösung: Der /tmp/greylist_dbg.txt die entsprechenden Schreibrechte geben bzw. Owner geben.

Kommentar von huschi (2009-05-13 11:14:03):
@1ApRiL:
a) Dies ist keine Diskussionsplattform!
b) Auf /tmp/ hat normalerweise jeder User Schreibrechte. Wenn Du die Datei natürlich per Hand angelegt hast (oder durch einen manuellen Aufruf als root!!!), dann hat der Qmail-User natürlich keinen Zugriff mehr darauf.

huschi.

Kommentar von Stefan (2009-09-11 12:17:14):
Die Anleitung für SuSe 10.3 geht auch für Suse 11 mit Plesk 9.2.2. Mit dem eingebauten Greylisting von Plesk 9 hatte ich massive Probleme mit Last (Teilweise 450 und Höher), diese Variante benimmt sich sehr viel besser.

Kommentar von Marc (2010-01-16 13:03:13):
Moin Zusammen,
erstmal vielen Dank für die super Anleitung.

Ich habe das ganze gerade mit Plesk 9.3.0 Versucht und es klappt hervorragend. Also nur Mut!

Kommentar von Axel (2010-05-27 16:27:04):
Hi Huschi, die Installation hat nach einem blöden Fehler dann doch funktioniert. Vielen Dank :-)

Damit niemand meinen Fehler wiederholt und die Debugdatei mit den falschen Rechten anlegt bzw. nach einem Reboot von dem Cronjob automatisch mit den falschen Rechten angelegt wird, habe ich den Cronjob leicht angepasst.

Dabei habe ich die Zeile in der datei /etc/cron.daily/qmail-greylist-cleanup.pl folgendermassen geändert:
system ('cat /dev/null > /tmp/greylist_dbg.txt; chmod 666 /tmp/greylist_dbg.txt');

Nun wird die Debugdatei, falls sie nicht existiert mit weltlichen Schreibrechten ausgestattet ;-)

Viele Gruesse, Axel

Kommentar von Huschi (2011-09-18 21:27:41):
@Axel: Autsch!
Das Problem mit dem Cronjob ist folgendes:
Sobald das Script per Hand (als root) testweise ausgeführt wird, werden die falschen Rechte gesetzt.
Hält man sich an die Anleitung, funktioniert alles prächtig und öffnet sich kein Einfallsloch.

huschi.

Kommentar von Anthony (2012-08-03 14:39:44):
werde noch mit dem Update warten. Scheinbar macht deiess Update noch Probleme. Wie Frank Helmschrott berichtet gibt es scheinbar Probleme mit Qmail. Bei Ihm werden keine eMails mehr versendet. Gibt es