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"