Aller au contenu

[TUTO] [Docker - macvlan] Pi-Hole


.Shad.

Messages recommandés

 

220px-Pi-hole_Logo_2.png.07ccb11c230e654299a45f4a5b87330a.png

 

1. Préambule

Pi-Hole est un logiciel libre permettant le blocage de publicités sur les périphériques qui l'utilisent en tant que serveur DNS. Il sert aussi à contrôler les données de télémétrie que vos appareils envoient, parfois (souvent ? ) de manière non-désirée.
Vu que le blocage s'effectue au niveau de la résolution DNS, il a l'avantage de pouvoir s'appliquer à tous les types de périphériques, contrairement aux bloqueurs de navigateurs qui se limitent souvent aux ordinateurs.

Le tutoriel sera découpé de la sorte :

- STANDARD - 

  • Utilisation et déploiement de Pi-Hole via Docker

- AVANCÉ -

  • Ses différentes utilisations en tant que serveur DNS local
  • La personnalisation du blocage suivant les périphériques
  • Quelques commandes utiles

2. Prérequis

Difficulté : facile-moyenne

Vous devez disposer d'un NAS compatible Docker, vous pouvez en retrouver la liste mise à jour à cette adresse https://www.synology.com/fr-fr/dsm/packages/Docker
Au niveau des connaissances :

  • Avoir une idée de ce qu'est Docker, voir tutoriel introductif.
  • Savoir se connecter via SSH avec un utilisateur ayant des privilèges d'administrateur ou root directement, voir tutoriel.
  • OPTIONNEL : je conseille d'installer le paquet SynoCLI File Tools de Synocommunity disponible dans le centre de paquets. Pour ajouter le dépôt Synocommunity au centre de paquets, se référer à ce tutoriel : https://sys-advisor.com/2017/11/05/tuto-synology-comment-ajouter-le-depot-synocomunity/. Après cela, la commande nano, certes moins complète que vi, mais beaucoup plus accessible pour les non-initiés, permettra d'éditer facilement les fichiers en console.

3. Méthode d'installation

Il existe plusieurs méthodes pour installer Pi-Hole, préférentiellement je conseille :

  1. l'utilisation d'un matériel dédié type Raspberry Pi quand on en a un sous la main et sur lequel il est facile de l'installer nativement, la procédure est très simplement décrite ici
  2. une machine virtuelle (avec le paquet Virtual Machine Manager, les prérequis de compatibilité étant les mêmes que pour Docker), avec une installation minimale de Debian avec 512Mo de mémoire vive et un cœur est amplement suffisante
  3. un conteneur Docker.

Il faut savoir que l'utilisation via Docker demande certains ajustements, et ce pour plusieurs raisons :

  • Pi-Hole utilise les ports 80 et 443, qui sont utilisés par DSM pour Webstation et Nginx (notamment le proxy inversé). 
  • Si le conteneur est en mode bridge, les requêtes DNS passant alors par l'hôte (le NAS) avant d'arriver au conteneur, vous verrez l'ensemble des requêtes provenant de l'IP passerelle du NAS dans le réseau bridge par défaut, donc 172.17.0.1. Ce qui posera très vite problème si on souhaite différencier le comportement de blocage pour sa tablette, pour sa TV, etc... (voir à la fin du tutoriel)

On privilégiera donc l'utilisation d'un réseau macvlan, celui-ci a entre autres l'avantage de pouvoir donner une IP du réseau local à votre conteneur, par exemple 192.168.100.161, il est donc joignable par les périphériques de votre réseau comme n'importe quelle autre machine. Il y a cependant un écueil à l'utilisation d'un réseau macvlan : tous les conteneurs qui en font partie sont incapables de communiquer avec leur hôte par leur IP physique. Concrètement mon NAS sera incapable de joindre Pi-Hole, donc sa résolution DNS sera non fonctionnelle. Pour pallier ce problème, on va créer une interface virtuelle sur le NAS. En gros si la porte est fermée, on passe par la fenêtre. 🙂 
C'est une manipulation très simple, qui ne survit toutefois pas à un redémarrage du NAS, on exécutera donc un script au démarrage pour recréer automatiquement cette interface.
L'ensemble de cette procédure est décrite dans le tutoriel introductif, et est, par commodité, reprise dans la partie suivante.

4. Hypothèses

Pour faciliter la lecture du tutoriel, on définira un certain nombre d'IP et de notations, vous devez évidemment adapter ces valeurs à votre propre installation, notamment les sous-réseaux.

Les IP :

  • de l'interface physique du NAS : 192.168.100.100
  • de l'interface virtuelle du NAS : 192.168.100.200
  • du conteneur pi-hole : 192.168.100.161
  • de la passerelle du réseau (votre box ou votre routeur) : 192.168.100.1
  • de votre serveur DNS local (si vous n'en avez pas mis en place, c'est l'IP de votre passerelle) : 192.168.100.120

Les sous-réseaux :

  • de votre réseau local : 192.168.100.0/24 (correspond à 192.168.100.0/255.255.255.0).
  • du réseau macvlan : 192.168.100.160/28 (correspond à une plage utilisable de 14 IP allant de 192.168.100.161 à 192.168.100.174). Voir ce site qui permet de calculer les masques.

Les notations :

  • macvlan-network : c'est le nom du réseau docker macvlan.
  • mac0 : c'est le nom de l'interface virtuelle du NAS.
  • ovs_eth0 : le nom de l'interface qui a pour IP l'IP physique de votre NAS, 192.168.100.100 dans notre exemple. Pour trouver le nom de l'interface en SSH :
    ifconfig | grep -B 1 192.168.100.100
    C'est le nom qui apparaît à gauche de l'écran sur la première ligne : 

    interface_name.PNG.570b852b5b4b1efe58af4422fc42d4e1.PNG

REMARQUE : ovs s'ajoute automatiquement au nom de l'interface lorsqu'on a activé Open vSwitch sur son NAS (automatique lors de l'installation de Virtual Machine Manager)

- STANDARD - 

5. Création du réseau et de l'interface virtuelle

5-A. Création du réseau macvlan

On commence par se connecter via SSH avec un utilisateur admin ou root sur le NAS pour créer notre réseau macvlan. On va se placer dans le dossier partagé docker :

cd /volume1/docker/

On y crée un dossier "networks" et y commencer l'édition du script :

mkdir networks && cd $_
nano macvlan-network.sh

S'ouvre une fenêtre dans laquelle on va pouvoir rédiger notre script, en voici un canevas :

docker network create -d macvlan \
--subnet=192.168.100.0/24 \
--ip-range=192.168.100.160/28 \
--gateway=192.168.100.1 \
-o parent=ovs_eth0 \
macvlan-network

Notes :

  • subnet : correspond à votre sous-réseau local.
  • ip-range : correspond à la portion de ce sous-réseau qu'on se réserve pour le réseau macvlan, les 14 adresses IP définies dans les hypothèses. Ces 14 IP permettront d'accueillir d'autres conteneurs éventuels.
    Par conséquent, la plage du serveur DHCP et du réseau macvlan ne doivent absolument pas se chevaucher !
  • gateway : c'est notre passerelle.
  • parent : l'interface physique à laquelle on rattache notre réseau.

_________________________

Pour sauvegarder les modifications effectuées, on fait CTRL+O, on valide en appuyant sur Entrée puis CTRL+X pour sortir de l'éditeur et revenir sur le prompt. On va maintenant régler les permissions :

chmod 740 macvlan-network.sh

Le script est prêt, on peut l'exécuter :

bash macvlan-network.sh

Si tout va bien, on obtient une suite de caractères, cela signifie que le réseau est créé. On peut vérifier en tapant :

docker network ls

Et vérifier qu'il apparaît bien dans la liste.

En cas d'erreur dans la transcription, il suffit de supprimer le réseau malformé pour recommencer :

docker network rm macvlan-network

5-B. Création de l'interface virtuelle

On va créer un second script dans le dossier courant :

nano mac0-interface.sh

Le contenu du script :

ip link add mac0 link ovs_eth0 type macvlan mode bridge
ip addr add 192.168.100.200/32 dev mac0
ip link set dev mac0 address 5E:11:4F:AF:D6:D2
ip link set mac0 up
ip route add 192.168.100.160/28 dev mac0

Notes :
Concernant l'adresse MAC 5E:11:4F:AF:D6:D2 : c'est une adresse que j'ai choisie, sous les conditions suivantes :

- Elle n'existe pas déjà sur mon hôte et sur mon réseau.
- Elle respecte la base hexadécimale, les notations allant de 0 à F.
- Le premier nombre doit être pair, ici 5E = 94 en base 10, c'est donc OK (vous pouvez utiliser ce convertisseur en ligne, ou faire vos divisions euclidiennes 😄). S'il est impair, vous aurez un message :

RTNETLINK answers: Cannot assign requested address

Merci à @bruno78 pour la précision.

_________________________

On valide et on sort du fichier. On accorde les permissions :

chmod 740 mac0-interface.sh

On exécute le script :

bash mac0-interface.sh

Sauf erreur, rien n'indiquera que le script a bien fonctionné, on vérifie en tapant :

ifconfig | grep -A 9 mac0 

Ce qui doit donner un résultat du type :

interface_name_mac0.PNG.0452ba7debe37904eff04c0caa03658a.PNG

Un autre moyen de vérifier que ça a marché est de lancer Synology Assistant, l'interface virtuelle devrait dorénavant apparaître en plus de l'interface physique du NAS.

5-C. Création de la tâche de rétablissement de l'interface virtuelle au redémarrage

Comme dit plus avant, cette interface ne persiste pas au redémarrage du NAS, on va pour cela définir une tâche planifiée, il faut aller dans DSM -> Panneau de configuration -> Planificateur de tâches -> Créer -> Tâche déclenchée :

mac0-reload-1.png.64bb039c93d174ffcf582948a63cab10.pngmac0-reload-2.png.2dc22223021b26f2ac1189fe046c9416.png

Puis on valide.

REMARQUE : Lorsqu'on stoppe docker, ou qu'on le met à jour, l'interface disparaît également. La tâche n'étant lancée qu'au démarrage, vous devrez réexécuter la tâche manuellement pour rétablir l'interface.

6. Création des volumes

On va créer un dossier pour le conteneur et s'y placer, on va également créer deux dossiers pour la persistance des données de configuration de Pi-Hole :

mkdir -p /volume1/docker/pi-hole && cd $_
mkdir etc-pihole etc-dnsmasq.d

Ainsi, même si le conteneur est supprimé, les données seront conservées.

7. Création d'utilisateurs et groupes dédiés et octroi de propriété

Pi-Hole permet depuis quelques versions d'exécuter le conteneur par le biais d'un utilisateur non privilégié. Autrefois, c'était root qui exécutait l'application, et root dans le conteneur correspondait à root sur le NAS, ce qui en cas de faille au niveau de l'image Docker représentait une faille de sécurité potentielle.

Nous allons créer deux utilisateurs ainsi que deux groupes, un tandem pour l'exécution de Pi-Hole, l'autre pour les services web qu'utilise Pi-Hole.

Dans DSM : Panneau de configuration -> Utilisateur et groupe -> Groupe -> Créer.

  • 1er groupe :
    • Nom : pihole
    • Description : Exécute le conteneur Pi-Hole
    • Autorisations dossiers partagés : Aucun accès pour tous les dossiers sauf docker (Lecture/Ecriture) et homes (on ne coche rien)
    • Autorisation applications : Tout refuser
  • 1er utilisateur :
    • Nom : pihole
    • Appartient au groupe : pihole
    • Tout le reste est issu des permissions liées au groupe
  • 2ème groupe :
    • Nom : pihole-www
    • Même chose que pour pihole
  • 2ème utilisateur :
    • Nom : pihole-www
    • Appartient aux groupes : pihole-www et pihole
    • Tout le reste est issu des permissions liées aux groupes

En SSH, on va attribuer la propriété des deux dossiers de configuration créés dans la section précédente à l'utilisateur pihole et au groupe pihole :

cd /volume1/docker
chown -R pihole:pihole pi-hole/

On vérifie que les permissions sont ok :

tuto_pihole_permissions_dossiers_1.PNG.18882aab2407288e0e616b9e503eb6e6.PNG

Avant de clôturer cette partie, nous allons vérifier les uid et gid de nos utilisateurs et groupes nouvellement créés, nous en aurons besoin pour personnaliser notre fichier compose :

tuto_pihole_uid_gid_2.PNG.9b1496ce03725f8367e2bacbd2fa573b.PNG

 

REMARQUE : les valeurs ci-dessus sont propres à votre installation, ne les recopiez pas bêtement !

7. Configuration et initialisation

7-A. Création du fichier compose

On va utiliser Docker-compose pour créer notre conteneur. Docker-compose est une manière alternative de créer un conteneur qui possède de nombreux avantages par rapport à la ligne de commande et à l'interface proposée par DSM. De plus Docker-compose vient avec le paquet Docker de Synology, donc aucune installation supplémentaire n'est nécessaire.

Venons-en à la création de notre fichier compose :

nano docker-compose.yml

On y colle le contenu suivant, il suffit de copier les données suivantes, revenir dans l'éditeur nano, et faire un clic droit.

version: '2.1'
services:

   pi-hole:
      image: pihole/pihole
      container_name: pi-hole
      hostname: pi-hole
      networks:
         macvlan-network:
            ipv4_address: 192.168.100.161
      environment:
         # General
         - ADMIN_EMAIL=xxx@yyy.zzz
         - TZ=Europe/Paris
         - PIHOLE_DNS_=80.67.169.12;9.9.9.9              # IP des serveurs DNS FdN et Quad9
         - DNSSEC=false
         - DNS_BOGUS_PRIV=true
         - DNS_FQDN_REQUIRED=true
         - DNSMASQ_LISTENING=local
         - INTERFACE=ovs_eth0
         - FTLCONF_LOCAL_IPV4=192.168.100.161            # IP du conteneur Pi-hole
         - VIRTUAL_HOST=pi-hole.ndd.tld                  # Si on souhaite acceder a Pi-hole par un nom de domaine (proxy inverse par exemple)
         - WEBPASSWORD=xxxxxxxxxxxxxxxxxxxx
         # Mapping utilisateurs et groupes
         - PIHOLE_UID=1045                               # pihole UID
         - PIHOLE_GID=65548                              # pihole GID
         - WEB_UID=1044                                  # pihole-www UID
         - WEB_GID=65547                                 # pihole-www GID
         # Conditional forwarding
         - REV_SERVER=true                               # Permet de recuperer les hostnames des peripheriques du reseau
         - REV_SERVER_TARGET=192.168.100.xxx             # Voir paragraphe CONDITIONAL FORWARDING
         - REV_SERVER_CIDR=192.168.100.0/24              # Votre sous-reseau local
         - REV_SERVER_DOMAIN=ndd.tld                     # Domaine local
         # Personnalisation interface
         - TEMPERATUREUNIT=C
         - WEBTHEME=default-darker
         - WEBUIBOXEDLAYOUT=boxed
      volumes:
         - /volume1/docker/pi-hole/etc-pihole:/etc/pihole/
         - /volume1/docker/pi-hole/etc-dnsmasq.d:/etc/dnsmasq.d/
      dns:
         - 127.0.0.1
         - 80.67.169.12
      restart: unless-stopped

networks:

   macvlan-network:
      external: true

REMARQUES :

  • Il est important de respecter l'indentation (l'alignement des paramètres).
  • Si vos serveurs publiques définis dans PIHOLE_DNS_ prennent en charge DNSSEC, vous pouvez passer cette dernière variable à true. On a défini ici 2 serveurs publics différents, pour limiter les risques d'indisponibilité (merci à @Einsteinium pour sa suggestion).
  • Si vous n'utilisez pas de proxy inversé, il n'est pas nécessaire de définir la variable VIRTUAL_HOST.
  • Ce fichier permet de définir dès le lancement avec précision la valeur de la plupart des paramètres, pour la liste exhaustive de toutes les variables d'environnement disponibles, consultez cette page.

7-B. Conditional forwarding

Si vous pouvez vous contenter de l'affichage des IP au lieu des noms d'hôte des périphériques, vous pouvez vous abstenir de définir les quatre variables d'environnement REV_SERVER_ dans le fichier compose.

Sinon :

Révélation

C'est une question qui revient souvent, les utilisateurs de Pi-Hole n'arrivent pas à afficher les noms d'hôte des périphériques.
Il faut comprendre que Pi-Hole n'a connaissance que de ce qu'on lui transmet.

L'option est composée de trois champs, qui seront déjà complétés par les variables d'environnement REV_SERVER_CIDR, REV_SERVER_TARGET et REV_SERVER_DOMAIN.

  • REV_SERVER_CIDR : comme indiqué dans le fichier docker-compose ci-dessus, on y inscrit notre sous-réseau local sous notation CIDR, voir hypothèses de départ, ici ce sera 192.168.100.0/24
    ATTENTION : il semblerait que seuls les sous-réseaux avec un CIDR de /8, /16, /24 et /32 soient autorisés. Si votre CIDR est situé entre ces valeurs, prenez le CIDR qui englobe votre plage d'IP. Exemple : si vous utilisez un /25, utilisez /24, si vous utilisez un /20, utilisez /16, etc... (merci à @PPJP).
  • REV_SERVER_DOMAIN : comme indiqué c'est optionnel, c'est le domaine qu'accole automatiquement votre serveur DHCP aux noms d'hôte des périphériques du réseau local.
  • REV_SERVER_TARGET : suivant votre installation, ça peut être plus ou moins simple, par exemple si utilisez déjà un autre serveur DNS sur votre réseau local par exemple, différents cas de figure sont à considérer :
     
  • Serveur DHCP et serveur DNS local sont confondus sur le même matériel, le serveur DHCP récupère le nom d'hôte envoyé par le périphérique , et l'inscrit dans sa zone DNS.
    En définissant REV_SERVER_TARGET avec l'IP du serveur DHCP/DNS (étant confondus dans ce cas précis), Pi-Hole affichera les noms d'hôte de l'ensemble de vos périphériques dans son tableau de bord.
    C'est le cas le plus fréquent, ces deux serveurs sont hébergés sur la passerelle (votre box ou routeur).
    Dans ce cas, vous devez mettre l'IP du serveur dhcp/dns, ou celle de la passerelle (box ou routeur) si tout y est localisé.
  • Serveur DHCP et serveur DNS local sont distincts. Or, Pi-hole ne permet d'interroger qu'une seule IP.
    Dans ce cas-là vous devez faire pointer REV_SERVER_TARGET sur le serveur qui définit un nom d'hôte et un domaine pour chaque périphérique, donc a priori votre serveur DNS, mais attention, tous les périphériques pour lesquels vous n'avez pas associé d'enregistrement dans votre serveur DNS (car purement des clients par exemple, ce sont eux qui accèdent au monde, pas l'inverse, utilisation typique : vous n'auriez jamais besoin d'accéder à votre tablette, smartphone, etc...) n'auront pas de nom d'hôte attribué, et seule apparaîtra l'IP, si vous avez bien suivi c'est normal car c'est le serveur DHCP qui dispose de cette information. Il faut donc dans ce cas-là définir un nom d'hôte pour chacun des périphériques de votre réseau utilisant Pi-Hole comme serveur DNS dans votre zone DNS.
  • La troisième possibilité est d'utiliser Pi-Hole comme serveur DNS local, dans ce cas-là le conditional forwarding peut être désactivé.
    Ce point est abordé plus loin dans le tutoriel.

7-C. Création du conteneur

Il n'y a plus qu'à créer le conteneur, pour cela on a juste à taper :

docker-compose pull && docker-compose up -d

Docker va télécharger l'image, et créer le conteneur.
Attendez une minute ou deux au premier lancement, Pi-hole met un peu de temps pour démarrer.

On peut ensuite se rendre sur l'adresse IP du conteneur (ou le nom de domaine défini dans VIRTUAL_HOST si on a défini cette variable), si tout va bien on arrive sur la page d'accueil de Pi-Hole.

8. Résolution locale

L'étape ultime, mais la plus importante, est de faire en sorte que votre serveur DHCP envoie à ses clients l'adresse IP de Pi-hole comme serveur DNS primaire.

Pour le vérifier, il suffit de taper dans une invite de commande Windows par exemple :

nslookup nas-forum.com

Si les deux premières lignes du résultat sont équivalentes à :

Serveur :   pi.hole
Address:  192.168.100.161

Félicitations, votre Pi-Hole est fonctionnel !

Pour vérifier que le blocage de publicités est actif, essayez d'aller sur http://doubleclick.net, si le nom de domaine ne peut être résolu, c'est que Pi-Hole a filtré la demande (veillez à désactiver tout bloqueur de pubs intégré au navigateur en amont).

Quid du serveur DNS secondaire ? Bien qu'il puisse être rassurant d'envoyer comme serveur DNS secondaire l'IP d'un serveur DNS publique, pour qu'en cas d'indisponibilité de Pi-Hole, la résolution DNS globale soit toujours active sur le votre réseau local, il arrive qu'un périphérique préfère s'adresser au DNS secondaire plutôt que primaire, et dans ce cas-là les requêtes n'étant accessibles que localement échoueront.

Pour éviter ces désagréments, on peut mettre en place un deuxième serveur Pi-Hole sur un périphérique simple comme un Raspberry Pi, une machine virtuelle sur un autre serveur ou un autre NAS compatible Docker si on en possède un.

La suite s'adresse aux utilisateurs souhaitant pousser plus avant la configuration de Pi-Hole.

- AVANCÉ -

9. Modes d'utilisation

9-A. Pi-Hole + serveur DNS local + serveur DHCP

Ce point n'est pas abordé dans le tutoriel, je ne trouve pas ça prudent de laisser un conteneur du NAS gérer le serveur DHCP, c'est beaucoup moins stable qu'un périphérique dédié comme un routeur, avec une installation native. Et sans DHCP, vos périphériques ne pourront non seulement pas discuter entre eux, mais pas accéder à Internet non plus.

9-B. Pi-Hole + serveur DNS local

Dans le cas où vous avez déjà un serveur DNS local actif sur votre NAS ou tout autre périphérique, vous pouvez placer Pi-Hole en amont du serveur DNS local. Il faudra alors donner comme valeur à la variable d'environnement DNS1 l'IP de l'hôte du serveur DNS. Si vous avez une redondance de serveurs DNS local, pensez à compléter DNS2 de manière analogue. Vos périphériques interrogeront d'abord Pi-hole, qui transmettra ensuite la requête à votre serveur DNS local, lui-même transmettra aux redirecteurs que vous lui avez précisés si la requête n'est pas résoluble localement.

Périphérique -> Pi-Hole -> Serveur DNS local -> Serveur publique "upstream"

ATTENTION : Si vous utilisez un serveur DNS sur l'hôte même (par exemple DNS Server), il faut utiliser l'IP virtuelle du NAS, pas son IP physique habituelle (merci à @anorec).

9-C. Pi-Hole en tant que serveur DNS local

9-C-1. Ajout des enregistrements

Il est possible d'utiliser directement Pi-Hole comme résolveur DNS local. C'est extrêmement pratique si vous n'avez encore mis aucune résolution locale en place (avec DNS Server par exemple).
ATTENTION : Pi-Hole n'est pas en mesure d'être source d'autorité pour une zone publique, il faut pour cela passer par exemple par des logiciels comme BIND ou DNS Server de DSM, qui n'en est qu'une surcouche.

Pour se faire on se rend sur la page d'accueil de Pi-Hole, on se connecte en cliquant sur Login, on utilise le mot de passe précédemment défini dans le fichier compose.

Dans le menu latéral apparaît l'onglet Local DNS, deux sous-menus apparaissent : DNS Records et CNAME Records :

  • Le premier permet de définir les enregistrements A pour le domaine et les périphériques de votre réseau.
  • Le second permet de définir des alias pour les domaines précédemment définis.

Une image est plus parlante qu'un long discours :

pihole_panel_local_dns-1.thumb.png.36f712190b64aec41486c429e0f1a4cb.png

Notes :

  • Depuis mon réseau local, taper domaine1.fr dans mon navigateur m'amènera sur l'IP de ma passerelle. Si ma box ou mon routeur expose son interface sur le port 80, j'arriverai dessus.
  • J'ai volontairement donné à domaine2.fr une IP inexistante sur le réseau, Pi-Hole ne vous indiquera aucune erreur, il se contente de vous indiquer la direction, même s'il y a un fossé trois mètres plus loin. 😉 C'est votre navigateur qui y sera confronté et vous renverra une erreur.
  • nas.domaine1.fr pointe sur mon NAS, sur lequel par exemple je pourrais utiliser un proxy inversé.

Et maintenant dans CNAME Records, je vais par exemple définir des alias pour mes périphériques et pour mon proxy inversé :

pihole_panel_local_dns-2.thumb.png.ca140bdcc242489831fb4b81cefc2e69.png

REMARQUE La seule règle doit être que la cible de l'enregistrement CNAME (le contenu de la colonne Target) doit avoir été préalablement définie dans la partie DNS records.
Le rafraichissement de la zone se faisant à chaque nouvel ajout, il faut qu'il soit valide.

9-C-2. Vérification

On peut vérifier par acquis de conscience que la résolution est bien effective :

docker exec -it pi-hole bash

En tapant ceci on se connecte directement dans le conteneur, à la suite de quoi on réalise quelques tests de résolution DNS :

nslookup domaine1.fr
nslookup domaine2.fr
nslookup nas.domaine1.fr
nslookup bitwarden.domaine1.fr
nslookup nas.fauxdomaine.fr

On peut ainsi vérifier qu'un ensemble d'enregistrements existent dans notre zone locale de Pi-Hole, et même d'autres qui n'existent pas pour lesquels Pi-Hole devrait nous renvoyer une valeur NXDOMAIN (Non-existent domain).

10. Blocage différencié

Un des gros avantages de Pi-Hole face à la concurrence est la possibilité de créer des groupes de périphériques pour lesquels on peut personnaliser les listes de blocage, ou même désactiver Pi-Hole complètement. Ou a contrario d'être beaucoup plus restrictif.

Quelques exemples concrets :

  • Jeux mobiles : certains jeux gratuits nécessitent de visionner des vidéos pour pouvoir continuer de jouer. Il y a des grandes chances que Pi-Hole bloque ces publicités et altère en conséquence votre expérience de jeu.
  • Il n'est pas rare qu'on souhaite contrôler strictement ce que du matériel domotique (caméra, détecteur, etc...) peut envoyer sur la toile. En ajoutant certaines listes de blocage pour cette catégorie d'équipements, on peut avoir la maîtrise des données transférées sans pour autant générer un nombre importants de faux-positifs sur les autres périphériques du réseau.
  • On peut laisser actif Google Shopping pour madame. 🙂 

C'est dans l'onglet Group Management que ça se passe, lequel comprend quatre sous-menus : Groups, Clients, Domains et Adlists.

On se dirige en premier lieu dans Groups, dans lequel j'ai ajouté un groupe pour mon smartphone :

pihole_panel_groups_management-1.thumb.png.3199adf31e609d869ebc33726aed0e1d.png

Si je clique sur Enabled, la valeur passera à Disabled et Pi-Hole sera désactivé pour ce groupe, les requêtes seront directement transmises au(x) redirecteur(s).

Dans Clients, je peux choisir dans la liste déroulante un des périphériques vus par Pi-Hole par son adresse MAC (ainsi que l'IP et éventuellement le nom d'hôte s'il en a connaissance). Il faut également choisir à quel groupe le périphérique appartient dans la cellule Group Management, et penser à appuyer sur Apply une fois le choix effectué :

pihole_panel_groups_management-2.thumb.png.f50ffb8e11277dd41f70fc7ed996c03a.png

Dans Domains, je peux ajouter des domaines (liste blanche ou noire) manuellement (avec ou sans wildcard), ici j'utilise une chaîne regex pour autoriser certaines publicités pour un jeu installé sur mon smartphone :

pihole_panel_groups_management-3.thumb.png.fe4a7c544eb9e0c470e87020f290c858.png

Dans le dernier sous-menu Adlists, je n'ai rien touché aux listes, j'ai laissé celles par défaut pour tous mes périphériques :

pihole_panel_groups_management-4.thumb.png.20dac8753be113cb2254aa66514e232e.png

11. Commandes utiles

Pour redémarrer le conteneur :

docker restart pi-hole

pi-hole est le nom donné au conteneur.

____________________________

Pour l'arrêter et le supprimer :

docker-compose -f /volume1/docker/pi-hole/docker-compose.yml down

L'argument -f permettant de spécifier un fichier en dehors du dossier courant.

____________________________

Pour supprimer toutes les données de Pi-Hole (pour refaire une installation propre par exemple), il suffit de supprimer les dossiers dans le dossier du conteneur :

cd /volume1/docker/pi-hole
docker-compose down
rm -ri etc-pihole etc-dnsmasq.d

____________________________

Pour le mettre à jour et le reconstruire :

cd /volume1/docker/pi-hole
docker-compose pull
docker-compose up -d

MàJ : 20/01/2023

pihole_propriete_utilisateur_dedie.PNG

Modifié par .Shad.
Refonte du tutoriel
Lien vers le commentaire
Partager sur d’autres sites

  • .Shad. a modifié le titre en [TUTO] [Docker - macvlan] Pi-hole

Bonjour et merci infiniment pour ce super tutoriel tres clair qui va probablement me permettre de faire enfin fonctionner correctement mon installation de Pi-hole sur le NAS en créant l'interface virtuelle.

@.Shad. Un détail, en lisant la documentation de Pi-hole au sujet des variables d'environnement (lien que tu donnes dans le tuto), il semble que les variables 'CONDITIONAL_FORWARDING...' fonctionnent encore mais elles ont été déprécié et remplacé par d'autres.

Lien vers le commentaire
Partager sur d’autres sites

@.Shad.

j'ai juste une remarque : dans l'assignation des adresses MAC, elles ne sont pas tout à fait au hasard : le dernier bit du premier octet doit être positionné à 0, càd un premier octet pair. Sinon c'est refusé.

Bruno78

Lien vers le commentaire
Partager sur d’autres sites

@bruno78

Alors c'est étrange, j'ai un peu triché car en réalité je n'ai pas utilisé cette adresse MAC, mais c'est celle qui apparaissait dans mon impression d'écran. 😛 
Donc si l'interface s'attribue elle-même une adresse MAC, elle peut s'affranchir de cette limitation ?

Modifié par .Shad.
Lien vers le commentaire
Partager sur d’autres sites

Le 06/02/2021 à 19:04, .Shad. a dit :

ip link set dev mac0 address 5E:11:4F:AF:D6:D2

@.Shad., je ne sais pas te répondre si l'adresse est "auto-attribuée", mais là dans ton exemple c'est bon : 5E est bien pair. Après, de mémoire, c'est lorsque je spécifie une adresse MAC dans le docker-compose que j'ai eu ce problème. Et du coup je ne crois pas avoir fait l'essai avec le link.

On trouve quelques références à ce propos : par exemple ip - Why the first octet of a MAC address always end with a binary 0? - Network Engineering Stack Exchange

Lien vers le commentaire
Partager sur d’autres sites

@.Shad. je viens de faire l'essai : 

PAIR (5E) : OK

root@ds918blam:~# ip link add mac1 link ovs_eth0 type macvlan mode bridge
root@ds918blam:~# ip link set dev mac1 address 5E:11:4F:AF:D6:D2
root@ds918blam:~#

IMPAIR (5F) : KO

root@ds918blam:~# ip link add mac1 link ovs_eth0 type macvlan mode bridge
root@ds918blam:~# ip link set dev mac1 address 5F:11:4F:AF:D6:D2
RTNETLINK answers: Cannot assign requested address
root@ds918blam:~#

bruno78

Lien vers le commentaire
Partager sur d’autres sites

@.Shad. Je n'ai suivi que certaines partie (script de création de l'interface virtuelle) car j'ai déjà un docker pihole fonctionnel mais le tutoriel me semble clair.

Je pense à le suivre à partir de zéro quand j'aurais plus de temps car j'ai essayé de modifier certaines variables d'environnement de mon instance Pihole existante (pour le conditional forwarding) mais ensuite le docker Pihole ne parvient plus à démarrer. 

Lien vers le commentaire
Partager sur d’autres sites

@.Shad.

Bonjour et bravo pour ce tuto 🙂

J'ai rencontré un problème lors de docker-compose pull && docker-compose up -d . En effet, le dossier var-logs/lighttpd ne s'est pas créé ainsi que les fichiers access.log et error.log à l'intérieur

image.png.61b73e8702789935a1d60c729135a44f.png

Je les ai créé à la main ne sachant pas le faire avec docker ^^

De plus j'ai vu 2 petites coquilles :

Le 06/02/2021 à 19:04, .Shad. a dit :

En cas d'erreur dans la transcription, il suffit de supprimer le réseau malformé pour recommencer :


docker network rm macvlan-net

Plutôt : docker network rm macvlan-network
 

Le 06/02/2021 à 19:04, .Shad. a dit :

mac0-reload-2.png.a1a64c0eac13e63baffd2e39212a3e67.png

Ici on est dans le dossier /volume1/docker/networks/mac0-interface.sh

 

Tout fonctionne maintenant.

Encore bravo 👏

Lien vers le commentaire
Partager sur d’autres sites

Alors j'ai regardé pour le problème avec le dossier var-logs.
J'ai extrapolé une configuration que j'ai faite chez moi, sauf que là où elle fonctionne sur une Debian, elle ne fonctionne pas sur le NAS.
Cela donnait l'avantage d'avoir les logs rapidement à portée, mais il existe plein d'autres méthodes pour les visualiser, typiquement la commande docker logs, Docker dans DSM, Portainer ou encore directement dans le conteneur.

Je supprime ce montage de volume.

Merci encore @Tordux de ton retour.

Modifié par .Shad.
Lien vers le commentaire
Partager sur d’autres sites

Hooo ! Le beau tuto tout neuf 😄 

Je l'ai lu assez vite en diagonale, mais le peu que j'ai lu me semble clair, comme d'habitude avec tes tutos ^^

Est-ce que tu serais d'accord que je me serve de ton tuto pour en faire une variante pour AdGuard-Home ? Je n'utilise plus Pi-Hole au profit d'AdGuard-Home.
Il faudra cependant que j'applique ton tuto à mon AdGuard-Home qui est actuellement en mode HOST (je ne peux donc pas faire du DNS chiffré). Ça fait un moment que je voulais tenter le macvlan pour AdGuard, mais j'ai jamais pris le temps de m'y pencher dessus, et ton tuto tombe à pic 😛 

Merci en tout cas pour ce super tuto 😉

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Je ne sais pas à quel point c'est réplicable pour Adguard, mais si tu y trouves ton inspiration, n'hésite pas.

Après tu peux toujours pointer vers ce tutoriel concernant la mise en place du réseau macvlan, et traiter la partie configuration d'Adguard uniquement.

Lien vers le commentaire
Partager sur d’autres sites

👋🏻@.Shad.
Je peux faire ça en effet 😉 
À voir, mais dans tous les cas, je te citerais comme étant l'auteur de ce que j'utiliserais 😇

Mais faut tout d'abord que j'essaie de mettre AdGuard en macvlan 😉 

Au fait, elle fait quoi la variable $_ dans la commande suivante ?

 

mkdir -p /volume1/docker/pi-hole && cd $_

J'ai bien une idée de ce que ça fait : ça va dans le dossier précédemment créé, mais trouve pas la doc qui va avec sur le net pour expliquer cette variables.
Je connais un certain nombre :

$* $1 $2 $? $@ $# $0

mais la $_ je la trouve nulle part expliquée.

PS : il manque vraiment des langage dans la balise code... Y aurait pas moyen d'en rajouter ? (Shell, yaml, etc...)

Modifié par MilesTEG1
Lien vers le commentaire
Partager sur d’autres sites

Merci Shad pour le tuto 😻

Malgré la création de l'interface virtuelle je n'arrive pas à me reconnecter sur mon NAS (je suis obligé de repasser sur le DHCP de ma box)

Pourriez-vous m'aider à comprendre ce qui bloque s'il vous plait ?

Réseau macvlan du PiHole (docker network inspect macvlan_pihole) :

[~] # docker network inspect macvlan_pihole
[
    {
        "Name": "macvlan_pihole",
        "Id": "a372a582a1818d27a1c18c2059208468b8a5c5492aba0ff3e3724bf653d22e7e",
        "Created": "2021-02-19T16:39:07.562501074+01:00",
        "Scope": "local",
        "Driver": "macvlan",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24",
                    "IPRange": "192.168.1.101/32",
                    "Gateway": "192.168.1.254"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "55dd144ec9e0326d8588c1e287a5eac7e8778488ac5d51f3aa5f332bde6c32a7": {
                "Name": "pihole",
                "EndpointID": "524a3ca9e7982dc483d9d56bb23fe68118956b09f1c46e24789bc258200dba80",
                "MacAddress": "XXXXXXXXXX", #masqué
                "IPv4Address": "192.168.1.101/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "parent": "eth0"
        },
        "Labels": {}
    }
]

Script utilisé pour créer l'interface virtuelle (adapté du tuto à ma config) :

ip link add mac0 link eth0 type macvlan mode bridge #"eth0" dans mon cas
ip addr add 192.168.1.200/32 dev mac0 #J'ai laissé la même plage que dans le tuto
ip link set dev mac0 address 5E:11:4F:AF:D6:D2 #même adresse mac, n'existe pas sur mon réseau
ip link set mac0 up
ip route add 192.168.1.101/32 dev mac0 #192.1.101/32 est la plage défini lors de la création de mon réseau macvlan (voir ci-dessus)

Si je vérifie, l'interface virtuelle est bien créée :

[~] # ifconfig | grep -A 9 mac0
mac0      Link encap:Ethernet  HWaddr 5E:11:4F:AF:D6:D2
          inet addr:192.168.1.200  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4116 errors:0 dropped:0 overruns:0 frame:0
          TX packets:421 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:798090 (779.3 KiB)  TX bytes:79729 (77.8 KiB)

veth144d8db Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX #masqué
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

Je repasse sur le DHCP du PiHole (en désactivant celui de la box) : OK + reboot de la box

Accès à l'interface web de mon NAS (IP : 192.168.1.86) : KO

Accès web via l'IP de l'interface virtuelle (192.168.1.200) : KO

Check via l'interface web de Pihole : je retrouver tous mes autres équipements mais pas le NAS :(

1.png

 

Merci d'avance à celui ou celle qui voudra bien voler à mon secours 😭

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Il n'y a que depuis le conteneur Pi-hole que tu dois utiliser l'IP de l'interface virtuelle pour accéder au NAS, tous les périphériques autres que l'hôte peuvent y accéder via l'IP habituelle.

Que donne, depuis le NAS, un ping sur l'IP du conteneur 192.168.1.101 ?
Inversement, tu peux tester depuis le conteneur, tu te connectes en SSH sur ton NAS et tu tapes :

docker exec -it pihole ping 192.168.1.86

où pihole est le nom de ton conteur pi-hole.

Autre chose, j'éviterais d'inclure dans la plage de mon serveur DHCP la plage que se réserve le réseau macvlan (dans ton cas une seule IP, mais autant éviter).

Modifié par .Shad.
Lien vers le commentaire
Partager sur d’autres sites

Le 20/02/2021 à 13:57, MilesTEG1 a dit :

Ok merci 🙂

C'est pas si simple que ça en a l'air 😉

Mais purée, fallait la trouver l'explication. Tu as appris ça tout seul ? Ou bien en cours d'info ?

J'ai jamais suivi de cours d'informatique. 🙂

Mon métier n'a rien à voir. 😉

C'était juste que je cherchais comment entrer directement dans un dossier après l'avoir créé, et j'étais tombé sur cette commande ma foi bien utile. 😉

 

Modifié par .Shad.
Lien vers le commentaire
Partager sur d’autres sites

Il y a 19 heures, .Shad. a dit :

Autre chose, j'éviterais d'inclure dans la plage de mon serveur DHCP la plage que se réserve le réseau macvlan (dans ton cas une seule IP, mais autant éviter).

J'ai effectivement remodifié le range jusqu'à 192.168.1.100 hier soir 🙂

----------------------------------------------------------------------------

Il y a 19 heures, .Shad. a dit :

Il n'y a que depuis le conteneur Pi-hole que tu dois utiliser l'IP de l'interface virtuelle pour accéder au NAS, tous les périphériques autres que l'hôte peuvent y accéder via l'IP habituelle.

Justement mes autres périphériques n'arrivent pas à se connecter avec l'IP habituelle (192.168.1.86) 😞

----------------------------------------------------------------------------

Il y a 19 heures, .Shad. a dit :

Que donne, depuis le NAS, un ping sur l'IP du conteneur 192.168.1.101 ?

DHCP de la box : ON, ping : OK (si je passe sur le dhcp pi hole, je n'ai plus accès en SSH au NAS donc .. ^^)

[~] # ping 192.168.1.101
PING 192.168.1.101 (192.168.1.101): 56 data bytes
64 bytes from 192.168.1.101: seq=0 ttl=64 time=2.654 ms
64 bytes from 192.168.1.101: seq=1 ttl=64 time=0.108 ms
64 bytes from 192.168.1.101: seq=2 ttl=64 time=0.095 ms

----------------------------------------------------------------------------

Il y a 19 heures, .Shad. a dit :

Inversement, tu peux tester depuis le conteneur, tu te connectes en SSH sur ton NAS et tu tapes :



docker exec -it pihole ping 192.168.1.86

où pihole est le nom de ton conteur pi-hole.

Mon container s'appelle pihole ça tombe bien : DHCP box : ON, ping KO :

[~] # docker exec -it pihole ping 192.168.1.86
PING 192.168.1.86 (192.168.1.86) 56(84) bytes of data.
From 192.168.1.101 icmp_seq=1 Destination Host Unreachable
From 192.168.1.101 icmp_seq=5 Destination Host Unreachable
From 192.168.1.101 icmp_seq=6 Destination Host Unreachable

Mais si je ping sur le 192.168.1.200 (interface virtuelle), ping : OK (ce qui me semble normal donc)

[~] # docker exec -it pihole ping 192.168.1.200
PING 192.168.1.200 (192.168.1.200) 56(84) bytes of data.
64 bytes from 192.168.1.200: icmp_seq=1 ttl=64 time=0.107 ms
64 bytes from 192.168.1.200: icmp_seq=2 ttl=64 time=0.096 ms
64 bytes from 192.168.1.200: icmp_seq=3 ttl=64 time=0.096 ms

De plus, dans le network overview, je vois bien que PiHole détecte l'interface virtuelle 192.168.1.200, c'est donc mon nas qui ne passe pas par cette IP pour communiquer avec le container PiHole ?

image.thumb.png.4fb4f38805992b21758648b4dabfb595.png

Modifié par MrLiink49
added : ping interface virtuelle
Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.