Bloqueos DNS en Spamassassin (URIBL_BLOCKED / RCVD_IN_DNSWL_BLOCKED)

Este problema se produce generalmente cuando no estamos usando un servidor DNS local. Mantener un DNS local consume muchos recursos, sobre todo con Bind que es el viene de forma predeterminada, además de los problemas de seguridad.

Este problema se resume en que, Spamassassin no consigue consultar las listas de bloqueo y reputación basadas en los nombres de dominio. En esta situación, la proporción de spam que entra en el sistema aumenta considerablemente.

Antes de explicar mi solución incluyo algunas referencias de donde he cogido información:

En primer lugar, este problema de detecta en las cabeceras de los correos recibidos:

0.0 RCVD_IN_DNSWL_BLOCKED  RBL: ADMINISTRATOR NOTICE: The query to
                        DNSWL was blocked.  See
                        http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block
                            for more information.

0.0 URIBL_BLOCKED          ADMINISTRATOR NOTICE: The query to URIBL was blocked.
                        See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block
                        for more information.

Para entender los bloqueos es necesario ver la consulta que está haciendo Spamassassin. Concretamente estos bloqueos provienen de consultas a:

En primer lugar las DNSBL hacen referencia a _DNS block lists. Para entender el bloqueo hay que tener claro que proviene de una reglas de Spamassassin que consultan mediante peticiones DNS. Y éstas peticiones no las realizar Spamassassin directamente, sino que utiliza el servidor DNS que esté configurado en el sistema, probablemente el de tu proveedor de servicio.

Para solucionarlo es mejor entender el problema antes de empezar a aplicar recetas a ciegas copiadas la red. Para entenderlo mostraré el procedimiento usado con dnswl.org:

¿Cómo se realiza la consulta?

Pues se realiza mediante peticiones DNS directamente a los servidores que encargados de esta lista: dnswl.org. Este servidor bloquea a quien supera aproximadamente unas 100.000 peticiones al día, es complicado llegar a eso, en un pequeño servidor, entonces…

¿Por qué me han bloqueado?

Pues la respuesta es que tu servidor probablemente no esté bloqueado, quien está bloqueado el servidor DNS que está usando tu sistema. Para comprobarlo se puede hacer lo siguiente: (asegúrate tener instalado el paquete dnsutils)

> dig -t txt amiblocked.dnswl.org

;; ANSWER SECTION:
amiblocked.dnswl.org.   21599   IN      TXT     "You are blocked from using list.dnswl.org through public nameservers"
amiblocked.dnswl.org.   21599   IN      TXT     "yes"

;; Query time: 47 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sat Apr 04 12:17:08 CEST 2020
;; MSG SIZE  rcvd: 146

Fíjate como en la respuesta se ve que estoy usando los servidores DNS de Goggle. La solución es usar un DNS caché propio, pero en la configuración propuesta usaré además DNS externos (forwarders), como los de Google, para todas las peticiones que no correspondan a listas DNS/RBL.

Para probar el bloqueo con uribl.com puedes encontrar información en http://uribl.com/about.shtml#testing

  • Si estoy bloqueado esta es la respuesta:

    > host -tTXT test.uribl.com.multi.uribl.com
    Host test.uribl.com.multi.uribl.com not found: 3(NXDOMAIN)
    
  • Si no lo estoy la respuesta es:

    > host -tTXT test.uribl.com.multi.uribl.com
    test.uribl.com.multi.uribl.com descriptive text "permanent testpoint"
    

Instalando Bind9 y configurando los forwarders

Como DNS local usaré Bind aunque Unbound es una buena alternativa, Bind tiene más opciones y hay más documentación. La instalación es fácil:

apt install bind9

La configuración por defecto de Bind utiliza los servidores DNSBL raiz, pero para que funcione mejor se pueden redireccionar las peticiones a DNS públicos de proveedores de servicios. Esta configuración es fácil, sólo hay que editar /etc/bind/named.conf.options y rellenar la parte forwarders con una lista de DNSs públicos:

forwarders {
    1.1.1.1;        // Cloudflare
    1.0.0.1;        // Cloudflare
    8.8.4.4;        // Google
    8.8.8.8;        // Google
    37.235.1.174;   // FreeDNS
    37.235.1.177;   // FreeDNS
    64.6.64.6;      // Verisign
    64.6.65.6;      // Verisign
    74.82.42.42;    // Hurricane Electric
    84.200.69.80;   // DNS Watch
    84.200.70.40;   // DNS Watch
    91.239.100.100; // censurfridns.dk
    109.69.8.51;    // puntCAT
    208.67.222.220; // OpenDNS
    208.67.222.222; // OpenDNS
    216.146.35.35;  // Dyn Public
    216.146.36.36;  // Dyn Public
    };

Tras esto hay que iniciar bind y cambiar los DNS del sistema a localhost. No voy a explicar como cambiar los DNS en Debian10 ya que dependiendo de como tengas configurada la red se hace de una forma u otra. Para comprobar que todo va bien:

> systemctl start bind9
> dig uribl.com
    ....
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: sáb abr 11 13:10:43 CEST 2020
;; MSG SIZE  rcvd: 191

> host -tTXT test.uribl.com.multi.uribl.com
Host test.uribl.com.multi.uribl.com not found: 3(NXDOMAIN)

En los 3 comandos anteriores se puede ver como al consultar con los DNS predeterminados en el sistema se está usando el servidor local SERVER: 127.0.0.1#53(127.0.0.1) pero el servidor local usa los forwarders y al consultar _uribl.com_ los forwarders están bloqueados.

Haciendo consultas directas a uribl.com y dnswl.org

La idea ahora es mantener los forwarders para todas las peticiones menos para uribl.com y dnswl.org. Es simple, sólo hay que editar fichero /etc/bind/named.conf.local hay que poner lo siguiente

// DNS RBLS
zone "dnswl.org" {
    type forward;
    forwarders {};
};

zone "uribl.com" {
    type forward;
    forwarders {};
};

Recargando la configuración de Bind (o reiniciando el servicio) debería funcionar, esta es la salida de mis pruebas exitosas:

> host -tTXT test.uribl.com.multi.uribl.com
test.uribl.com.multi.uribl.com descriptive text "permanent testpoint"

> host -t txt amiblocked.dnswl.org
amiblocked.dnswl.org descriptive text "no"