Mail-Blacklist-Überwachung [Update]

Seite 2: Verdrehte Abfrage

Inhaltsverzeichnis

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.

Mehr Infos

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