lokales DNS-Black- und Whitelisting mit rbldnsd
Manchmal ist es nötig, bestimmte IP-Netze, die zwar viel Spam verschicken, aber dennoch nirgends gelistet werden, manuell auf eine eigene Blacklist zu setzen. Dann gibts da auch IP-Netze, z.B. von Orange in Frankreich, die den zahlenden Kunden zur Verfügung gestellt werden, über die dann aber auch soviel Müll verschickt wird, dass diese regelmäßig (zurecht) auf irgendwelchen Listen landen.
Hier will ich nun kurz zeigen, wie man sich für diese zwecke einen eigenen DNS-Blacklisting bzw. DNS-Whitelisting Server aufsetzt.
Installation
Ich habs unter Fedora 4 getestet, neuere Versionen weichen möglicherweise ab:
yum -y install rbldnsd
Konfiguration
Die Konfiguration ist sehr einfach gehalten. Über die Datei /etc/sysconfig/rbldnsdd werden nur einige Parameter gesetzt. Ich habe hier ein Setup mit nur einer Zone für eine DNS-Whitelist, zu Dokumentationszwecken habe ich trotzdem mal die komplette Datei mit Kommentaren eingefügt:
# /etc/default/rbldnsd # This file should set one variable, RBLDNSD, to be a multiline # list of all instances of rbldnsd to start. Every line in that # list consist of a key (basename for a pid file), and rbldnsd # command line, e.g.: # RBLDNSD="dnswl -r /var/lib/rbldnsd/dnswl -q -b 127.0.0.1 dnswl.magenbrot.net:ip4set:dnswl.magenbrot.net" # # or, using multiple lines and line continuations: # # RBLDNSD="dsbl -r/var/lib/rbldnsd/dsbl -q -b 127.2 \ # list.dsbl.org:ip4set:list \ # multihop.dsbl.org:ip4set:multihop \ # unconfirmed.dsbl.org:ip4set:unconfirmed \ # # local -r/var/lib/rbldnsd/local -q -b 127.3 \ # dialups.bl.example.com:ip4set:dialups \ # spews.bl.example.com:ip4set:spews \ # inputs.bl.example.com:ip4set:inputs \ # bl.example.com:ip4set:dialups \ # bl.example.com:ip4set:spews \ # bl.example.com:ip4set:inputs \ # # " # # This is the recommended way to keep entries readable and # easily editable. # # the first word, key, will be used to form pid file name, like # /var/run/rbldnsd-dsbl.pid, /var/run/rbldnsd-local.pid etc. # So, all keys should be unique. This is done in order to support # several instances of rbldnsd, if that'll be required. In a # simple case, when only one instance is needed, key may be # specified as a single dash, -, and in this case pid file # will be /var/run/rbldnsd.pid : # # RBLDNSD="- -r/var/lib/rbldnsd -q -b127.2 \ # zone list...\ # " # # See rbldnsd(8) for descriptions of options. #
wichtig ist hier nur die eine Zeile, deren Format ich hier kurz erkläre:
RBLDNSD="dnswl -r /var/lib/rbldnsd/dnswl -q -b 127.0.0.1 dnswl.magenbrot.net:ip4set:dnswl.magenbrot.net" key der zone fuers pidfile | | | chroot-verzeichnis | | | |zuerst in den hintergrund wechseln, dann die zonen laden |nur auf dieser Adresse lauschen |Zonenname:Typ:Filename
Zonefile erzeugen
jetzt muss noch das Zonefile erstellt werden. Für das obige Beispiel lautet der Dateiname etwa /var/lib/rbldnsd/dnswl/dnswl.magenbrot.net. Das Dateiformat sieht dann so aus:
80.12.242.128/28 orange in france is allowed
Dies legt liefert jetzt für das komplette Netz 80.12.242.128/28 ein Ergebnis (A- und TXT-Record, reverse).
rbldnsd testen
Das oben verwendete Netz gehört der Firma Orange in Frankreich. Es beheimatet deren SMTP-Server für Kundenmails. Bei einem RBL-Check werden die konfigurierten RBL-Listenserver mit der Reverse-Adresse befragt. Testen kann man das z.B. so:
# dig 141.242.12.80.dnswl.magenbrot.net @localhost ; <<>> DiG 9.3.1 <<>> 141.242.12.80.dnswl.magenbrot.net @localhost ; (1 server found) ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59106 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;141.242.12.80.dnswl.magenbrot.net. IN A ;; ANSWER SECTION: 141.242.12.80.dnswl.magenbrot.net. 2100 IN A 127.0.0.2 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Mon Jul 6 14:37:24 2009 ;; MSG SIZE rcvd: 72
Der TXT-Record dazu wird so abgefragt:
# dig 141.242.12.80.dnswl.magenbrot.net @localhost TXT ; <<>> DiG 9.3.1 <<>> 141.242.12.80.dnswl.magenbrot.net @localhost TXT ; (1 server found) ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23300 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;141.242.12.80.dnswl.magenbrot.net. IN TXT ;; ANSWER SECTION: 141.242.12.80.dnswl.magenbrot.net. 2100 IN TXT "orange in france is allowed" ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Mon Jul 6 14:43:10 2009 ;; MSG SIZE rcvd: 96
Konfiguration des MTA
Postfix
Achtung, das hier ist noch ungetestet, keine Ahnung ob das so funktioniert!
Blacklist
smtpd_client_restrictions = ..., check_client_access dns:maps_rbl, ... maps_rbl_base = localhost maps_rbl_lookup = reverse-quad:A maps_rbl_result = notfound:ignore, 127.0.0.2:ignore, *:deny, ...
Whitelist
smtpd_client_restrictions = ..., check_client_access dns:maps_rwl, ... maps_rwl_base = localhost maps_rwl_lookup = reverse-quad:A maps_rwl_result = notfound:ignore, 127.0.0.2:ignore, *:ok, ...
Sendmail
Blacklist
in /etc/mail/sendmail.mc folgende Zeilen eintragen:
FEATURE(`dnsbl',`ix.dnsbl.manitu.net',`"554 Rejected " $&{client_addr} " found in ix.dnsbl.manitu.net"')dnl FEATURE(`dnsbl',`sbl-xbl.spamhaus.org',`"554 Rejected " $&{client_addr} " found in sbl-xbl.spamhaus.org"')dnl
Whitelist
Für Sendmail muss der folgende m4-Hack in /usr/share/sendmail-cf/feature/dnswl.m4 abgelegt werden:
# based IP address white list local divert(8) R$* $: $&{client_addr} R::ffff:$-.$-.$-.$- $: <?> $(host $4.$3.$2.$1._ARG_. $: NotFound $) R$-.$-.$-.$- $: <?> $(host $4.$3.$2.$1._ARG_. $: NotFound $) R<?>NotFound $: OKSOFAR R<?>$+ $@ <OK> divert(-1)
Jetzt wird folgende Zeile VOR der Konfiguration der DNS-Blacklists eingefügt:
dnl whitelist FEATURE(`dnswl',`localhost')dnl dnl blacklists FEATURE(`dnsbl',`ix.dnsbl.manitu.net',`"554 Rejected " $&{client_addr} " found in ix.dnsbl.manitu.net"')dnl FEATURE(`dnsbl',`sbl-xbl.spamhaus.org',`"554 Rejected " $&{client_addr} " found in sbl-xbl.spamhaus.org"')dnl
Konfiguration von Spamassassin
für Spamassassin wird die local.cf (meist in /etc/mail/spamassassin) mit folgenden Zeilen ergänzt, der Score-Parameter ist nach belieben einzustellen. Soll die DNS-Liste als Blacklist dienen, so ist ein positiver Wert einzutragen, soll die Liste als Whitelist dienen muss ein negativer Wert eingetragen werden.
header DNSWL eval:check_rbl('localDNSWL', 'localhost') describe DNSWL local DNS-Whitelisting score DNSWL -100
No Comments