# 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):

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

Luego:

```bash
sudo netplan apply
```

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

{% hint style="warning" %}
Disclaimer:

Este paso es necesario por el hecho de que la red NAT en VirtualBox con Windows esta temporalmente estroepada hasta que quieran parchearla.
{% endhint %}

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

```
net.ipv4.ip_forward=1
```

Aplica los cambios:

```bash
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:

```bash
# 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`:

```bash
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:

```bash
sudo apt update && sudo apt upgrade -y
```

También nos aseguraremos que esté instalado curl&#x20;

```bash
curl --help
```

y, si no lo tienes, lo instalas con:

```bash
sudo apt install curl -y
```

Ahora, ejecuta el instalador oficial de Pi-hole:

```bash
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:**

<figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2FRVPms2T1t8L5yG4mAZTD%2Fimage.png?alt=media&#x26;token=4f175b3a-5b50-45b8-a231-7c3236f755f5" alt=""><figcaption></figcaption></figure>

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

{% hint style="warning" %}
**Si no te acuerdas de la contraseña, para cambiar contraseña** si la olvidas:

```bash
pihole setpassword [contraseñanueva]
```

{% endhint %}

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

```bash
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í:

<div align="left"><figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2FD7WeHx92pUY5xEjOo7Va%2Fimage.png?alt=media&#x26;token=bf39bb57-aacf-4201-a5ef-93490c951cdb" alt="" width="365"><figcaption></figcaption></figure></div>

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

```bash
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:

```bash
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:

<figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2FLDV44ZbDxoy9tkzt5EqO%2Fimage.png?alt=media&#x26;token=08ae89ef-af5d-4dc4-a15a-7ccf7cf43093" alt=""><figcaption><p>A la izquierda, sin pi-hole, a la derecha, con pi-hole</p></figcaption></figure>

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

<figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2FcRumUZFtsduSLjciEMm4%2Fimage.png?alt=media&#x26;token=e3edd610-6f7b-4031-ac6f-57e70af93f44" alt=""><figcaption></figcaption></figure>

<figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2FizFu7tTLUds8LNNFWnU0%2Fimage.png?alt=media&#x26;token=6096ff5d-b614-4b16-8bda-b08fe2105a31" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**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** :wink:
{% endhint %}

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.

<div align="left"><figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2FqkGUHJD6Oy6hWNehPtyN%2Fimage.png?alt=media&#x26;token=4092538f-0497-437f-8655-001da3f4c296" alt="" width="508"><figcaption></figcaption></figure></div>
