Page cover

DNS y bloqueador de anuncios con Pi-hole

Pi-hole es un servidor DNS que bloquea publicidad y rastreadores a nivel de red.

Funciona interceptando las peticiones DNS de los dispositivos conectados y bloqueando dominios conocidos de publicidad antes de que carguen. Se instala normalmente en un servidor local (como una Raspberry Pi o máquina virtual) y protege toda la red sin necesidad de instalar extensiones en cada equipo.

En nuestro caso planteamos el siguiente escenario para su funcionamiento:

Escenario actual

Debemos primero plantear el escenario de máquinas virtuales con el que nos encontramos:

Máquina
Adaptadores de red
IP
Función

Ubuntu Server (Pi-hole)

1. Adaptador puente 2. Red interna “LAB”

1. IP LAN real 2. 10.0.0.5

DNS y puerta de enlace interna

Ubuntu Desktop (Cliente)

1. Red interna “LAB”

10.0.0.x

Cliente

👉 El problema es que la máquina cliente no tiene acceso a Internet, ya que solo está en la red interna y no hay NAT configurado. Para ello, la solución general va a pasar por configurar el Pi-hole como gateway y NAT. Básicamente:

  1. El cliente usa el Pi-hole como DNS y puerta de enlace.

  2. El servidor hace NAT hacia el adaptador puente.

Esto se hace con unas pocas configuraciones en el servidor:


1. Asignar IP estática al adaptador interno (Pi-hole)

Edita /etc/netplan/01-netcfg.yaml (o el archivo correspondiente a tu versión de Ubuntu Server):

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:   # Adaptador puente
      dhcp4: true
    enp0s8:   # Adaptador interno
      addresses:
        - 10.0.0.5/24

Luego:

sudo netplan apply

2. Habilitar el reenvío de paquetes IP en el servidor y configurar NAT con iptables

Edita /etc/sysctl.conf con nano y descomenta o agrega:

net.ipv4.ip_forward=1

Aplica los cambios:

sudo sysctl -p

Ahora vamos a configurar el servicio NAT para permitir la entrada de datos de Internet a través de la segunda interfaz. Para ello, si tu adaptador puente es enp0s3 y el interno enp0s8 escribe lo siguiente:

# Permitir forwarding desde la red interna a la externa
sudo iptables -A FORWARD -i enp0s8 -o enp0s3 -j ACCEPT
sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Hacer NAT (enmascaramiento)
sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

Para hacerlo persistente tras reinicio, puedes instalar iptables-persistent:

sudo apt install iptables-persistent
sudo netfilter-persistent save

3. Configurar Pi-hole para escuchar en la red interna

Durante o después de la instalación de Pi-hole, asegúrate que:

  • Escuche en la IP 10.0.0.5.

  • Resuelva DNS usando, por ejemplo, 1.1.1.1 o 8.8.8.8 como upstream.

  • Permita solicitudes de toda la red interna.

4. Instalar pihole

Primero empezaremos por actualizar el sistema como buena práctica:

sudo apt update && sudo apt upgrade -y

También nos aseguraremos que esté instalado curl

curl --help

y, si no lo tienes, lo instalas con:

sudo apt install curl -y

Ahora, ejecuta el instalador oficial de Pi-hole:

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

Sigue ahora el asistente interactivo:

  • Elegir interfaz de red con IP estática, en nuestro caso enp0s8 (red interna).

  • Elegir activar DHCP.

  • Seleccionar DNS upstream (Google, Cloudflare, etc.).

Al final te mostrará la contraseña de acceso a la interfaz web y como acceder:

  • Desde un navegador de tu máquina host (Windows): http://<IP-del-servidor>/admin:80

Si ya lo instalaste previamente (por el motivo que sea) puedes "reconfigurarlo" con:

pihole -r

y seleccionas reconfigure.

5. Probar conectividad y Uso

Desde la interfaz de pi-hole, accede a la opción de DHCP y configúrala tal que así:

Ahora para probar si ha funcionado todo, desde el cliente probamos:

ping 10.0.0.5            # al Pi-hole
ping 8.8.8.8             # a internet por IP
ping google.com          # debe resolver por DNS del Pi-hole

En el servidor:

sudo tail -f /var/log/pihole.log

Deberías ver las consultas DNS pasando por Pi-hole, si hacemos una prueba entrando a una web con anuncios veremos la diferencia:

A la izquierda, sin pi-hole, a la derecha, con pi-hole

Prueba ahora a acceder a la interfaz de pihole y entra a alguna página potencialmente maliciosa (Por ejemplo, www.annualconsumersurvey.com), verás que no te deja acceder y ahora las queries bloqueadas en pihole:

Si pruebas con youtube, te darás cuenta que pi-hole no funciona, ¿Por qué?

La respuesta es muy sencilla, Pi-hole solo trabaja a nivel de DNS (dominios), no puede distinguir si esa IP sirve un anuncio o el video en sí. Si bloqueas ese dominio, también bloqueas el video 😅. Además, los anuncios se insertan dinámicamente en la misma conexión HTTPS y YouTube cambia constantemente los endpoints de anuncios por lo que aunque instales algunas blacklist concretas, youtube las romperá en cuestión de dias.

Que listos son estos de youtube! Pero recuerda que siempre puedes usar adblocker 😉

Puedes tratar ahora tú de configurar un dominio excluido, es una buena forma de establecer un "control parental" o filtrar en tu empresa o domicilio.

Última actualización