Usando la Raspberry Pi para bloquear publicidad

Hola a tod@s,

Voy a explicar como bloquear los molestos anuncios que nos acosan en nuestra navegacion por Internet, utilizando una Raspberry con Debian y Bind, aunque probablemente estos mismos pasos sirvan para cualquier otra distro Linux.

Hasta relativamente hace poco, para bloquear los anuncios usaba componentes instalados en cada dispositivo de la red, lo que es complejo de gestionar. Debido a esto, me propuse implementar un método centralizado de bloquear los anuncios.

Ya que tengo una Raspberry en mi red que ya utilizaba como dns caché, decidí aprovecharla para tratar de bloquear las consultas de dominios que sirven anuncios.

Para evitar que este post se haga muy largo, doy por hecho que ya tenéis instalado Debian/Raspbian en vuestra Raspberry. Una vez tenemos el sistema funcionando, lo primero seria instalar bind.

apt-get install bind9

Aunque este post no va sobre caché dns, ya que vamos a usar bind, vamos a sacarle el máximo provecho. Para que bind funcione como cache dns, y asi poder acelerar nuestras consultas dns, tenemos que modificar el archivo /etc/bind/named.conf.options:

    forwarders {
         208.67.222.222;
         208.67.220.220;
    };

Yo uso los dns de opendns, pero podéis establecer los que mas os gusten.

En este momento ya tendríamos un dns funcional que podríamos usar en cualquier máquina de la red local.

Ahora vamos a ver cómo podemos bloquear los anuncios. Lo primero es buscar un listado de dominios conocidos por servir anuncios. Un listado completo y que se actualiza con frecuencia, lo podéis descargar de https://pgl.yoyo.org/adservers/. Esta web permite descargar el listado en distintos formatos compatibles con dnsmasq, bind, unbound,... Yo voy a descargarlo en el formato que usa bind, y lo guardo en un directorio temporal:

curl -f 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=bindconfig&showintro=0&mimetype=plaintext'  -o /tmp/ad-blacklist

Esto lo hago porque el archivo necesita unos pequeños retoques, que comentaré más adelante

Lo siguiente será crear una zona local en bind que envié las consultas sobre dominios de anuncios a la ip 127.0.0.1. Para ésto creamos el archivo /etc/bind/blackhole con el siguiente contenido:

$TTL    86400   ; one day
@       IN      SOA     ads.blackhole.org. hostmaster.blackhole.org. (
               2014090101
                    28800
                     7200
                   864000
                    86400 )        
                NS      ns.blackhole.org
                A       127.0.0.1
@       IN      A       127.0.0.1
*       IN      A       127.0.0.1

Ahora vamos a retocar el archivo con los dominios a bloquear para adaptarlo a nuestra configuración. Para adaptarlo ejecutamos lo siguiente:

sed -i 's/null.zone.file/\/etc\/bind\/blackhole/' /tmp/ad-blacklist

El comando anterior sustituye el nombre del archivo de zona por la ruta completa al archivo de zona que creamos anteriormente.

Copiamos el archivo con el listado ya modificado a /etc/bind. Para hacer esto ejecutamos lo siguiente:

mv -f /tmp/ad-blacklist /etc/bind/ad-blacklist

Ahora tenemos que indicar a bind que use nuestra zona blackhole. Editamos el archivo /etc/bind/named.conf.local e incluimos la siguiente línea:

include "/etc/bind/ad-blacklist";

Por último ya solo faltaría recargar las zonas(rndc reload) y comprobar que esta funcionando correctamente. Para comprobar esto podemos intentar resolver cualquiera de los dominios del listado, por ejemplo de la siguiente forma:

root@host:~/probas# dig +short zv1.november-lax.com @localhost
127.0.0.1

Si la ip que nos devuelve es la 127.0.0.1 quiere decir que todo esta correcto.

Ahora para que los clientes de la red usen nuestro dns tuneado, tendríamos que usar dhcp o configurarlo manualmente en cada dispositivo. Eso ya queda en vuestras manos.

Por ultimo, para mantener actualizado el listado de dominios a bloquear, podemos meter los comando anteriores en una tarea cron que lo automatice. Para esto creamos el archivo /etc/cron.d/bind-blackhole-ads con el siguiente contenido:

13 6 * * * root curl -f 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=bindconfig&showintro=0&mimetype=plaintext' -o /tmp/ad-blacklist; sed -i 's/null.zone.file/\/etc\/bind\/blackhole/' /tmp/ad-blacklist; mv -f /tmp/ad-blacklist /etc/bind/ad-blacklist; /usr/sbin/rndc reload

El comando anterior se ejecuta todos los dias a las 06:13, y se encarga de actualizar el listado de dominios y recargar la configuración en bind.

Un saludo.

Artículo cortesía de Romám

7 comentarios :

  1. Si no me equivoco así es como funciona Pi-Hole. Me gusta bastante ese sistema.
    Para evitar el Spam yo uso Privoxy en un equipo conectado por LAN al router, y la RPi3 la tengo funcionando con FruityWifi.

    ResponderEliminar
  2. Hola que tal, muy interesante el articulo, estoy tratando de aplicarlo en mi raspbery que actualmente uso como media center.
    Primero, creo que en tu explicación hay un error ya que creando el archivo de zona usas como nombre para el archivo "backhole", mientras que en el remplazo que realizas en el blacklist y en el include del named.conf.local le colocas "blackhole" (opte por dejarlo blackhole)
    Segundo, no he podido completar el tuto ya que cuando creo la zona en el archivo "/etc/bind/blackhole" reinicio el servicio bind9 con "sudo service bind9 restart" y no inicia mostrando el siguiente error:
    "/etc/bind/blackhole:1: unknown option '$TTL'"
    Me puedes ayudar? te agradezco mucho.

    ResponderEliminar
    Respuestas
    1. Puede que sea que te faltan los puntos finales de los servidores.
      En /etc/bind/blackhole tenemos que añadir un "." al final de los servidores declarados. Dejándolo así:
      $TTL 86400 ; one day
      @ IN SOA ads.blackhole.org. hostmaster.blackhole.org. (
      2014090101
      28800
      7200
      864000
      86400 )
      NS ns.blackhole.org.
      A 127.0.0.1.
      @ IN A 127.0.0.1.
      * IN A 127.0.0.1.

      Espero que con ésto se solucione. Por favor, cuéntanos qué tal te fue.

      Eliminar
    2. son archivos distintos
      blacklist es el listado de dominios a bloquear
      blackhole es el archivo de zona que carga el listado de dominios

      Eliminar
    3. gran post
      funciona perfecto

      Eliminar
  3. Buen articulo, lo acabo de probar y funciona sin problemas en Ubuntu.

    Dejo otra URL de blackist de dominios, ordenadas por categoria si quiere proteger todavía mas la red domestica de tu hogar o que a los mas pequeños pueda acceder a contenido no deseable.

    http://dsi.ut-capitole.fr/blacklists/index_en.php

    ResponderEliminar
  4. Interesante artículo, sobre todo si quieres aprovechar el dns que ya tienes configurado. Existe un proyecto (https://pi-hole.net/) que se basa en lo mismo, y no tiene complicaciones de instalación, además de que utiliza varias listas, quizás podrías "mirar cuales son para un amigo" e incluirlas. :)

    ResponderEliminar