Pi-hole è un software open-source che funziona come DNS sinkhole, bloccando pubblicità e tracker a livello di rete. A differenza delle estensioni browser, Pi-hole protegge tutti i dispositivi connessi alla rete domestica senza richiedere installazioni su ogni singolo device: smartphone, smart TV, console e dispositivi IoT sono automaticamente protetti.

Particolarmente utile per famiglie e piccole reti, Pi-hole offre un’interfaccia web intuitiva per monitorare le query DNS, visualizzare statistiche dettagliate e gestire whitelist e blacklist personalizzate. È la soluzione ideale per migliorare la privacy e velocizzare la navigazione eliminando il traffico pubblicitario indesiderato.

Cos’è un DNS Sinkhole?

Un DNS sinkhole è un server DNS che restituisce risposte false per determinati domini. Quando un dispositivo tenta di connettersi a un server pubblicitario o di tracking, il sinkhole intercetta la richiesta e risponde con un indirizzo nullo (0.0.0.0), impedendo la connessione.

Il funzionamento è semplice:

  1. Il dispositivo richiede l’indirizzo IP di ads.example.com
  2. Pi-hole consulta la sua blacklist e trova una corrispondenza
  3. Invece di inoltrare la richiesta, risponde con 0.0.0.0
  4. Il dispositivo non riesce a connettersi e la pubblicità non viene caricata

Questo approccio ha diversi vantaggi rispetto ai tradizionali ad-blocker:

  • Efficienza: blocca le richieste prima che consumino banda
  • Universalità: funziona su tutti i dispositivi senza installare software
  • Invisibilità: le app non rilevano il blocco come farebbero con un ad-blocker
  • Risparmio risorse: nessun impatto sulle prestazioni dei singoli dispositivi

Vantaggi di Pi-hole

Sicurezza

Pi-hole blocca l’accesso a domini malevoli noti, proteggendo la rete da malware, phishing e siti fraudolenti. Molte minacce informatiche si basano su domini che Pi-hole può intercettare prima che raggiungano i dispositivi.

Privacy

Impedisce ai tracker di terze parti di raccogliere dati sulla navigazione. Servizi come Google Analytics, Facebook Pixel e altri sistemi di tracciamento vengono bloccati a livello DNS, riducendo significativamente la profilazione degli utenti.

Prestazioni

Eliminando pubblicità e tracker, le pagine web si caricano più velocemente. Meno richieste DNS significano meno dati scaricati e tempi di risposta ridotti, particolarmente evidenti su connessioni lente o dispositivi meno potenti.

Controllo parentale

Pi-hole permette di bloccare categorie di siti indesiderati per tutta la famiglia. È possibile creare blacklist personalizzate per impedire l’accesso a contenuti inappropriati su tutti i dispositivi, inclusi quelli dove non è possibile installare software di controllo.

Visibilità sulla rete

La dashboard mostra in tempo reale tutte le query DNS della rete, permettendo di identificare dispositivi che comunicano con server sospetti o che generano traffico anomalo. Utile per diagnosticare problemi e scoprire comportamenti inattesi dei dispositivi IoT.

yaml
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "80:80/tcp"
    environment:
      TZ: 'Europe/Rome'
      FTLCONF_webserver_api_password: ${PIHOLE_PASSWORD}
      FTLCONF_dns_listeningMode: 'all'
      FTLCONF_dns_upstreams: '1.1.1.1;8.8.8.8'
    volumes:
      - pihole_data:/etc/pihole
    restart: unless-stopped

volumes:
  pihole_data:
Variabile Descrizione
TZ Fuso orario per log e statistiche
FTLCONF_webserver_api_password Password per l’interfaccia web di amministrazione
FTLCONF_dns_listeningMode Modalità di ascolto DNS. all accetta query da qualsiasi sorgente (necessario con Docker bridge)
sh
PIHOLE_PASSWORD=la_tua_password_sicura

Liberare la porta 53 (Fedora/Ubuntu)

Su molte distribuzioni Linux moderne, la porta 53 è già occupata da systemd-resolved o NetworkManager. Se proviamo ad avviare il container otterremo questo errore:

Error response from daemon: failed to bind host port 0.0.0.0:53/tcp: address already in use

1. Verifica quali servizi occupano la porta

bash
sudo ss -tuln | grep ':53'

Se vedi 127.0.0.53 (systemd-resolved) o 127.0.0.54 (NetworkManager), la porta è occupata.

2. Disabilita systemd-resolved

systemd-resolved è il resolver DNS predefinito su Ubuntu e Fedora:

bash
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

3. Configura NetworkManager

NetworkManager potrebbe avere un proprio resolver DNS. Modifica /etc/NetworkManager/NetworkManager.conf:

ini
[main]
dns=none

Riavvia il servizio:

bash
sudo systemctl restart NetworkManager

4. Configura DNS temporanei

Dopo aver disabilitato systemd-resolved, il sistema non può più risolvere nomi DNS. Configura dei DNS temporanei per permettere al sistema di funzionare durante l’installazione:

bash
sudo rm /etc/resolv.conf
echo -e "nameserver 1.1.1.1\nnameserver 8.8.8.8" | sudo tee /etc/resolv.conf

Puoi usare qualsiasi DNS pubblico (Cloudflare, Google, OpenDNS, o quelli del tuo ISP). Questi servono solo temporaneamente per avviare Pi-hole.

5. Avvia Pi-hole

Controlla che la porta sia libera:

bash
sudo ss -tuln | grep ':53'

Se non ci sono risultati, avvia Pi-hole:

bash
docker compose up -d

6. Configura il DNS del server

Una volta che Pi-hole è attivo, puoi decidere come gestire il DNS del server stesso:

Opzione A - Il server usa Pi-hole (consigliata):

bash
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf

Il server utilizzerà Pi-hole per le proprie richieste DNS, beneficiando del blocco pubblicità.

Opzione B - Il server usa DNS esterni:

Lascia i DNS esterni configurati al passo 4. Il server bypasserà Pi-hole, ma tutti gli altri dispositivi della rete saranno protetti.

L’interfaccia web sarà disponibile su http://<IP_SERVER>/admin.

Troubleshooting

DNS resolution is currently unavailable

Se dopo un riavvio Pi-hole mostra questo errore:

[✗] DNS resolution is currently unavailable

Il problema è che /etc/resolv.conf è un symlink rotto (appare in rosso con ls). Dopo aver disabilitato systemd-resolved, il symlink punta a un file che non esiste più.

Soluzione:

bash
sudo rm /etc/resolv.conf
sudo nano /etc/resolv.conf

Inserisci:

nameserver 1.1.1.1
nameserver 8.8.8.8

Riavvia Pi-hole:

bash
docker compose down && docker compose up -d

resolv.conf viene sovrascritto al riavvio

Per rendere il file immutabile e impedire che venga sovrascritto:

bash
sudo chattr +i /etc/resolv.conf

Per rimuovere la protezione (se devi modificarlo):

bash
sudo chattr -i /etc/resolv.conf