Wie ich vor ein paar Tagen bereits angedeutet habe, habe ich auf meinem Postfix nun einen IP-Filter am Start. Da es zudem Anfragen zur Weiternutzung dieser Liste gab, habe ich mir einmal kurz angeschaut, wieviel Aufwand das Veröffentlichen dieser Liste via Bind benötigt. Und wie sich herausstellt, lässt sich der Hauptteil der Arbeit mit gerade einmal einer Zeile AWK lösen.
Das Kernstück dafür bildet die bereits für Postfix vorhandene clients_access-Datei in der die zu sperrenden IPs eingetragen sind. Um diese in eine für Bind nutzbare Version zu überführen sind im Wesentlichen drei Dinge zu erledigen:
- Das REJECT aus der Zeile schmeißen
- Die IP umkehren (von a.b.c.d zu d.c.b.a)
- Aus diesen Einträgen A und TXT-Records erzeugen
Zusätzlich dazu ist zum Eingliedern der Zone in Bind jedoch neben den eigentlichen Resource Records eine Reihe weiterer Einträge einzubinden, die ein paar Fehler-Conditions der Liste definieren. Ferner muss die Zone mit einem sauberen Origin versehen werden. Dies lässt sich am Einfachsten mit etwas Bash wunderbar bashen:
#Create some magic DNSBL zone from this list
echo -e "\$TTL 3600" > /etc/postfix/client_access.zone
echo -e "\$ORIGIN local.rbl.ccs-baumann.de." >> /etc/postfix/client_access.zone
echo -e "@\tIN\tSOA\tns42.sys.ccs-baumann.de. BenBE1987.gmx.net. ( `date +%s` 60 60 86400 60 )" >> /etc/postfix/client_access.zone
echo -e "@\tIN\tNS\tns42.sys.ccs-baumann.de." >> /etc/postfix/client_access.zone
echo -e "2.0.0.127\tIN\tA\t127.0.0.2" >> /etc/postfix/client_access.zone
echo -e "\t\tIN\tTXT\t\"BenBE Mail client blacklist - test entry - This list is active!\"" >> /etc/postfix/client_access.zone
echo -e "3.0.0.127\tIN\tA\t127.0.0.3" >> /etc/postfix/client_access.zone
echo -e "\t\tIN\tTXT\t\"Verified Spam Source\"" >> /etc/postfix/client_access.zone
echo -e "10.0.0.127\tIN\tA\t127.0.0.10" >> /etc/postfix/client_access.zone
echo -e "\t\tIN\tTXT\t\"Dialup IP\"" >> /etc/postfix/client_access.zone
echo -ne "\n" >> /etc/postfix/client_access.zone
Ist dieser Teil der Zonefile geschrieben, kommt besagter AWK-Einzeiler zum Einsatz:
cat /etc/postfix/client_access | awk 'split($0,b,"\t") split(b[1],a,".") {print a[4] "." a[3] "." a[2] "." a[1] "\tIN\tA\t127.0.0.3\n\t\tIN\tTXT\t\"rot in hell\"" }' >> /etc/postfix/client_access.zone
Nun muss lediglich die neu erstellte Zonefile noch an den Ort kopiert werden, wo Bind nach ihr sucht. Diesen Teil überlasse ich aber dem geneigten Leser. Zusätzlich sollte man nach diesem Update an Bind die Aufforderung zu einem Reload reichen, was aber auch eher eine Fingerübung für Shell-Programmierer sein dürfte. Zu guter Letzt noch ein kurzer Eintrag bei Bind in der Konfig ergänzt, um unsere Zone erstmalig bekanntzugeben und wir sind fertig. Als Beispiel sollen diese Zeilen aus meiner Bind-Konfiguration dienen:
zone "local.rbl.ccs-baumann.de" {
type master;
file "/etc/bind/master/db.de.ccs-baumann.rbl.local";
notify no;
};
Nach einem Reload von Bind sollte alles wie gewünscht funktionieren und die neue Zone erreichbar sein. Wer möchte, darf meine DNSBL „local.rbl.ccs-baumann.de“ gerne mit verwenden, sollte sich aber im Klaren sein, dass diese hauptsächlich für meine Zwecke geführt wird und ich daher für nichts garantiere.
Werd das mal testen. Denke das läst sich noch weiter ausbauen … Sollten wir die tage mal drüber diskutieren …
Kommentar by neo — 18.05.2010 @ 15:42:08
Du kannst dir das Zonfile auch einfach über http://www.zonefile.org erstellen.
Kommentar by Bernd — 19.09.2012 @ 14:03:21
Die verlinkte Seite kümmert sich um ein anderes Problem, als die Shellscripte im Artikel lösen. Lesen des Artikels hilft.
Kommentar by BenBE — 23.09.2012 @ 15:23:10