Pi-Hole

Esta nueva entrada del blog es relativa al grupo de publicaciones que pretenden demostrar que una Raspberry Pi se puede utilizar como una herramienta de seguridad. En ella se va a crear un servidor DNS capaz de realizar el filtrado de direcciones Web, con el objetivo de no descargar anuncios, pop-ups o Webs potencialmente peligrosas.

Antes de entrar en materia, se va a explicar cómo funciona un servidor DNS pero únicamente la parte del cliente, ya que este proyecto no requiere conocer cómo el servidor de DNS consigue resolver cada una de las peticiones que recibe. En el siguiente esquema se puede ver qué ocurre cuando un usuario solicita ver la Web de Google o de Facebook. El ordenador, Smartphone o Tablet deberá preguntar al servidor DNS la IP de Google o Facebook, porque es la única forma que tiene cada cliente de acceder a estos servidores, ya que únicamente con el nombre Google.com o Facebook.com no conseguiría acceder. Seguidamente, tras obtener la IP de la página solicitada por el usuario, se podrá solicitar la petición al servidor concreto.

Esquema Básico DNS

Además, cada proveedor de servicio (Telefónica, Vodafone, Orange, etc.) tiene sus propios servidores de DNS (normalmente se configuran 2: uno principal y otro secundario por si falla el principal). Por otra parte, existen algunos otros servidores DNS públicos en Internet. En la siguiente tabla se muestran algunos de ellos:

Empresa IP Servidor DNS primario IP Servidor DNS secundario
Google 8.8.8.8 8.8.4.4
OpenDNS 208.67.222.222 208.67.220.220
Norton ConnectSafe 198.153.192.40 198.153.194.40
Comodo Secure DNS 8.26.56.26 156.154.70.22
OpenNIC 202.83.95.227 216.87.84.211
Level 3 Communications 4.2.2.1 4.2.2.2
Dyn Internet Guide 216.146.35.35 216.146.36.36
Verisign 64.6.64.6 64.6.65.6
Telefónica 80.58.61.250 80.58.61.254
Jazztel 87.216.1.65 87.216.1.66
Orange 62.36.225.150 62.37.228.20

Cada interfaz de red existente en un Smartphone, ordenador o Tablet debe tener definido, al menos, un servidor DNS primario y opcionalmente también un servidor secundario para que si el servidor DNS principal está caído se puedan seguir resolviendo las peticiones DNS. Esta tarea no suele ser necesario que se configure manualmente, ya que el protocolo DHCP es el encargado de asignar una IP, máscara, puerta de enlace y servidores DNS primario y secundario.

El servidor DHCP suele estar configurado en el router que nos da acceso a Internet (en muchas ocasiones proporcionado por un proveedor de servicio). Normalmente la configuración del DNS primario y secundario en el router se puede cambiar, pero puede pasar que ocurra lo contrario en algunos routers proporcionados por los proveedores de servicio (ISPs) y éste fue una de las razones que motivó el artículo publicado en este mismo blog:

Sustituir router SOHO por Raspberry Pi con OpenWRT

Por otra parte, también es importante que quede claro el objetivo de éste servidor DNS, el cual se utilizará para realizar el filtrado de direcciones Web que pueden contener malware, publicidad, etc. Al ser un servidor nuestro puede ser modificado por nosotros añadiendo o eliminando dominios y direcciones Web para impedir al usuario que accedan a esos dominios. En la siguiente imagen se muestra cómo se realiza el filtrado de dominios y direcciones Web fraudulentas o con publicidad:

Esquema Basico DNS con filtrado

Existen dos ficheros importantes whitelist.txt y blacklist.txt, los cuales contendrán respectivamente direcciones web de las que sí queremos ver la publicidad y direcciones web que no queremos visitar. Estos dos ficheros, junto a otras web de Internet que el proyecto Pi-Hole añade de forma automática, serán utilizados para crear los ficheros *.list (por ejemplo, gravity.list) que básicamente contienen la IP del servidor DNS, es decir, de la Pi-Hole más la URL del dominio que se desea filtrar.

Por tanto, cuando un usuario realiza una consulta de una URL que NO está contenida en ninguno de los ficheros *.list a nuestro servidor DNS, éste a su vez resolverá la consulta y devolverá al usuario la IP del servidor, por ejemplo, el caso de Google.com en la imagen anterior. Por otra parte, cuando un usuario realiza una petición de una URL que sí está contenida en alguno de los ficheros *.list a nuestro servidor DNS (por ejemplo, dominioMalware1.com en el ejemplo anterior), éste devolverá la IP de sí mismo. Seguidamente, el cliente (Smartphone, ordenador o Tablet) solicitará la página utilizando la IP del servidor DNS y recibirá a su vez una página en blanco. Y efectivamente, se habrá realizado el filtrado de la URL fraudulenta o con publicidad.

Además, es importante que quede claro que el filtrado se realiza a través del servidor DNS y por tanto, si el cliente (por ejemplo, el navegador Web) utiliza directamente la IP de la página que quiere consultar, no será necesario realizar la petición al servidor DNS y por tanto, no se producirá el filtrado aunque la página sea fraudulenta.

Para finalizar esta parte y antes de comenzar a describir los pasos de la instalación, se explicará la casuística normal de filtrado:

  1. El usuario realiza la petición de una página legítima, la cual contiene muchos enlaces a otras URLs (imágenes, ficheros CSS, ficheros JavaScript, otras páginas Web embebidas en frames, etc.)
  2. El cliente utilizado (navegador Web) revisa y obtiene los enlaces encontrados en la Web anterior y realiza una consulta al servidor DNS por cada enlace.
  3. El servidor DNS consulta si conoce la IP de la URL preguntada por el cliente o la tiene que resolver a través de otro servidor DNS de Internet.
  4. Para las URL que se desean filtrar el servidor DNS devolverá la IP de la Pi-Hole, que también tendrá levantado un servidor Web con una página Web en blanco.
  5. El cliente recibirá la IP del servidor Web y realizará la consulta o al servidor Web de Internet o al servidor iniciado en la Pi-Hole, el cual siempre devolverá una página en blanco. Por tanto, si lo que se filtra es un anuncio o un frame fraudulento embebido en una Web principal, lo que se verá es el hueco del anuncio o frame filtrado.

Los pasos necesarios para realizar la instalación del proyecto Pi-Hole en una Raspberry Pi (en este caso se ha utilizado un Raspberry Pi 3 pero los pasos en una Raspberry Pi 2 serían los mismos) son los siguientes:

  1. El primer paso es cargar el sistema operativo raspbian en una tarjeta micro SD (en nuestro caso hemos utilizado una tarjeta de 16GB), para ello podéis utilizar la siguiente publicación de éste mismo blog:

    Raspberry como herramienta de seguridad

    Por otra parte, el sistema operativo raspbian lo podéis descargar de la página oficial de raspberry (con la versión LITE será suficiente):

    https://www.raspberrypi.org/downloads/raspbian/

  2. En este punto, se deberá insertar la tarjeta micro SD en el interior de la raspberry, y tras conectarla asegurarnos que tenemos un cable de red conectado hacia el router y que por tanto, la raspberry tiene Internet. Además, será necesario conectar un cable HDMI a un monitor y el cable de alimentación de la raspberry.

  3. Tras arrancar la Raspberry Pi 3 deberemos logarnos en el sistema con las contraseñas por defecto de raspbian:

    • usuario: pi
    • contraseña: raspberry
  4. En este momento, ya estaremos logados dentro del sistema operativo raspbian. Es importante tener en cuenta que el idioma del teclado es inglés, por tanto, en este punto tenemos 2 opciones: cambiar el teclado a español con el comando sudo dpkg-reconfigure keyboard-configuration y reiniciar para que se apliquen los cambios, o habilitar el acceso por SSH mediante el comando /etc/init.d/ssh start.

  5. Seguidamente, será necesario actualizar nuestro sistema operativo utilizando los siguientes comandos, de igual forma que se especifica en la página oficial de raspberry:

    https://www.raspberrypi.org/documentation/raspbian/updating.md

    • apt-get update
      Pi-Hole_update
    • apt-get dist-upgrade
      Pi-Hole_dist_upgrade
  6. Se deberá cambiar el password con el comando passwd, porque es un problema de seguridad dejar el password por defecto del sistema operativo instalado. Además, es necesario tener cuidado con los caracteres especiales porque el teclado es inglés.

    Pi-Hole_passwd

  7. Seguidamente, se deberá ejecutar el siguiente comando, y comenzará la instalación:

    curl -sSL https://install.pi-hole.net | bash

    Pi-Hole_comando_instalacion

  8. Primero, el programa obtiene todos los paquetes necesarios para realizar la instalación:

    Pi-Hole_progreso_instalacion

  9. En este punto la instalación informa al usuario que la aplicación transformará nuestra Raspberry en un bloqueador de anuncios y páginas Web potencialmente peligrosas:

    Pi-Hole_mensaje_instalacion

  10. Además, indica una dirección para realizar donaciones, ya que éste es un proyecto con licencia GNU y es la forma que han considerado mejor para el mantenimiento del proyecto. Desde este blog, apoyamos a todos los proyectos con este tipo de licencias:

    Pi-Hole_mensaje_instalacion_donacion

  11. En este momento, nos indica que se asignará una IP fija para que no cambie y el servidor DNS siempre tenga configurada la misma dirección IP:

    Pi-Hole_mensaje_instalacion_IP_estatica

  12. Seguidamente, nos pide que seleccionemos un servidor DNS de Internet que es el que utilizará nuestro servidor DNS para resolver las consultas que no tenga en caché y que no deban ser filtradas. En nuestro caso, hemos seleccionado el de Google, ya que en varios test aparecen como la opción más rápida. Y si atendemos a los términos legales, todos ellos almacenan ciertos datos, entre ellos la dirección IP origen y cuál fue la consulta realizada.

    Pi-Hole_mensaje_instalacion_IP_estatica

  13. Seguidamente, se deberá seleccionar el tipo de tráfico IP que se desea bloquear. En nuestro caso tanto el tráfico IPv4 como el tráfico IPv6, aunque el tráfico más habitual será el tráfico IPv4:

    Pi-Hole_mensaje_instalacion_seleccion_trafico_bloqueado

  14. Posteriormente, la instalación informa que la dirección IP se establecerá como IP estática para que la dirección del servidor DNS no cambie:

    Pi-Hole_mensaje_instalacion_confirmar_IP_estatica

  15. Entonces, la instalación advierte que es posible que el router asigne esta IP a otro dispositivo y haya conflicto. En el caso de que haya problemas, se deberá realizar la asignación de IPs manualmente:

    Pi-Hole_mensaje_instalacion_aviso_IP_estatica

  16. A continuación, la instalación pregunta si se deseas almacenar en un log las peticiones al servidor Web, lo que puede venir bien para comprobar qué peticiones se han realizado en el caso de que haya alguna URL que no está filtrada y lo debería estar o al revés.

    Pi-Hole_mensaje_instalacion_habilitar_logs

  17. En este momento, se instalarán los últimos paquetes necesarios:

    Pi-Hole_instalando_paquetes

  18. Tras finalizar la instalación, aparece un mensaje donde se resumen todas las opciones configuradas durante la instalación:

    Pi-Hole_configuracion_final

    Es importante la IP estática que ha asignado, porque deberá ser esa IP la que configuremos como IP del Servidor DNS primario en nuestro router, que es la opción más fácil de trabajar. Porque aunque también funcionaría correctamente configurar el DNS primario cliente por cliente, es muy tedioso y cada vez que se obtiene la IP mediante DHCP nos volverá a configurar el DNS primario proporcionado por el servidor DHCP (router). Además, se muestra la dirección donde se almacenarán los ficheros de log (/etc/pihole), y las direcciones Web para administrar la Pi-Hole, es decir, añadir direcciones a la blacklist o a la whitelist, o ver las estadísticas del número de direcciones bloqueadas. Por último, aparece la contraseña de la página de administración de la Pi-Hole.

  19. Además, muestra cómo cambiar la contraseña de la página de administración de la Pi-Hole:

    Pi-Hole_configuracion_final

Web de administración

En la siguiente imagen se puede ver la web de administración de la Pi-Hole. Existe una parte donde no es necesario introducir la contraseña anterior y por tanto es accesible a todos los usuarios conectados a la red local, pero sólo muestra las estadísticas. Para realizar modificaciones y añadir direcciones que se desean filtrar o por el contrario direcciones que nunca habría que filtrar, siempre deberemos estar logados con la contraseña vista previamente.

Pi-Hole_admin_web

Ejemplos de filtrados

Por último, vamos a ver dos ejemplos de filtrado de direcciones donde el lector podrá comprobar que realmente este proyecto funciona correctamente.

El primer ejemplo es la consulta a un periódico deportivo de tirada nacional. Como se puede ver en la imagen de la izquierda no se ha producido el filtrado (aparece la publicidad marcada en amarillo) y en la imagen de la izquierda no aparecen los anuncios de publicidad:

Pi-Hole_Web_Marca

En el segundo ejemplo, hemos utilizado una aplicación de móvil para salir a hacer deporte.

Pi-Hole_App_Endomondo