Direkt zum Inhalt
Bild von CVB      vLIB-Logo      Logo mwCMS
Navigation oben
Impressum    Kontaktformular
Navigation
News
SC2 - Green Tea AI: Die "GT AI" (Green Tea AI) ist stärker als die KI, die von Blizzard programmiert wurde. Die "GT AI" spielt sehr variabel, auch wenn die Exe-Strategien bei allen Rassen ähnlich sind. Es lohnt sich also gegen diese KI zu üben, wenn eine BO ausprobieren will und einem "Very Hard" von Blizzard zu einfach ist. Mehr ...
SC2 PvT - Terra-All-In verteidigen: Es geht um den All-In den viele Terraner spielen. Der All-In beginnt mit einem klassischen 111, ein sehr solides Opening. Es werden 17 Marines, 2 Tanks, 1 Raven und 1 Banshee gebaut. Perfekt gespielt ist die Armee bei 8:13 fertig zum Ausrücken. Dieser Guide soll helfen, den All-In aufzuhalten. Mehr ...
SC2-Guide - Von Bronze bis Platin mit solidem Spiel (Protoss): Es gibt viele Gerüchte über SC2. "Nutze NIE die Warteschlange!" oder "Immer alle Gates auf eine Taste!" ... es ist jedoch nicht alles Schwarz und Weiß in SC2. Mein SC2-Guide für Protoss richtet sich an die unteren Ligen. Er geht außerdem auf die goldenen Regeln von SC2 ein. Mehr ...

Greylisting

  • Kommentieren
  • Drucken
  • Updates
  • 01.12.2009: Dieser Artikel über Greylisting für qmail ist veraltet.
  • 19.11.2008: Alle toten Hyperlinks entfernt/ersetzt.
  • 05.10.2008: Zum Kompilieren werden "gcc", "make" usw. benötigt. Neu: Inhaltsverzeichnis
  • 30.09.2008: Die Links zur Webseite von Brent Meshier funktionieren nicht mehr => gelöscht.
  • 18.11.2007: Es gibt Probleme mit neuen MySQL-Versionen (Lösung von AMD-Hammer).
  • 02.10.2007: Auf die Wichtigkeit von "local_scan.c" und "qmail.sql" hingewiesen (Benutzer und Passwort müssen übereinstimmen)
  • 22.09.2007: Der Fehler unter SuSE 10.x »error: conflicting types for 'write' readwrite.h:5: error: previous declaration (...) tritt nicht mehr auf.
  • 16.08.2007: Die Warnungen »warning: pointer targets in initialization differ in signedness« treten nicht mehr auf.
  • 03.08.2007: Die Warnungen »warning: conflicting types for built-in function "malloc"« treten nicht mehr auf.
  • 28.07.2007: Die Warnungen »warning: pointer/integer type mismatch in conditional expression« treten nicht mehr auf.
  • 22.07.2007: Tarball 1.05 released.

Greylisting ist eine erfolgreiche Möglichkeit, um Spam zu bekämpfen und deutlich weniger Spam zu erhalten. Es ist jedoch notwendig einen eigenen Server zu besitzen.

Dieser Artikel ist veraltet. Man sollte Greylisting für qmail mit spamdyke (spamdyke.org: Greylisting) umsetzen und ggf. mit Blacklists ergänzen.

Der folgende Artikel ist im Original von Brent Meshier veröffentlicht worden und hat beim Forum von SWsoft großen Zuspruch gefunden. Ich habe den Artikel übersetzt und eine Menge Fehler beseitigt. Die Arbeit basiert zu einem großen Teil auf der dem Artikel von Brent und TJ. Es handelt sich um eine sinngemäße Übersetzung eines Artikels von Brent Meshier, der nicht mehr verfügbar ist.

Nach der Fehlerbereinigung habe ich meine eigene Anleitung zur Installation geschrieben. Die Übersetzung ist weiter unten zu finden. Dort kann man auch den Original Tarball von Brent herunterladen, der allerdings gravierende Fehler in der C-Programmierung enthält. Ich habe versucht die Fehler und Warnungen zu bereinigen. Der C-Code sollte sich mit "make" auf allen gängigen Linux-Distributionen kompilieren lassen. Getestet wurde mit SuSE 10.1 und Fedora Core 5.

Wenn man die Installation richtig durchführt, sollte es keine Probleme geben, doch ich übernehme keine Haftung für Fehler, die durch mangelndes Linux-Wissen oder fehlende Backups hervorgerufen werden. Falsches Setzen der Rechte und/oder fehlerhafte Whitelist-Einträge können in drastischen Fehlern enden.

Fehler, Anmerkungen, Probleme und Fragen können im ServerSupportForum gestellt werden.

Inhaltsverzeichnis

  1. Was ist Greylisting?
  2. Voraussetzungen
  3. Installation
  4. Cleanup-Perl-Skript
  5. Weblinks

Was ist Greylisting?

Zitat von Evan Harris
Greylisting ist eine neue Methode, um erhebliche Mengen von Spam auf einem Mailserver zu blocken, ohne auf rechenintensive statistische Analysen oder andere heurestische (und fehleranfällige) Verfahren zurückzugreifen. Konsequenterweise sind die Implementationen nicht so rechenintensiv und vielleicht reduzieren sich sogar der Netzwerkverkehr und die Prozessorlast [a.d.Ü. LOAD] auf dem Mailserver.

Die Original-Implementation und das White-Paper von Evan Harris kann auf seiner Homepage gefunden werden.

Brent hat die SWsoft Plesk 8 Qmail Patches und die Patches für Qmail mit seinen eigenen kombiniert, um Greylisting mit MySQL zu installieren, basierend auf Evans Greylisting für Sendmail.

Voraussetzungen

WICHTIG: Ohne die folgenden Pakete wird es zu Fehlern bei der Installation von Greylisting kommen. Demnach müssen installiert werden:

  • Alle Pakete die zum Kompilieren notwendig sind (gcc, make, etc.)
  • mysql-devel
  • openssl-devel
  • Download des Tarballs (siehe Installation)
  • Mit TAR entpacken (siehe Installation)
  • Das Passwort (hier: "topSecret") in der Datei "local_scan.c" ändern.
  • Das Passwort (hier: "topSecret") in der Datei "qmail.sql" ändern.
  • Die Daten in "local_scan.c" und "qmail.sql" müssen übereinstimmen, sonst bleibt die MySQL-Tabelle "relaytofrom" leer.

Außerdem sollte der neue Tarball mit dem von mir geänderten C-Code genommen werden. Im urprünglichen Tarball von Brent sind Fehler enthalten, die zu über 100 Warnungen beim "make" führen.

Installation

Zuerst muss man den Download des Tarballs starten. Danach kopiert man den Tarball mit FTP oder WinSCP auf den Server in "/usr/src/". Der Pfad kann aber auch "/root" oder anders lauten.
Die untenstehenden Pfade unterscheiden sich ein wenig von denen, die Brent angegeben hat, weil er wahrscheinlich kein SuSE 10.x verwendet hat.
Das Beispiel ist auch ausführlicher, als der BLOG-Eintrag von Brent, da auch noch die Ausgaben der Shell mit angezeigt werden. Außerdem gibt es an strategischen Punkten zusätzliche Überprüfungen, ob die Installation der einzelnen Teilschritte auch wirklich geklappt hat.

In den Pfad "/usr/src/" wechseln und den Tarball auspacken;

strato:~ # cd /usr/src
strato:/usr/src # tar xvfz qmail-1.05_greylisting_plesk8.tar.gz
qmail-1.05/
qmail-1.05/BLURB
qmail-1.05/BLURB2
qmail-1.05/BLURB3
(...)
qmail-1.05/qmail-smtpd.c.rej
qmail-1.05/qmail-spp.o

Die Datei "local_scan.c" muss editiert werden, da auf keinen Fall die Default-Werte genommen werden dürfen.

strato:/usr/src # cd qmail-1.05
strato:/usr/src/qmail-1.05 # vi local_scan.c

---
#define MYSQLHOST "localhost"
#define MYSQLUSER "greylist"
#define MYSQLPASS "topSecret"
#define MYSQLDB   "qmail"
#define BLOCK_EXPIRE  5 /* 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 */
---

Da Greylisting mit der MySQL-Datenbank "qmail" und der Tabelle "relaytofrom" arbeitet, müssen ein paar Befehle im "MySQL Monitor" eingegeben werden (siehe Original von Brent). Wahlweise kann man auch einfach die mitgeliefert "qmail.sql" importieren (Idee: TJ). Die Login-Daten in der "qmail.sql" müssen an die "local_scan.c" angepasst werden.

strato:/usr/src/qmail-1.05 # vi qmail.sql
strato:/usr/src/qmail-1.05 # mysql -u admin -p < qmail.sql
Enter password:
strato:/usr/src/qmail-1.05 #

Um zu überprüfen, ob Benutzer und Tabelle auch wirklich angelegt wurden, sollte man den MySQL-Monitor starten.

strato:/usr/src/qmail-1.05 # mysql -u greylist -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8974 to server version: 4.1.13
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> USE mysql;
Database changed
mysql> SELECT User, Password FROM user WHERE User = 'greylist';
+-------------+-------------------------------------------+
| User        | Password                                  |
+-------------+-------------------------------------------+
| greylist    | *930DAB011CE31AB33910A8A1F011CE98AA9D40FB |
+-------------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW COLUMNS FROM qmail.relaytofrom;
+----------------+-----------------------+------+-----+---------------------+----------------+
| Field          | Type                  | Null | Key | Default             | Extra          |
+----------------+-----------------------+------+-----+---------------------+----------------+
| id             | bigint(20)            |      | PRI | NULL                | auto_increment |
| relay_ip       | varchar(16)           | YES  | MUL | NULL                |                |
| mail_from      | varchar(255)          | YES  | MUL | NULL                |                |
| rcpt_to        | varchar(255)          | YES  | MUL | NULL                |                |
| block_expires  | datetime              |      |     | 0000-00-00 00:00:00 |                |
| record_expires | datetime              |      |     | 0000-00-00 00:00:00 |                |
| blocked_count  | bigint(20)            |      |     | 0                   |                |
| passed_count   | bigint(20)            |      |     | 0                   |                |
| aborted_count  | bigint(20)            |      |     | 0                   |                |
| origin_type    | enum('MANUAL','AUTO') |      |     | MANUAL              |                |
| create_time    | datetime              |      |     | 0000-00-00 00:00:00 |                |
| last_update    | timestamp             | YES  |     | CURRENT_TIMESTAMP   |                |
+----------------+-----------------------+------+-----+---------------------+----------------+
12 rows in set (0.00 sec)

mysql> quit
Bye

Jetzt muss man die Dateien mit "make" kompilieren. Dazu gibt es im neuen Paket eine "install.sh" die vorher prüft, ob alle benötigten RPMs (siehe "Voraussetzungen") installiert wurden. Der Befehl "rpm" steht auf vielen Linux-Distributionen zur Verfügung. Ich habe das Shell-Skript mit SuSE und Debian getestet. Sollte "install.sh" eine Fehlermeldung bringen, die nichts mit den fehlenden Paketen "openssl-devel" oder "mysql-devel" zu tun hat, dann kann man hier auch nur "make" eingeben (siehe Original von Brent).

strato:/usr/src/qmail-1.05 # ./install.sh
( cat warn-auto.sh; \
echo CC=\'`head -1 conf-cc`\'; \
echo LD=\'`head -1 conf-ld`\' \
) > auto-ccld.sh
cat auto-ccld.sh make-load.sh > make-load
(...)
./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`
#############################################################
#### 'make' finished. Please check for critical errors!  ####
#############################################################

Um den "make" zu kontrollieren kann man den untenstehende Befehl eingeben. Der Befehl sollte die Zahl "85" zurückliefern.

strato:/usr/src/qmail-1.05
# ls -l | grep -cv '\..\{1,12\}$\|conf-\|make-\|Makefile\|warn-\|[[:upper:]].$'
85

Der "make" sollte eigentlich nur dann fehlschlagen, wenn wichtige Pakete fehlen. Deshalb müssen jetzt nur noch die neuen Dateien kopiert werden und die Dateirechte gesetzt werden.

strato:/usr/src/qmail-1.05 # /etc/rc.d/qmail stop
strato:/usr/src/qmail-1.05 # cp qmail-envelope-scanner /var/qmail/bin/.
strato:/usr/src/qmail-1.05 # cp qmail-smtpd /var/qmail/bin/.
strato:/usr/src/qmail-1.05 # chown root.qmail /var/qmail/bin/qmail-envelope-scanner
strato:/usr/src/qmail-1.05 # chown root.qmail /var/qmail/bin/qmail-smtpd
strato:/usr/src/qmail-1.05 # /etc/rc.d/qmail start

Danach habe ich ein CATCH-ALL für meine Domain aktiviert und ein "tail" lieferte

tail /tmp/greylist_dbg.txt

--------
protocol = notneeded4qmail increase@blindsz.com
increase@blindsz.com -> cloidtd@clausvb.de (62.227.194.124) Doesn’t Exists Block
--------
protocol = notneeded4qmail Scott@blueskyimages.co.uk
Scott@blueskyimages.co.uk -> christo@clausvb.de (86.196.215.34) Doesn’t Exists Block
--------
protocol = notneeded4qmail logic-s.com@usedoffset.com
logic-s.com@usedoffset.com -> www@clausvb.de (200.120.143.210) Doesn't Exists Block
--------
protocol = notneeded4qmail erika_mustermann@yahoo.de
erika_mustermann@yahoo.de -> www@clausvb.de (217.146.177.35) Doesn't Exists Block
--------
protocol = notneeded4qmail erika_mustermann@yahoo.de
erika_mustermann@yahoo.de -> www@clausvb.de (217.146.177.35) Exists Accept id = 10  expire = 1
--------

Kritische Fehler

Obwohl ich einige der Warnungen bereinigt habe, ist es möglich, dass noch folgende "Fehler" auftreten:

qmail-qmtpd.c: In function 'resources':
qmail-qmtpd.c:16: warning: incompatible implicit declaration of built-in function '_exit'

qmail-smtpd.c: In function 'tls_verify':
qmail-smtpd.c:783: warning: pointer targets in assignment differ in signedness

spfquery.c: In function 'main':
spfquery.c:30: warning: incompatible implicit declaration of built-in function 'strdup'

Diese Warnungen sind alle normal und treten (vielleicht) nicht bei allen Linux-Distributionen auf. Der C-Code ist nicht sauber programmiert und nicht auf unterschiedlichen Systemen getestet worden.

Die folgenden Fehler sind jedoch kritisch:

qmail-remote.c:663: warning: return type of `main' is not `int'
make: *** [qmail-remote.o] Error 1

./compile: line 3: exec: cc: not found
make: *** [qmail-local.o] Error 127

collect2: ld returned 1 exit status
make: *** [qmail-envelope-scanner] Error 1

local_scan.c:255: error: `mysql' undeclared (first use in this function)
*** Error code 1

tls.c:12: error: conflicting types for 'strerror'
/usr/include/string.h:256: error: previous declaration of 'strerror' was here
make: *** [tls.o] Error 1

Die Fehler haben unterschiedliche Ursachen. Den Fehler in der Datei "tls.c" habe ich (dank TJ) gefixt. Es muss sichergestellt sein, das die Pakete "gcc", "mysql-devel" und "openssl-devel" installiert sind. Sollte dennoch einer der oben genannten Fehler auftreten, dann bitte einen Post im Forum machen, danke!

Es gibt ein außerdem ein Problem mit den neusten MySQL-Versionen (5.x und aufwärts): Huschi und AMD-Hammer haben das Problem lokalisiert. Es hat etwas mit der Passwortumstellung von MySQL zu tun. Dafür gibt es die MySQL-Funktion "OLD_PASSWORD". Da der C-Code noch mit der alten Funktion arbeitet, muss man das umstellen.

Cleanup-Perl-Skript

Um die Datenbank regelmäßig aufzuräumen sollte man ein (von mir leicht optimiertes) PERL-Skript in der "/etc/cron.daily" plazieren, mit folgendem Inhalt:

#!/usr/bin/perl
use strict;
use warnings;

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

use DBI;

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

my $dbh = DBI->connect(DBD, DBUSER, DBPASS)
   or die 'Can't connect to MySQL ', $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;

exit;

Die Passwörter müssen entsprechend angepasst werden. Das oben gepostete Skript wurde von Gerard Earley in einigen Punkten überarbeitet.

Die Installation vom "Plesk Greylisting Control Panel"

Haggybear hat im ServerSupportForum seine Software "Plesk Greylisting Control Panel" zum Download bereitgestellt. Die Installation ist hier etwas anders beschrieben, weil ich lieber mit der Kommandozeile (auf Shell-Ebene) arbeite. Unter openSUSE ist das PSA-Verzeichnis "/usr/local/psa/admin/htdocs".

cd /usr/local/psa/admin/htdocs
wget http://serversupportforum.de/forum/attachments/plesk/2226d1222016660-plesk-greylisting-control-panel-gcp.zip

--18:04:01--  http://serversupportforum.de/forum/attachments/plesk/
           => `2226d1222016660-plesk-greylisting-control-panel-gcp.zip'
Auflösen des Hostnamen »serversupportforum.de«.... 85.25.23.250
Verbindungsaufbau zu serversupportforum.de|85.25.23.250|:80... verbunden.
HTTP Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 41.751 (41K) [application/zip]

100%[==============================================================>] 41.751        --.--K/s

18:04:01 (1.37 MB/s) - »2226d1222016660-plesk-greylisting-control-panel-gcp.zip« gespeichert [41751/41751]

server:/usr/local/psa/admin/htdocs # unzip 2226d1222016660-plesk-greylisting-control-panel-gcp.zip
Archive:  2226d1222016660-plesk-greylisting-control-panel-gcp.zip
   creating: gcp17/
   creating: gcp17/lang/
  inflating: gcp17/lang/de.inc.php
  inflating: gcp17/lang/en.inc.php
  inflating: gcp17/INSTALL.txt
  inflating: gcp17/LICENSE.txt
  inflating: gcp17/bg.gif
  inflating: gcp17/block.gif
  inflating: gcp17/cm.php
  inflating: gcp17/config.inc.php
  inflating: gcp17/conn.php
  inflating: gcp17/db.php
  inflating: gcp17/domain.php
  inflating: gcp17/funcs.php
 extracting: gcp17/gllogo.gif
  inflating: gcp17/help_ico.gif
  inflating: gcp17/ident.php
  inflating: gcp17/index.php
  inflating: gcp17/kill.gif
  inflating: gcp17/loading.gif
  inflating: gcp17/overview.php
  inflating: gcp17/pass.gif
  inflating: gcp17/pgcp_updater.sh
  inflating: gcp17/pixel.gif
  inflating: gcp17/toggle.gif
  inflating: gcp17/toggle_block.gif
  inflating: gcp17/toggle_pass.gif
  inflating: gcp17/update.php
 extracting: gcp17/version.php
  inflating: gcp17/whitelist.php
  inflating: gcp17/wrapper

server:/usr/local/psa/admin/htdocs # mv gcp17/ greylisting
server:/usr/local/psa/admin/htdocs # chown root:psaadm greylisting
server:/usr/local/psa/admin/htdocs # chmod 755 greylisting
server:/usr/local/psa/admin/htdocs # cd greylisting/
server:/usr/local/psa/admin/htdocs/greylisting # chown root:psaadm -R *
server:/usr/local/psa/admin/htdocs/greylisting # find . -type f -exec chmod 0644 {} \;
server:/usr/local/psa/admin/htdocs/greylisting # find . -type d -exec chmod 0755 {} \;

Ich habe den Dateien nur die Rechte "644" gegeben, weil Ausführrechte nicht notwendig sind.

Screenshot: Plesk

Der Screenshot zeigt, wie man in Plesk (mit deutscher Sprache) einen neuen Button anlegt. Danach folgt man der Anleitung von Haggybear aus der "INSTALL.txt". Bei mir sah das dann so aus:

Screenshot: Plesk

Weblinks

Die Seite von Brent Meshier enthält die Artikel zu Greylisting nicht mehr. Deswegen habe ich die Artikel auf meiner Webseite übernommen bzw. hier auf archive.org verlinkt.

Diese Seite erfüllt die folgenden Standards:

Valid XHTML   Valid CSS