Mail-Blacklist-Überwachung [Update]
DNS-Blocklisten tragen zur wirksamen Spam-Abwehr bei. Doch wenn man selbst auf eine solche Liste gerät, bleibt die abgehende Mail plötzlich stecken. Zwei einfache Skripte informieren den Postmaster automatisch, sobald sein Server fälschlich gelistet wird.
- Johannes Endres
Update 4.8.09: Wir haben die Liste der Blacklisten erweitert und zwei kleine Fehler in den Skripten korrigiert.
Update 14.1.14: Da der Dienstleister AHBL seinen Service eingestellt hat, haben wir die betreffenden Abfragen und Tabelleneinträge entfernt.
Blocklisten wie NiX-Spam sind eins der Elemente, die zu einer wirksamen Spam-Abwehr beitragen. Der empfangende Mail-Server prüft mit einer DNS-Abfrage, ob der einliefernde Server auf einer der Listen steht und unterbricht dann gegebenenfalls die Verbindung. Wegen dieser Abfragemethode heißen die üblichen Listen DNS-Blacklisten (DNSBL).
Die Kriterien, nach denen eine IP-Adresse auf einer Liste landen, sind sehr unterschiedlich. So versucht die Policy Block List von Spamhaus.org, alle Adressen zu erfassen, die die Provider ihren Kunden bei der Einwahl vergeben. Ein Rechner mit einer solchen dynamischen IP-Adresse ist höchstwahrscheinlich kein regulärer Absender, sondern eher eine per Trojaner gekaperte Spam-Schleuder, sodass es manchem Postmaster sinnvoll erscheint, sie zu blockieren.
Häufiger sind jedoch Listen, auf denen die Adressen von Servern landen, die tatsächlich Spam verschickt haben. So nutzt beispielsweise die NiX-Spam-Liste eine Kombination aus User-Meldungen und Spam-Fallen, die automatisch reagieren.
Auf solchen Listen kann aber auch ein Server landen, der gar keinen Spam versendet. Das passiert zum Beispiel, wenn ein Internet-Nutzer einen Newsletter abonniert hat, dies später vergisst und den eingehenden Newsletter als Spam betrachtet. Wenn er den Absender dann bei einer DNSBL meldet, landet darauf ein Server, der gar nichts Unrechtes getan hat.
Manche Listen sperren (anders als NiX-Spam) keine einzelnen Adressen, sondern immer gleich ganze Blöcke, wenn ein Server daraus Spam verschickt. Bei dedizierten Servern (root-Servern), die sich beim Hoster ein Netzwerk teilen, kann das fatal sein: Wenn nur einer der (Freizeit-)Admins seinen Server nicht unter Kontrolle hat und ihn an einen Spammer verliert, stehen plötzlich auch die besser gesicherten Netz-Nachbarn auf einer DNSBL.
Über diese und andere Wege kann also durchaus auch der Server eines Postmasters, der alles richtig macht und keinen Spam verschickt, auf einer DNSBL landen. Das fällt dann meist eher zufällig auf, wenn die Mail eines Users mit einer Fehlermeldung zurückkommt. Weil aber einige Server so konfiguriert sind, dass sie im Falle eines DNSBL-Treffers die Verbindung ohne Fehlermeldung abbrechen, können die Fehlermeldungen ausbleiben. Dann verschwinden wahrscheinlich allerhand E-Mails im Orkus, bevor der Postmaster etwas merkt.
Daher sollte er regelmäßig prüfen, ob die IP-Adresse seines absendenden Servers blockiert wird. Das muss keine Handarbeit sein, sondern kann ebenso automatisch ablaufen wie die DNSBL-Abfrage im empfangenden Server.
Wir stellen hier Skripte für zwei Methoden vor: Zum einen einen Cron-Job, der sich per Mail meldet, und zum anderen ein Plug-In für das Systemüberwachungssystem Nagios. Daraus lassen sich auch leicht Skripte für andere Umgebungen ableiten.
Verdrehte Abfrage
Verdrehte Abfrage
Die Abfrage funktioniert für alle DNSBL gleich, nämlich ähnlich wie die Rückwärtsauflösung einer IP-Adresse zu einem Namen: Die Bytes der Adresse werden in umgekehrte Reihenfolge gebracht, und dann die passende Domain angehängt, damit die Anfrage auch genau bei dem richtigen Server landet. Um beispielsweise zu kontrollieren, ob die Adresse 192.0.2.123 auf der NiX-Spam-Liste steht, fragt man nach 123.2.0.192.ix.dnsbl.manitu.net
, etwa mit nslookup oder dig.
Wenn die Adresse nicht auf der Liste steht, liefert der DNS-Server eine Fehlermeldung zurück, andernfalls eine Adresse im Bereich 127.0.0.x. Einige Listen kodieren im x weiter Informationen, etwa den Grund, warum diese Adresse gelistet wird. Doch für die Selbstkontrolle des Postmaster genügt die Information, dass sein Server überhaupt auf der Liste steht.
Ein minimales Skript wandelt also zuerst die zu prüfende IP-Adresse von der Kommandozeile ins richtige Format und klappert dann eine Liste von DNSBLs ab. Wenn als Antwort eine Adresse zurückkommt, die mit 127.0.0. beginnt, gibt es eine Meldung aus:
#!/bin/sh
DNSBLlist="ix.dnsbl.manitu.net
bl.spamcannibal.org
xbl.spamhaus.org"
set `IFS=".";echo $1`
ip_arpa=$4.$3.$2.$1
for l in $DNSBLlist
do
if nslookup $ip_arpa.$l | grep -q "Address: 127.0.0."
then
echo "$1 steht auf $l"
fi
done
Im Prinzip könnte man dieses Skript schon als cron-Job regelmäßig laufen lassen. Wenn eine Meldung ausgegeben wird, schickt cron sie automatisch per Mail. Allerdings geht die Warn-Mail abhängig von der cron-Konfiguration nicht unbedingt an den Postmaster. Wir stellen daher unten eine wesentlich erweiterte Version des Skripts zur Verfügung, in die Sie oben die Postmaster-Adresse eintragen. Außerdem ist die Liste der DNSBL dort so aufgebaut, dass Sie einzelne Einträge mit einem # auskommentieren können.
Standalone-Skript
#!/bin/sh
#
# dnsbl-check-standalone.sh
#
# By Damon Tajeddini (dta)
# # 10.03.2009
#
MAIL_RCPT="postmaster@example.com"
DNSBLlist=`grep -v ^# <<!
cbl.abuseat.org
virbl.dnsbl.bit.nl
blackholes.five-ten-sg.com
dnsbl.inps.de
ix.dnsbl.manitu.net
no-more-funn.moensted.dk
combined.njabl.org
dnsbl.njabl.org
dnsbl.sorbs.net
bl.spamcannibal.org
bl.spamcop.net
sbl.spamhaus.org
xbl.spamhaus.org
pbl.spamhaus.org
dnsbl-1.uceprotect.net
# dnsbl-2.uceprotect.net
# dnsbl-3.uceprotect.net
psbl.surriel.com
l2.apews.org
dnsrbl.swinog.ch
db.wpbl.info
!`
# reverse IP address bytes
convertIP()
{
set `IFS=".";echo $1`
echo $4.$3.$2.$1
}
usage()
{
echo "Usage: $0 [-H <host>|-p]"
echo " -H IP address to check"
echo " -p Print list of DNSBLs"
exit 3
}
# Checks the IP with list of DNSBL servers
check()
{
for i in $DNSBLlist
do
if dig $ip_arpa.$i +short | grep -q "^127.0.0."
then
mail -s "** Service Alert: $ip found on $i **" $MAIL_RCPT <<!
*** DNSBL WARNING ***
Service: $progname
Host: `hostname`
Date/Time: `date`
Additional Info: DNSBL-Alarm: $ip is listed on $i
!
fi
done
exit
} # check
case $1 in
-H)
if [ -z "$2" ]; then
echo "ip address missing"
exit
fi
ip=$2
ip_arpa=`convertIP $ip`
check;;
-p)
for i in $DNSBLlist
do
echo $i
done
exit;;
--help)
usage
exit;;
*)
if [ -z "$1" ]; then
usage
fi
echo "unknown command: $1"
exit;;
esac
Nagios-Plugin
Nagios-Plugin
Wer Nagios einsetzt, um seine Systeme zu überwachen, kann die DNSBL-Abfrage auch dort integrieren. Das hat den Vorteil, dass die Warnung nicht als Mail an einen einzelnen Admin geht, sondern über das Nagios-eigene Alarm-System verschiedene Informationswege genutzt werden können. Nach demselben Prinzip lässt sich die Abfrage auch in andere Überwachungssysteme einbauen, die ein Plug-In-Konzept haben.
Wie Nagios grundsätzlich aufgesetzt wird, beschriebt der Artikel Netzwerküberwachung mit Nagios. Dort steht auch, wie ein Plug-In auszusehen hat: Eine ausführbare Datei, die im Exit Code den Zustand des geprüften Dienstes zurück liefert und einen Warntext für den Admin ausgibt. Nagios ruft das Plug-In dann mit der IP-Adresse des Mail-Servers auf und speist die Ergebnisse sowohl in die Web-Oberfläche als auch ins Alarm-System ein.
Die Nagios-Variante
#!/bin/sh
#
# dnsbl-check-nagios.sh
#
# (c) 2009 Damon Tajeddini & heise Netze
#
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
FOUND_ADRESS=0
DNSBLlist=`grep -v ^# <<!
cbl.abuseat.org
virbl.dnsbl.bit.nl
blackholes.five-ten-sg.com
dnsbl.inps.de
ix.dnsbl.manitu.net
no-more-funn.moensted.dk
combined.njabl.org
dnsbl.njabl.org
dnsbl.sorbs.net
bl.spamcannibal.org
bl.spamcop.net
sbl.spamhaus.org
xbl.spamhaus.org
pbl.spamhaus.org
dnsbl-1.uceprotect.net
# dnsbl-2.uceprotect.net
# dnsbl-3.uceprotect.net
psbl.surriel.com
l2.apews.org
dnsrbl.swinog.ch
db.wpbl.info
!`
# reverse IP address
convertIP()
{
set `IFS=".";echo $1`
echo $4.$3.$2.$1
}
usage()
{
echo "Usage: $0 [-H] <host>] [-p]"
echo " -H check Host "
echo " -p print list of DNSBLs"
exit 3
}
# Checks the IP with list of DNSBL servers
check()
{
count=0;
for i in $DNSBLlist
do
count=$(($count + 1))
if nslookup $ip_arpa.$i | grep -q "127.0.0." ;
then
FOUND_ADRESS=$(($FOUND_ADRESS + 1))
echo "DNSBL-Alarm: $ip is listed on $i"
fi
done
if [ $FOUND_ADRESS -ge 1 ]
then
exit 1
fi
echo "OK - $ip not on $count DNSBLs"
exit 0
}
case $1 in
-H)
if [ -z "$2" ]
then
echo "ip address missing"
exit
fi
ip=$2
ip_arpa=`convertIP $ip`
check;;
-p)
for i in $DNSBLlist
do
echo $i
done
exit $STATE_WARNING
exit;;
--help)
usage
exit;;
*)
if [ -z "$1" ]
then
usage
fi
echo "unknown command: $1"
exit;;
esac
Wenn es passiert ist
Wenn es passiert ist
Wenn eines unserer beiden Skripte einen Alarm auslöst, sollte der Postmaster sich schnell bemühen, wieder von der Liste zu kommen. Dafür gibt es überall dokumentierte Verfahren. Links zu den jeweiligen Seiten haben wir hier zusammengestellt.
Name | DNS-Domain im Skript | Link zur Löschung von der DNBSL |
APEWSL2 | l2.apews.org | http://www.apews.org/?page=faq |
Composite Block List | cbl.abuseat.org | http://cbl.abuseat.org/lookup.cgi |
DNS Black Hole List | dnsbl.inps.de | http://dnsbl.inps.de/removereq.cgi |
Exploits Blocklist | xbl.spamhaus.org | http://www.spamhaus.org/xbl/index.lasso |
five-ten-sg.com | blackholes.five-ten-sg.com | http://www.five-ten-sg.com/blackhole.php |
NiX Spam | ix.dnsbl.manitu.net | http://www.dnsbl.manitu.net/ |
no-more-funn | no-more-funn.moensted.dk | http://moensted.dk/spam/no-more-funn/ |
Not Just Another Bogus List | combined.njabl.org | http://njabl.org/remove.html |
Not Just Another Bogus List | dnsbl.njabl.org | http://njabl.org/remove.html |
PSBL SURRIEL | psbl.surriel.com | http://psbl.surriel.com/remove |
SpamCannibal | bl.spamcannibal.org | http://www.spamcannibal.org/cannibal.cgi |
SpamCop | bl.spamcop.net | Die IP wird automatisch binnen 24 Stunden gelöscht |
Spamhaus Block List | sbl.spamhaus.org | http://www.spamhaus.org/sbl/delistingprocedure.html |
SWINOG DNSRBL | dnsrbl.swinog.ch | http://antispam.imp.ch/spamikaze/remove.php |
UCEPROTECT BL | dnsbl-1.uceprotect.net | http://www.uceprotect.net/de/rblcheck.php |
UCEPROTECT BL | dnsbl-2.uceprotect.net | http://www.uceprotect.net/de/rblcheck.php |
UCEPROTECT BL | dnsbl-3.uceprotect.net | http://www.uceprotect.net/de/rblcheck.php |
Virus BL | virbl.dnsbl.bit.nl | Die IP wird automatisch binnen 24 Stunden gelöscht |
Weighted Private BL | db.wpbl.info | http://www.wpbl.info/cgi-bin/detail.cgi |
()