Installer Pi-Hole avec Docker

Introduction

Pi-Hole est un serveur DNS auto hébergé. Il présente de nombreux avantages : bloqueur de pubs, protection supplémentaire, accélérateur de navigation et monitoring de votre réseau via une interface web. C’est vraiment un ‘must have’ pour un NAS. C’est un bon complément des bloqueurs que vous pouvez avoir dans vos navigateurs; mais le gros avantage, c’est qu’il agit en amont. Nous allons installer ‘pi-hole‘ avec docker compose et portainer dans cette article.

Pour cette installation j’utilise l’image officielle qui est présente ici : https://github.com/pi-hole/docker-pi-hole.

Remarque : J’ai créé au préalable un utilisateur omdocker (voir l’article création d ‘un utilisateur Docker pour le détail). J’ai créé aussi un répertoire qui contiendra tous mes installations docker. dans ce blog, j’utiliserais pour exemple le chemin /volume/docker.

Nous allons créer aussi le répertoire ‘pihole’ en ligne de commande sur le NAS (connexion en SSH) dans notre répertoire docker : /volume/docker. Cette étape est facultative, le containeur créera le répertoire automatiquement lors du déploiement si celui ci n’existe pas.

$ cd /volume/docker
$ mkdir pihole

Liaison réseau avec le LAN

Par défaut les containeurs possèdent leur propre réseau isolé, indépendant de votre LAN. Nous allons donc créer une interface « macvlan » au niveau de docker pour relier le réseau du containeur à notre LAN. Nous devrons aussi créer une interface « macvlan » au niveau de notre NAS pour assurer un pont entre les deux.

Création des macvlan

Nous allons définir un bloc d’adresse de 4 digit (15 adresses) qui sera routé à notre interface virtuelle du coté du LAN. L’adresse IP de notre « macvlan’ coté docker devra être compris dans ce bloc d’adresse.

Nous allons partir sur ces hypothèses là :

  • L’adresse IP de notre NAS est : ‘192.168.2.2‘,
  • L’adresse IP de notre passerelle est ‘192.1.168.2.1‘,
  • L’adresse IP de notre interface réseau virtuelle coté NAS sera ‘192.168.2.170‘,
  • L’adresse IP de notre containeur Pi-Hole sera ‘192.168.2.151‘,
  • Notre bloc d’adresse aura le masque suivant ‘192.168.2.150/28‘. Il commencera à l’adresse 192.168.2.151 et finira à l’adresse 192.168.2.164,
  • Le réseau virtuelle coté docker s’appellera ‘omvvlan-network‘,
  • L’interface virtuelle coté NAS s’appellera ‘eno1-vlan‘,
  • L’interface réseau de notre NAS s’appelle ‘eno1‘.

Création de notre réseau virtuelle avec Docker

Tapez la commande suivante pour créer notre interface réseau virtuelle ‘macvaln’, puis vérifier la présence du nouveau réseau :

$ sudo docker network create -d macvlan \
--subnet=192.168.2.0/24 \
--ip-range=192.168.2.150/28 \
--gateway=192.168.2.1 \
-o parent=eno1 \
omvvlan-network

créattion du réseau virtuelle
Le réseau virtuelle ‘omvlan-network’ est bien créé

Création de notre interface virtuelle coté NAS

Nous allons créer le script ‘eno1-vlan.sh‘ pour monter cette interface réseau virtuelle au démarrage du NAS :

#!/bin/sh
ip link add eno1-vlan link eno1 type macvlan mode bridge
ip addr add 192.168.2.170/32 dev eno1-vlan
ip link set dev eno1-vlan address B2:54:2B:8F:4D:58
ip link set eno1-vlan up
ip route add 192.168.2.150/28 dev eno1-vlan

Le script devra être lancé au démarrage du NAS via le cron. Pour cela nous créons une tache cron spécifiques (voir article sur les taches cron spécifiques) avec le code suivant à ajouter dans un fichier dans le répertoire /etc/cron.d (l’envoi d’email est optionnel).

@reboot root sleep 5 && /xxx/eno1-vlan.sh | mail -E -s "Cron - Lancement /xxx/eno1-vlan.sh" -a "From: Daemon root" root >/dev.null 2>&1

Exécutez votre script et vérifier que votre interface virtuelle est bien montée :

$ sudo ./eno1-vlan.sh
$ ip a | grep eno1-vlan

interface virtuelle macvlan
Notre interface virtuelle ‘eno1-vlan‘ est bien montée

Le fichier de configuration

Si vous souhaitez sécuriser le lancement de ‘pi-hole‘, je vous engage à parcourir l’article securiser docker.

Il est importent de bien respecter l’indentation des fichiers de configurations : pas de tabulation. Attention aussi à la version du fichier, il y a des légères évolutions de syntaxe d’une version à l’autre.

Le fichier yml en détails. Il faut remplacer pour votre configuration :

  • UID et PGID : celui de votre utilisateur Docker (omdocker pour ce blog),
  • TZ : Votre zone de temps

version: "3"
services:
  pihole:
    container_name: pi-hole
    image: pihole/pihole
    hostname: pi-hole
    networks:
       omvvlan-network:
          ipv4_address: 192.168.2.151
    ports:
      - 53:53/tcp # dns
      - 53:53/udp # dns
    environment:
      - PUID=1003
      - PGID=100
      - TZ=Europe/Paris
      - WEBPASSWORD=passwd # mot de passe de l'interface web
    volumes:
      - /volume/docker/pihole/etc-pihole:/etc/pihole/
      - /volume/docker/pihole/etc-dnsmasq.d:/etc/dnsmasq.d/
    restart: unless-stopped
networks:
    omvvlan-network:
      external: true

Vous copiez le contenu de ce fichier dans votre interface de gestion Portainer en allant dans ‘Stacks‘ et ‘Add stack‘.

Ajout d'une pile
Ajout d’une pile

la pile pi-hole
La pile ‘pi-hole

Donnez un nom à votre pile, par exemple ‘pi-hole‘, puis déployer cotre containeur en cliquant en bas sur « Deploy the stack‘.

Après une phase de téléchargement de l’image, puis d’installation de l’application, vous devriez arriver sur cet écran si tout s’est bien passé :

Le container pi-hole est installé
Le container ‘pi-hole‘ est installé et est en fonctionnement.

Nous pouvons maintenant nous connectez à ‘pi-hole‘ avec l’URL http://192.168.2.151 :

tableau de bord pi-hole
Tableau de bord de ‘pi-hole

top requetes, clients
Top requêtes et clients

Configuration de Pi-Hole

Il reste encore un peu de configuration a effectuer pour rendre pleinement fonctionnel ‘Pi-Hole’.

Configuration du serveur DNS externe

Pi-Hole contient plusieurs serveur DNS pré-défini; j’utilise ceux de Cloudfare pour ma part :

serveurs DNS externe
Serveur DNS Cloudfare

Configuration local DNS des périphériques du réseau

Par défaut, ‘Pi-Hole’ affiche l’adresse IP de vos périphériques mais vous pouvez définir une translation de nom pour chacun d’eux :

translation de noms
Translation de nom pour les périphériques locaux

Listes de blocages

Vous pouvez ajouter des listes de blocages distantes ou locales. Vous en trouvez beaucoup à ces adresses : avoidthehack et The Firebog. Elles s’ajoutent via l’interface (URL + Commentaires). Certaines listes peuvent être redondantes.

listes de blocages
Les listes de blocages

Gestion des domaines

Vous avez aussi la possibilité de gérer le blocage ou l’autorisation des domaines via un simple clic de souris puis de les personnaliser avec des expressions régulières :

domaines bloqués
domaines bloqués avec des expressions régulières

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *