Mise en place d'un dnsbl personnalisé avec rblsmtpd, qmail et bind9.

Environnement de travail:

1) serveur debian-lenny sur lequel est installé bind9. Ce serveur dns gère quelques domaines locaux fictifs et forwarde les requêtes internet.
    Pour les tests j'utiliserais les domaines suivants: xmail.pat, net.pat .

sn2caen:/# uname -a
Linux sn2caen 2.6.26-1-686 #1 SMP Sat Jan 10 18:29:31 UTC 2009 i686 GNU/Linux
sn2caen:/# cat /etc/issue
Debian GNU/Linux 5.0 \n \l

sn2caen:/# dpkg -l bind9
=================================================
ii  bind9                         1:9.5.1.dfsg.P1-1             Internet Domain Name Server
sn2caen:/# cat /etc/resolv.conf
nameserver 192.168.1.80

sn2caen:/# hostname --fqdn
sn2caen.venoix.loc


2) Un serveur sur lequel tourne qmail et rblsmtpd gérant les mails du domaine net.pat

srvglus238:/# uname -a
Linux srvglus238 2.6.28-vs2.3.0.36.2-VIRT #8 Mon Feb 16 13:17:53 CET 2009 x86_64 GNU/Linux
srvglus238:/# cat /etc/issue
Debian GNU/Linux 5.0 \n \l

srvglus238:/# dpkg -l qmail ucspi-tcp
===================================================
ii  qmail                         1.03-38.dotdeb.2              Secure, reliable, efficient, simple mail transport system
ii  ucspi-tcp                     1:0.88-2                      command-line tools for building TCP client-server applications

srvglus238:/# hostname --fqdn
srvglus238.net.pat

3) Un second serveur de mail (xmail cf article précédent) tournant dans un vserver et gérant les mails du domaine xmail.pat.

vweb3:/# uname -a
Linux vweb3.xmail.pat 2.6.28-vs2.3.0.36.2-VIRT #8 Mon Feb 16 13:17:53 CET 2009 x86_64 GNU/Linux

vweb3:/# cat /etc/issue
Debian GNU/Linux 5.0 \n \l

vweb3:/# hostname --fqdn
vweb3.xmail.pat


vweb3:/# dpkg -l xmail
============================================================
ii  xmail                         1.25-4                        advanced, fast and reliable ESMTP/POP3 mail server


Les adresses ip sont ainsi définies:


sn2caen:/# dig axfr xmail.pat | egrep -v '^\;|^$'
xmail.pat.        3600    IN    SOA    sn2caen.venoix.loc. root.venoix.loc. 2009030201 28800 7200 604800 86400
xmail.pat.        3600    IN    NS    ns.venoix.loc.
xmail.pat.        3600    IN    MX    15 mx.xmail.pat.
xmail.pat.        3600    IN    A    192.168.1.249
mx.xmail.pat.        3600    IN    A    192.168.1.249
smtp.xmail.pat.        3600    IN    CNAME    xmail.pat.
www.xmail.pat.        3600    IN    CNAME    xmail.pat.
xmail.pat.        3600    IN    SOA    sn2caen.venoix.loc. root.venoix.loc. 2009030201 28800 7200 604800 86400


sn2caen:/# dig axfr net.pat | egrep -v '^\;|^$'
net.pat.        3600    IN    SOA    sn2caen.venoix.loc. root.venoix.loc. 2009030202 28800 7200 604800 86400
net.pat.        3600    IN    NS    ns.venoix.loc.
net.pat.        3600    IN    MX    10 mx.net.pat.
net.pat.        3600    IN    A    192.168.1.241
mx.net.pat.        3600    IN    A    192.168.1.241
pme-linux.net.pat.    3600    IN    A    192.168.1.244
proxmox.net.pat.    3600    IN    A    192.168.1.233
smtp.net.pat.        3600    IN    CNAME    net.pat.
srvglus238.net.pat.    3600    IN    A    192.168.1.241
vpe1.net.pat.        3600    IN    A    192.168.1.234
vpe2.net.pat.        3600    IN    A    192.168.1.235
vweb3.net.pat.        3600    IN    A    192.168.1.249
www.net.pat.        3600    IN    CNAME    net.pat.
net.pat.        3600    IN    SOA    sn2caen.venoix.loc. root.venoix.loc. 2009030202 28800 7200 604800 86400


sn2caen:/# dig axfr venoix.loc | egrep -v '^\;|^$'
venoix.loc.        3600    IN    SOA    sn2caen.venoix.loc. root.venoix.loc. 2009030202 28800 7200 604800 86400
venoix.loc.        3600    IN    NS    ns.venoix.loc.
venoix.loc.        3600    IN    MX    10 mx.venoix.loc.
venoix.loc.        3600    IN    A    192.168.1.80
mx.venoix.loc.        3600    IN    A    192.168.1.80
ns.venoix.loc.        3600    IN    A    192.168.1.80
smtp.venoix.loc.    3600    IN    CNAME    venoix.loc.
www.venoix.loc.        3600    IN    CNAME    venoix.loc.
venoix.loc.        3600    IN    SOA    sn2caen.venoix.loc. root.venoix.loc. 2009030202 28800 7200 604800 86400


Configuration du dns:

sn2caen:/etc/bind# cat named.conf | egrep -v '^$|\/\/'
include "/etc/bind/named.conf.options";
zone "." {
    type hint;
    file "/etc/bind/db.root";
};
zone "localhost" {
    type master;
    file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
    type master;
    file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
    type master;
    file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
    type master;
    file "/etc/bind/db.255";
};
zone "dnsbl.spam" {
        type master;
        file "dnsbl.spam";
        allow-query {
        localhost;
        192.168.1.241;
        };
        allow-transfer { 127.0.0.1; };
};

include "/etc/bind/named.conf.local";

J'ai simplement ajouté une nouvelle zone fictive dnsbl.spam dans le fichier de conf. Comme le serveur de mail sur lequel tourne rblsmtpd (srvglus238 IP 192.168.1.241) n'est pas sur la même machine, je l'autorise explicitement à effectuer des requêtes dns (ligne allow-query).

Le fichier de zone /var/cache/bind/dnsbl.spam se présente ainsi:

sn2caen:/var/cache/bind# cat dnsbl.spam
$TTL 86400      ; 1 day
@       IN      SOA     sn2caen.venoix.loc. root.venoix.loc. (
                        2009031104
                        8H
                        2H
                        1W
                        1D )
@       IN      NS      ns.venoix.loc.

;
@               IN A    192.168.1.80
;
; -----------------------------------------------------------------
2.0.0.127       IN A    127.0.0.2
                IN TXT  "dnsbl.spam test "
3.0.0.127       IN A    127.0.0.3
                IN TXT  "dnsbl.spam spam"
10.0.0.127      IN A    127.0.0.10
                IN TXT  "dnsbl.spam divers"
;
; -----------------------------------------------------------------
249.1.168.192   IN A  127.0.0.3
                IN TXT "spam de trouducul"
45.3.200.10     IN A  127.0.0.3
                IN TXT "spam de plusieurs trouduculs"
; une plage complète  10.222.5.0/24 utilisant le joker *
*.5.222.10      IN A  127.0.0.10
                IN TXT "autre motif"
; a complete range 10.223.0.0/16 using * wildcard
*.223.10        IN A  127.0.0.10
                IN TXT "un autre motif de blocage"
;

Extrait du man de rblsmtpd:
 -r base
              Use  base  as  an RBL source. An IP address a.b.c.d is listed by that source if d.c.b.a.base has a TXT record.  rblsmtpd uses
              the contents of the TXT record as an error message for the client.

En clair on devra trouver dans les logs du serveur qui a refusé la connexion le message de la chaine IN TXT "bla bla"

Les fichiers étant écrits, je stoppe/redémarre bind9 puis procède à quelques tests avant d'aller plus loin:

sn2caen:/var/cache/bind# /etc/init.d/bind9 stop
Stopping domain name service...: bind9.
sn2caen:/var/cache/bind# /etc/init.d/bind9 start
Starting domain name service...: bind9.

sn2caen:/var/cache/bind# host 249.1.168.192.dnsbl.spam
249.1.168.192.dnsbl.spam has address 127.0.0.3

Ca paraît correct.

Configuration sur le serveur qmail:

Là rien de bien méchant: il suffira d'ajouter le nouveau serveur dans la définition de la variable rblsmtpd du script /etc/init.d/qmail:

rblsmtpd="/usr/bin/rblsmtpd -r dnsbl.spam -r sbl-xbl.spamhaus.org -r bl.spamcop.net"

Redémarrer ensuite qmail .

srvglus238:/# /etc/init.d/qmail stop
Stopping mail-transfer agent: qmail (with rblsmtpd).
srvglus238:/# /etc/init.d/qmail start
Starting mail-transfer agent: qmail (with rblsmtpd).

Tests:

Maintenant je vais envoyer un mail depuis la machine censée être blacklistée dans les rbl (vweb3 adresse IP 192.168.1.249)

vweb3:/# echo "Essai depuis vweb3" | mail -s "essai 110309" root@net.pat

srvglus238:/var/log# tail -f mail.log syslog

==> mail.log <==
Mar 11 16:11:57 srvglus238 qmail: 1236784317.396946 rblsmtpd: 192.168.1.249 pid 16512: 451 spam de trouducul

==> syslog <==
Mar 11 16:11:57 srvglus238 qmail: 1236784317.396946 rblsmtpd: 192.168.1.249 pid 16512: 451 spam de trouducul

Ok c'est bon.

Tout l'intérêt de ce procédé est de pouvoir bloquer une ip (voire une plage d'ip) rapidement (un simple ajout dans le fichier de zone dnsbl.spam suivi d'un reload du dns) sans passer par iptables et AVANT que le mail ne soit traité par l'antispam libérant le serveur de cette charge de travail supplémentaire.

On pourra également l'utiliser pour bloquer certains sites qui ne seront probablement jamais blacklistés mais sur lesquels on a dû s'inscrire de force en fournissant une adresse mail valide et qui depuis vous balancent régulièrement des messages dont vous n'avez rien à faire...