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

Mostrando entradas con la etiqueta publicidad. Mostrar todas las entradas
Mostrando entradas con la etiqueta publicidad. Mostrar todas las entradas

miércoles, 27 de mayo de 2020

Filtrando publicidad con powerdns (II)

Ya vimos como configurar nuestro powerdns para bloquear la publicidad en nuestra red. Ha estado funcionando un par de semanas sin problemas antes del caos de la COVID-19.

Lo que hicimos entonces fue coger el fichero gravity.list de nuestra Raspberry Pi y su pi-hole, convertirlo al formato .lua y meterlo en nuestro powerdns.

Dejamos pendientes dos cosas:

  • Probar listas de bloqueo mas grandes: he probado con varias mas descargadas de Internet y no se nota una mejora apreciable. Además muchas no son de publicidad, sino de otro tipo de contenidos inadecuados que en nuestro caso filtra el firewall corporativo. La istas que trae pi-hole son más que suficientes.
  • No depender del gravity.list de pi-hole. Escribir un script que baje las listas referenciadas en adlists.list y construir un blocklist.lua de forma automática. Eso es lo que he hecho y cuento en este artículo.

El script sería:
# cat /usr/local/bin/blacklist-powerdns.sh 
#!/bin/bash

#Crea fichero de bloqueos de publicidad y sitios web para powerdns.

#Descargamos listados de sitios web de publicidad a bloquear.
cp /dev/null /tmp/filter-hosts

wget -N -O /tmp/hosts  https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
grep "^0.0.0.0" /tmp/hosts |  awk '{print $2}' >> /tmp/filter-hosts
echo "" >> /tmp/filter-hosts

wget -N -O /tmp/hosts http://sysctl.org/cameleon/hosts
grep "^127.0.0.1" /tmp/hosts | awk '{print $2}' >> /tmp/filter-hosts
echo "" >> /tmp/filter-hosts

wget -N -O /tmp/hosts https://mirror1.malwaredomains.com/files/justdomains
cat /tmp/hosts >> /tmp/filter-hosts
echo "" >> /tmp/filter-hosts

wget -N -O /tmp/hosts https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
cat /tmp/hosts >> /tmp/filter-hosts
echo "" >> /tmp/filter-hosts

wget -N -O /tmp/hosts https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
cat /tmp/hosts >> /tmp/filter-hosts
echo "" >> /tmp/filter-hosts

#Este enlace está muerto
#wget -N -O /tmp/hosts https://hosts-file.net/ad_servers.txt
#cat /tmp/hosts >> /tmp/filter-hosts

#Añadimos lista negra de dominios mantenida por nosotros
if [ -f /etc/powerdns/bloqueados.list ]
then
  cat /etc/powerdns/bloqueados.list >> /tmp/filter-hosts
  echo "" >> /tmp/filter-hosts
fi

#Ordenamos y quitamos dominios repetidos. Borramos comentarios.
cp /tmp/filter-hosts /tmp/filter-hosts2
sort -u -o /tmp/filter-hosts /tmp/filter-hosts
sed -i '/^localhost$/d' /tmp/filter-hosts
sed -i '/^#/d' /tmp/filter-hosts

#Generamos el fichero blocklist.lua compatible con powerdns
echo "return {" > /tmp/blocklist.lua
for i in $(cat /tmp/filter-hosts)
do
   echo \"$i\", >> /tmp/blocklist.lua
done
echo "}" >> /tmp/blocklist.lua

#Copiamos fichero de bloqueo DNS y reiniciamos servicio.
/etc/init.d/pdns-recursor stop
/etc/init.d/pdns stop
cp -f /etc/powerdns/blocklist.lua /etc/powerdns/blocklist.lua.bak
cp -f /tmp/blocklist.lua /etc/powerdns/blocklist.lua
/etc/init.d/pdns start
/etc/init.d/pdns-recursor start

exit 0
Este script descarga listas de DNS de las mismas fuentes que pi-hole. Realmente la única importante es https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts, que se actualiza con mucha frecuencia. El resto son anecdóticas.

Además, añade al bloqueo los dominios del fichero local /etc/powerdns/bloqueados.list, por si queremos bloquear dominios a mano (por ejemplo, instagram o whatsapp) en la red del centro.

Con todo ello hace una lista de bloqueos, que unifica y ordena para pasar a generar un /etc/powerdns/blocklist.lua.

Este script se ejecuta semanalmente en la madrugada del domingo mediante un crontab:
# cat /etc/crontab
...
...
#Actualiza la lista de bloqueos de publicidad y otros dominios para powerdns
#Por defecto se hace los domingos de madrugada
00 2 * * 7    root     /usr/local/bin/blacklist-powerdns.sh
...
...
Y ya está. Con esto tendremos la lista de bloqueos actualizada semanalmente.

Hoy, 27 de mayo de 2020, SpaceX lanza la Crew Dragon en un Falcon 9 con dos astronautas norteamericanos rumbo a la ISS. Aquí una animación de lo que debe pasar hoy a las 22.33.



Si todo va bien tendremos un competidor nuevo para las estupendas Soyuz. A ver si hay suerte y puedo añadir un vídeo real después de este texto.
Actualización 28-05-2020: nada, el tiempo no acompañó en Florida. Se intentará de nuevo el sábado 30.
Actualización 31-05-2020: lo hicimos!


Viendo el lanzamiento en directo desde casa:


El booster aterrizado de forma autónoma y segura en la barcaza "Of Course I Still Love You", listo para ser reutilizado en un futuro próximo en otro lanzamiento.


Es estupendo que al menos un país occidental pueda de nuevo mandar astronautas al espacio sin necesitar de tecnología comunista. ¡Bravo, Elon!

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.