Aller au contenu

Messages recommandés

Posté(e) (modifié)

 

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

 

ATTENTION : Pi-Hole est passé en version 6, les variables d'environnement listées dans ce tutoriel sont caduques.

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

oĂč 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
  • .Shad. a modifiĂ© le titre en [TUTO] [Docker - macvlan] Pi-hole
Posté(e)

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.

Posté(e)

@anorec : Bien vu, j'avais fait la modification sur le Pi-hole de mon serveur Debian, pas sur celui de mon NAS, et je me suis basĂ© sur celui du NAS 😉 
Je vais corriger ça. 🙂 

Posté(e)

@.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

Posté(e) (modifié)

@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.
Posté(e)
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

Posté(e)

@.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

Posté(e)

@.Shad.

Dans le paragraphe Pi-hole + serveur DNS local

Il peut ĂȘtre intĂ©ressant de rappeler/prĂ©ciser que si le serveur DNS se trouve sur l'hote (Synology DNS Server), il faut renseigner l'@IP de l'interface virtuelle dans DNS1. (Si j'ai bien compris!)

Posté(e) (modifié)

Tu as tout Ă  fait raison, je vais ajouter la prĂ©cision. 😉 

EDIT : Le tutoriel te paraüt clair autrement ? je pense que tu es le seul à l'avoir parcouru pour l'instant. 😛 

Modifié par .Shad.
Posté(e)

@.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. 

Posté(e)

@.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 👏

Posté(e)

Merci beaucoup @Tordux de ton retour, bien vu pour les coquilles, je vais corriger ça.

Pour le dossier var-logs je vais regarder, j'ai une petite idée du pourquoi ça pourrait planter, je mettrai la solution ici quand j'aurai trouvé.

Posté(e) (modifié)

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.
Posté(e)

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 😉

Posté(e)

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.

Posté(e) (modifié)

đŸ‘‹đŸ»@.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
Posté(e)

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 😭

Posté(e) (modifié)

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.
Posté(e) (modifié)
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.
Posté(e) (modifié)
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

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.