Passer au contenu principal

Installation de Pi-Hole sur RpiZeroW

Procédure accélérée de l'installation de Pi-Hole sur un Raspberry-Pi Zero W.

Installation de Raspberry Pi OS Lite

Téléchargement de l'OS

Installer l'image Raspberry Pi OS Lite sur le RPi0W.
Lien des images sur le site.

Préparation accès SSH du RPi0W

Éditer ou créer le fichier BOOT/wpa_supplicant.conf (soit à la racine de la carte).

country=FR
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="<yourWiFiNetworkName>"
    psk="<yourWiFiPassword>"
}

Également à la racine, créer un fichier vide ssh :

touch ssh

Accès SSH & MàJ

Se connecter en ssh au Rpi (mot de passe par défaut raspberry):

ssh pi@raspberrypi.local
>[…]
>Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
>[…]

Mise à jour, c'est assez long…

sudo apt-get update && sudo apt-get upgrade -y

On change le mot de passe par défaut de pi avec la commande passwd.

J'en profite pour créer mon utilisateur, lui assigner un mot de passe et l'ajouter au groupe sudo :

sudo useradd -m <username> # -m pour créer le fichier home
sudo passwd <username>
>New password: 
>Retype new password: 
>passwd: password updated successfully
sudo usermod -aG sudo <username> # -a pour append, -G pour le groupe

Je change le nom de l'appareil sur le réseau :

sudo hostnamectl set-hostname pihole
sudo vim /etc/hosts # pour également changer le nom sur l'ip interne
127.0.0.1	localhost
::1		localhost ip6-localhost ip6-loopback
ff02::1		ip6-allnodes
ff02::2		ip6-allrouters

127.0.1.1	pihole # ici
sudo reboot

J'envoie ma clé publique depuis mon hôte :

ssh-copy-id -i .ssh/id_rsa.pub pihole.local

Je peux me connecter directement :

ssh pihole.local

Automatique update du RPi

Source(s) 1.

sudo apt update
sudo apt install unattended-upgrades

Mettre en place la configuration des màj automatiques.

sudo vim /etc/apt/apt.conf.d/50unattended-upgrades

Décommenter les lignes 29 et 30, pour avoir ceci :

        "origin=Debian,codename=${distro_codename}-updates";
        "origin=Debian,codename=${distro_codename}-proposed-updates";
        "origin=Debian,codename=${distro_codename},label=Debian";
        "origin=Debian,codename=${distro_codename},label=Debian-Security";

Rendre la màj automatique effective :

sudo dpkg-reconfigure --priority=low unattended-upgrades

Puis confirmer à l'écran.

Il est possible de vérifier que le service fonctionne bien :

sudo systemctl status unattended-upgrades.service

Pi-Hole

Sources d'installation & configuration 1 2.

Préparation

Il faut paramétrer la box pour attribuer une ip fixe au Rpi.

Installation du Pi-Hole

Liens :

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

Et on répond aux questions.

Ne pas oublier de mettre le server DNS dans la Box Internet, ou de configurer le DHCP.
Voir en toute fin si 4G Box.

Configuration

Changer le mot de passe

pihole -a -p

Blocklist

Exemple de blocklist :

Plusieurs urls peuvent être entrées dans les blocklist en étant séparées par des espaces. Si besoin, utiliser regular expressions 101 ( regex : \t\n pour la sélection) pour faire le tri dans les tabulations et retours de ligne.

Mise à jour de la list Gravity :

sudo pihole -g

Suivant la taille, ça peut mettre du temps.

Test

Sur le site de Fuzz the Pi Guy.

Si ça ne fonctionne pas, d'abord essayer de tout éteindre puis allumer :

  1. Le Pi-Hole ;
  2. La Box Internet.

Chronometer

Afin de voir un log en temps réel :

pihole -c

Capture d’écran 2021-04-12 à 23.44.08.png

Bonus : Choisir DNS Server sur 4G Box

Par défaut, on ne peut pas voir les paramètres de changement de DNS. Pour afficher l'option, se rendre dans DHCP, puis taper dans la console :

$('#dhcp_dns').css('display', 'block');

Et enfin, entrer l'adresse ip du Pi-Hole.

Installation de DNS Unbound

Installation basée sur la documentation de Pi-hole de unbound, cela permet de mettre en cache les demandes DNS.

Préparatifs

Tout d’abord, on fait une mise à jour :

sudo apt update && sudo apt upgrade -y

Installation de unbound

On vérifie les informations du paquet :

apt show unbound

Il ne s’agit pas de la dernière version, cependant le site officiel conseille de passer par le gestionnaire de paquets plutôt que de le compiler.

Package: unbound
Version: 1.9.0-2+deb10u2
Priority: optional
Section: net
Maintainer: unbound packagers <unbound@packages.debian.org>
Installed-Size: 3,637 kB
Depends: adduser, dns-root-data, lsb-base (>= 3.0-6), openssl, unbound-anchor, libc6 (>= 2.28), libevent-2.1-6 (>= 2.1.8-stable), libfstrm0 (>= 0.2.0), libprotobuf-c1 (>= 1.0.1), libpython3.7 (>= 3.7.0), libssl1.1 (>= 1.1.1), libsystemd0
Suggests: apparmor
Enhances: munin-node
Homepage: https://www.unbound.net/
Download-Size: 671 kB
APT-Sources: http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages
Description: validating, recursive, caching DNS resolver
 Unbound is a recursive-only caching DNS server which can perform DNSSEC
 validation of results. It implements only a minimal amount of authoritative
 service to prevent leakage to the root nameservers: forward lookups for
 localhost, reverse for 127.0.0.1 and ::1, and NXDOMAIN for zones served by
 AS112. Stub and forward zones are supported.
 .
 This package contains the unbound daemon.
sudo apt install unbound

Configurer unbound

On crée le fichier /etc/unbound/unbound.conf.d/pi-hole.conf :

sudo vim /etc/unbound/unbound.conf.d/pi-hole.conf
server:
    # If no logfile is specified, syslog is used
    # logfile: "/var/log/unbound/unbound.log"
    verbosity: 0

    interface: 127.0.0.1
    port: 5335
    do-ip4: yes
    do-udp: yes
    do-tcp: yes

    # May be set to yes if you have IPv6 connectivity
    do-ip6: no

    # You want to leave this to no unless you have *native* IPv6. With 6to4 and
    # Terredo tunnels your web browser should favor IPv4 for the same reasons
    prefer-ip6: no

    # Use this only when you downloaded the list of primary root servers!
    # If you use the default dns-root-data package, unbound will find it automatically
    #root-hints: "/var/lib/unbound/root.hints"

    # Trust glue only if it is within the server's authority
    harden-glue: yes

    # Require DNSSEC data for trust-anchored zones, if such data is absent, the zone becomes BOGUS
    harden-dnssec-stripped: yes

    # Don't use Capitalization randomization as it known to cause DNSSEC issues sometimes
    # see https://discourse.pi-hole.net/t/unbound-stubby-or-dnscrypt-proxy/9378 for further details
    use-caps-for-id: no

    # Reduce EDNS reassembly buffer size.
    # Suggested by the unbound man page to reduce fragmentation reassembly problems
    edns-buffer-size: 1472

    # Perform prefetching of close to expired message cache entries
    # This only applies to domains that have been frequently queried
    prefetch: yes

    # One thread should be sufficient, can be increased on beefy machines. In reality for most users running on small networks or on a single machine, it should be unnecessary to seek performance enhancement by increasing num-threads above 1.
    num-threads: 1

    # Ensure kernel buffer is large enough to not lose messages in traffic spikes
    so-rcvbuf: 1m

    # Ensure privacy of local IP ranges
    private-address: 192.168.0.0/16
    private-address: 169.254.0.0/16
    private-address: 172.16.0.0/12
    private-address: 10.0.0.0/8
    private-address: fd00::/8
    private-address: fe80::/10

On redémarre le service :

sudo service unbound restart

Test de la mise ne cache du DNS

dig pi-hole.net @127.0.0.1 -p 5335
; <<>> DiG 9.11.5-P4-5.1+deb10u6-Raspbian <<>> pi-hole.net @127.0.0.1 -p 5335
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19530
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;pi-hole.net.			IN	A

;; ANSWER SECTION:
pi-hole.net.		300	IN	A	3.18.136.52

;; Query time: 856 msec
;; SERVER: 127.0.0.1#5335(127.0.0.1)
;; WHEN: Sun Nov 07 15:06:44 CET 2021
;; MSG SIZE  rcvd: 56

Si on recommence la précédente commande :

; <<>> DiG 9.11.5-P4-5.1+deb10u6-Raspbian <<>> pi-hole.net @127.0.0.1 -p 5335
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63461
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;pi-hole.net.			IN	A

;; ANSWER SECTION:
pi-hole.net.		283	IN	A	3.18.136.52

;; Query time: 0 msec
;; SERVER: 127.0.0.1#5335(127.0.0.1)
;; WHEN: Sun Nov 07 15:07:01 CET 2021
;; MSG SIZE  rcvd: 56

On peut surtout remarquer la durée du Query time, on passe de 856 ms à 0 ms.

Test du DNSSEC

Pour se faire, on fait un appel qui doit renvoyer un erreur et un autre qui doit marcher.

dig sigfail.verteiltesysteme.net @127.0.0.1 -p 5335
; <<>> DiG 9.11.5-P4-5.1+deb10u6-Raspbian <<>> sigfail.verteiltesysteme.net @127.0.0.1 -p 5335
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 30491
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;sigfail.verteiltesysteme.net.	IN	A

;; Query time: 1166 msec
;; SERVER: 127.0.0.1#5335(127.0.0.1)
;; WHEN: Sun Nov 07 15:11:42 CET 2021
;; MSG SIZE  rcvd: 57

Le status doit être à SERVFAIL et ne pas fournir d'adresse IP.

dig sigok.verteiltesysteme.net @127.0.0.1 -p 5335
; <<>> DiG 9.11.5-P4-5.1+deb10u6-Raspbian <<>> sigok.verteiltesysteme.net @127.0.0.1 -p 5335
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51837
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;sigok.verteiltesysteme.net.	IN	A

;; ANSWER SECTION:
sigok.verteiltesysteme.net. 60	IN	A	134.91.78.139

;; Query time: 89 msec
;; SERVER: 127.0.0.1#5335(127.0.0.1)
;; WHEN: Sun Nov 07 15:12:15 CET 2021
;; MSG SIZE  rcvd: 71

Le status doit être à NOERRORet fournir une adresse IP.

Configuration du Pi-hole

À la page d’administration du Pi-hole, dans la partie Settings, on désactive tous les serveurs DNS précédemment entrés puis on inscrit l’adresse du localhost suivi du port de unbound (séparé par un #), à savoir 127.0.0.1#5335.

Cloudflared (DoH)

À voir ici.

VPN : WireGuard

La doc est ici.