# 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:

<div id="bkmrk-yum--y-install-rbldn">```
yum -y install rbldnsd
```

</div>### 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:

<div id="bkmrk-%23-%2Fetc%2Fdefault%2Frbldn"><div>```
# /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.
#
```

</div></div>wichtig ist hier nur die eine Zeile, deren Format ich hier kurz erkläre:

<div id="bkmrk-rbldnsd%3D%22dnswl--r-%2Fv">```
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
```

</div>### 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:

<div id="bkmrk-80.12.242.128%2F28-ora"><div>```
80.12.242.128/28        orange in france is allowed
```

</div></div>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:

<div id="bkmrk-%23-dig-141.242.12.80."><div>```
# 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
```

</div></div>Der TXT-Record dazu wird so abgefragt:

<div id="bkmrk-%23-dig-141.242.12.80.-0">```
# 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
```

</div>### Konfiguration des MTA

#### Postfix

![FIXME](https://wiki.magenbrot.net/lib/images/smileys/fixme.gif) Achtung, das hier ist noch ungetestet, keine Ahnung ob das so funktioniert!

##### Blacklist

<div id="bkmrk-smtpd_client_restric">```
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, ... 
```

</div>##### Whitelist

<div id="bkmrk-smtpd_client_restric-0">```
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, ... 
```

</div>#### Sendmail

##### Blacklist

in /etc/mail/sendmail.mc folgende Zeilen eintragen:

<div id="bkmrk-feature%28%60dnsbl%27%2C%60ix.">```
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
```

</div>##### Whitelist

Für Sendmail muss der folgende m4-Hack in /usr/share/sendmail-cf/feature/dnswl.m4 abgelegt werden:

<div id="bkmrk-%23-based-ip-address-w"><div>```
# 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)
```

</div></div>Jetzt wird folgende Zeile VOR der Konfiguration der DNS-Blacklists eingefügt:

<div id="bkmrk-dnl-whitelist-featur">```
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
```

</div>### 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.

<div id="bkmrk-header-dnswl-eval%3Ach">```
header DNSWL    eval:check_rbl('localDNSWL', 'localhost')
describe DNSWL  local DNS-Whitelisting
score DNSWL     -100
```

</div>