"Después del juego es antes del juego"
Sepp Herberger

domingo, 23 de febrero de 2020

Filtrando publicidad con powerdns (I)

Ya sabemos que la publicidad es necesaria para que se mantengan muchas páginas, lo que no me parece tolerable son los mensajes invasivos que hacen saltar banners, corta el flujo de texto con anuncios en medio o sobrecarga el navegador de forma excesiva haciendo lenta la navegación. Y esto empeora con los anticuados equipos que tenemos en muchos centros.

La solución habitual es usar un plugin de bloqueo de publicidad, como uBlock o Adblock, pero el resultado es que finalmente acaban sobrecargando también el navegador y, adicionalmente, muchos sitios detectan dichos plugins y te obligan a desactivarlos.

Hace unas semanas que llevo probando en mi Raspberry Pi de casa el proyecto pi-hole. Lo que hace, literalmente: "es una aplicación para bloqueo de anuncios y rastreadores en Internet a nivel de red en Linux que actúa como un sumidero de DNS​ (y opcionalmente como un servidor DHCP), destinado para su uso en una red privada". Básicamente monta un servidor dnsmasq que tiene una lista negra de dominios que no resuelve y, por tanto, bloquea. En nuestra red privada ponemos como servidor DNS primario la dirección de la Rasperry Pi donde está corriendo pi-hole y la mayoría de la publicidad desaparece de nuestros ojos de forma automática. Funciona de maravilla. Corta casi todo en PC, tablets, móviles, incluso en la Smart TV (si tuviera Smart TV).

En su momento pensé: ¿y si lo pruebo en la red del centro?. Pero no, es demasiado complicado: pi-hole está basado en dnsmasq y en los centros usamos powerdns. No tenía tiempo de meterme en esa camisa de once varas.

Pero hace unos días nos comunicaron que se había activado un sistema de bloqueo de sitios basado en powerdns-recursor, para filtrar a nivel de centro algunas páginas (juegos, redes sociales, etc) que nos pidiesen de forma interna. Simplemente hay editar /etc/powerdns/blocklist.lua, añadir en el array los dominios o subdominios que queramos filtrar y hacer un "systemctl restart pdns-recursor.service". Por ejemplo:
# cat /etc/powerdns/blocklist.lua
return{
"web.whatsapp.com",
"facebook.com",
}
Bueno, digo yo: ¿y si cojo la lista de bloqueo de pi-hole y la meto en blocklist.lua que pasaría?

Primero tuve que investigar como construye pi-hole su lista. Básicamente descarga ficheros de blacklist de una serie de sitios web actualizados con frecuencia:
root@DietPi:# cat /etc/pihole/adlists.list
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://mirror1.malwaredomains.com/files/justdomains
http://sysctl.org/cameleon/hosts
https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
https://hosts-file.net/ad_servers.txt
De todas estas fuentes se construye dominicalmente un fichero /etc/pihole/gravity.list con un listado de nombres DNS de sitios bloqueados.
# cat /etc/cron.d/pihole
...
# Pi-hole: Update the ad sources once a week on Sunday at a random time in the
#          early morning. Download any updates from the adlists
#          Squash output to log, then splat the log to stdout on error to allow for
#          standard crontab job error handling.
27 4   * * 7   root    PATH="$PATH:/usr/local/bin/" pihole updateGravity >/var/log/pihole_updateGravity.log || cat /var/log/pihole_updateGravity.log
...
Este crontab acaba finalmente llamando al script: /opt/pihole/gravity.sh, que construye gravity.sh desde /etc/pihole/gravity.list.

Lo único que tenía que hacer es coger este gravity.list y construir a partir de él un blocklist.lua. Este código lo hace:
# echo "return {" > blocklist.lua
# for i in $(cat gravity.list)
do
echo \"$i\", >> blocklist.lua
done
# echo "}" >> blocklist.lua
Nos queda algo así como:
# cat /etc/powerdns/blocklist.lua
return {
  "0.0.0.0",
  "0.nextyourcontent.com",
  "0.r.msn.com",
  "0.start.bz",
  "000.gaysexe.free.fr",
  "0000mps.webpreview.dsl.net",
  "0001.2waky.com",
  "000dom.revenuedirect.com",
  "000free.us",
  ....
El tamaño del fichero resultante es:
# wc -l /etc/powerdns/blocklist.lua     
125144 /etc/powerdns/blocklist.lua
125.000 dominios, ¡guau!. Un poco temeroso reinicio el powerdns-recursor, que arranca de forma inmediata y sin problemas. Después me voy a mi pc a cargar una página saturada de publicidad. Aparece limpia y despejada.

A modo de prueba lo he dejo varios días a ver si se nota ralentización o quejas de los usuarios. Pasado este tiempo puedo afirmar que no hay ningún problema: esto va de maravilla. Lo dejo instalado.

Me asigno como tareas pendientes 2 cosas:
  • Probar listas mas grandes, las hay de millones de dominios, simplemente para tantear los límites del sistema.
  • No depender del gravity.list de pi-hole. Escribir un script que baje cada día las listas enumeradas en adlists.list y construir un blocklist.lua.

Out!


Elon Musk sigue lanzando mediante SpaceX mas satélites de Starlink. Es mes pasado lanzó otros 60 con un Falcon 9, seguramente reutilizado. Una foto del impresionante pack de satélites antes del lanzamiento:


La semana pasada hicieron otro lanzamiento de mas satélites, con lo que ya suman 5 conjuntos que superan los 300 artefactos en órbita.

Como no han dicho nada en los informativos, seguramente aterrizó con normalidad. Es increíble como Musk ha hecho rutinario el lanzamiento y aterrizaje de cohetes. No tenemos coches voladores, pero tenemos cohetes que van y vuelven sin partes desechables.

De momento no voy a entrar en el debate sobre la contaminación lumínica que producirán la constelaciones de satélites, aunque los astrónomos están bastante preocupados (y enfadados) con el tema. Ahora solo me importa que me pille en el pueblo una noche despejada el paso de un tren de satélites tras un lanzamiento.

No hay comentarios:

Publicar un comentario