Bloqueando publicidad desde el archivo hosts

block-adsNada nuevo realmente, pero no me había dado por usarlo hasta hace un par de días.

Cuando piensas en bloquear publicidad normalmente piensas en el navegador, y al pensar en el navegador piensas en extensiones. De hecho hay algunas muy conocidas como adblock que funcionan bien.

Usar extensiones tiene sus ventajas, como por ejemplo el que te olvides de gestionar las actualizaciones de la lista de bloqueos o que además la extensión se encargue de eliminar el contenedor de la publicidad en la página de forma que no queden huecos vacíos donde ésta debería estar.

También tiene sus inconvenientes: sólo bloquea publicidad en el navegador en el que está instalada y además ralentiza ligeramente la navegación.

Una opción alternativa es usar nuestro archivo de resolución de nombres para hacer el bloqueo.

Si no hemos cambiado manualmente el orden de resolución de nombres lo normal por defecto es que cuando se necesite hacer una resolución (por ejemplo al navegar por una página web) el orden por el que se intenta resolver la IP correspondiente a ese nombre sea el siguiente:

  1. Lista de nombres local (archivo /etc/hosts)
  2. Query al servidor DNS configurado

A no ser que tengamos nuestro propio servidor DNS que nosotros podamos controlar (cosa que el 99,9% de la gente no tiene) la query al DNS siempre nos debería devolver la IP correcta, pero gracias al orden citado anteriormente podemos crear una entrada falsa en nuestro archivo local para que la resolución nos devuelva una IP incorrecta.

¿Por qué queremos hacer esto?

Cuando cargamos una página web con publicidad en primer lugar se realiza la resolución del nombre de la web a la que estamos navegando. Por ejemplo al ir a www.20minutos.es estaremos preguntando al DNS cuál es la dirección real de dicha página, y éste nos responde que la dirección es 193.148.34.26.

Todo esto es transparente para nosotros, en nuestro navegador seguiremos viendo www.20minutos.es, pero sin esa conversión de nombre a dirección IP sería imposible para nuestro navegador el mostrar la página.

Ahora bien, dentro de esa página tenemos publicidad que está alojada en otros servidores que no son el de 20minutos. Mientras se carga la página nuestro navegador ve en el código fuente de la web que necesita cargar contenido de otras direcciones, así que de nuevo pregunta al DNS cuál es la dirección correspondiente al nombre que aparece en la web para poder cargar esa publicidad y mostrarla.

¿Qué pasaría si en nuestro archivo /etc/hosts pusiéramos una dirección falsa para los servidores de publicidad? Pues que podríamos ver la web pero la publicidad no se cargaría, ya en la dirección falsa no existe el contenido que se pretende mostrar.

Además ganamos velocidad al navegar ya que por una parte nos ahorramos una o varias llamadas al servidor DNS, nos ahorramos el tiempo de conexión a los servidores de publicidad y por supuesto nos ahorramos el tiempo de carga del contenido de dicha publicidad.

Hasta aquí todo perfecto, el problema es que la lista de distintos servidores de publicidad que tendríamos que añadir al /etc/hosts es enorme, e intentar confeccionar dicha lista a mano sería una tarea monumental. Por suerte hay listas ya creadas que podemos usar, como por ejemplo ésta:

http://winhelp2002.mvps.org/hosts.txt

Haremos una copia de nuestro archivo de hosts actual (por si acaso):

sudo cp /etc/hosts /etc/hosts.original

Descargamos la lista:

wget http://winhelp2002.mvps.org/hosts.txt -O $HOME/hosts.txt

El archivo viene en formato Windows, lo que significa que desde Linux los retornos de línea aparecen como un carácter ^M que harían que el formato del archivo fuese incorrecto, así que lo corregimos:

sed s/^M//g $HOME/host.txt > $HOME/hostslinux.txt
Cuando escribas esa línea, la parte de “^M” no es un ^ seguido de una M, es un carácter especial. Para escribirlo pulsa ctrl+v y luego ctrl+m. Si lo escribes como caracteres separados no funcionará.

Finalmente reemplazamos el archivo hosts por la lista que hemos descargado:

sudo cp $HOME/hostslinux.txt /etc/hosts

Y ya está. Abre el navegador y comprueba la diferencia al navegar por webs con publicidad.

La lista del enlace que he puesto arriba se actualiza periódicamente, añadiendo nuevos hosts. Podría parecer una buena idea crear un script que automatice la descarga de esta lista reemplazando nuestro archivo de hosts, pero no sólo no me parece buena idea si no que realmente aconsejo no hacerlo… al menos no sin incluir en dicho script algunas validaciones del contenido de lo que estamos descargando.

A día de la publicación de este artículo la lista contiene hosts conocidos de publicidad para los que reemplaza la IP por 0.0.0.0, que es lo que nos interesa, pero no puedo garantizar que en un futuro esa lista no se vea comprometida y se puedan añadir entradas maliciosas que por ejemplo apunten la dirección web de tu banco a una IP real controlada por un atacante.

Este método de bloqueo de publicidad (e incluso de direcciones maliciosas en general) puede ser como digo muy útil y con bastantes ventajas, pero el archivo /etc/hosts es un punto crítico de la seguridad de vuestro ordenador, así que vigilad qué es lo que metéis ahí.

  • Manolo

    Sólo aportar que como tengo mac, de entrada no está wget, pero si haces curl -O en vez de wget, ya lo tienes

  • GMR

    Hola, comentar que esta línea (sed s/^M//g $HOME/host.txt > $HOME/hostslinux.txt) está mal escrita le falta una ese a la palabra host > hostS, sería sed s/^M//g $HOME/hosts.txt > $HOME/hostslinux.txt
    Un saludo y gracias por la información