Pihole

PiHole est une solution qui peut s’installer chez soi, sur un Raspberry Pi ou ailleurs (perso, je l’utilise sous forme de VM).
C’est un serveur DNS local qui permet de bloquer les domaines que nous souhaitons (pub, tracking,…)
Super efficace et simple pour tout les clients du réseau.

La solution est très pratique et efficace

Dashboard PiHole

DNSCrypt

Par défaut, toutes vos requêtes DNS sont envoyées en clair, c’est clairement pas génial.

DNSCrypt est un service pour augmenter la sécurité et la confidentialité de vos requêtes DNS.
L’objectif est d’éviter les attaques de DNS spoofing et empêcher que votre FAI sache quels sites vous visitez.

Concrètement, on l’installe le service sur une machine de notre réseau local (docker, VM, routeur,…) et il va répondre/transférer nos requêtes DNS de façon sécurisée. Il agit comme un proxy.

Il existe d’autres technologies plus ou moins équivalentes (DoH, DoT, DNSSEC,…)
Mon choix s’est arrêté sur DNSCrypt qui, selon moi, répond le mieux à la problématique de la confidentialité.

Je vous invite vivement à consulter l’article de Malekal sur le sujet: https://www.malekal.com/dnssec-dns-over-tls-ou-https-dot-et-doh-et-dnscrypt-les-differences/

PiHole + DNSCrypt 🥰

L’objectif ici est de mettre ces deux solutions en route ensemble.

Voici la façon dont les requêtes vont être acheminées:
Clients LAN -> Pihole:53 (Pihole) -> Pihole:5300 (DNSCrypt) ==> Serveurs DNSCrypt (internet)

Installation

J’ai créé une VM sur laquelle j’ai installé le package PiHole, ceci dit, on peut être également l’installer ailleurs, sur un raspberry pi par exemple.

Pour installer PiHole, je vous redirige vers la doc officielle (suivant votre plateforme et matériel)

Pour l’installation de DNSCrypt, il faut se connecter en ligne de commande sur le système et procéder à l’installation, j’ai installé le service DNSCrypt via ce guide.

Configuration DNSCrypt

On l’a vu plus haut, le service DNSCrypt se configure en ligne de commande, ici on va devoir éditer le fichier dnscrypt-proxy.toml

Voici les changements que j’ai fait sur le fichier:

listen_addresses = ['127.0.0.1:5300'] # On modifie le port 53 en 5300 (Pour ne pas overlapper le port de Pihole)
...
max_clients = 25 # A priori, il n'y a que Pihole qui ira interroger DNSCrypt, donc pas besoin de 250 clients
...
doh_servers = false #Je ne veux pas utiliser les serveurs DNS over HTTPS
...
require_dnssec = true
require_nolog = true #Je veux des serveurs DNS qui ont DNSSEC et qui déclarent ne pas stocker de logs

Au niveau des sources, j’ai laissé les 2 par défaut (Public-resolvers & Relays v3) et j’ai également ajouté OpenNIC:

## Opennic
[sources.'opennic']
urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/opennic.md', 'https://download.dnscrypt.info/resolvers-list/v3/opennic.md']
minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'
cache_file = 'opennic.md'
prefix = 'opennic-'

Configuration PiHole

Dans PiHole, on va donc référencer notre service DNSCrypt comme étant notre DNS en amont.
J’ai installé le service sur la meme machine que PiHole. On va le voir ci dessous, DNSCrypt écoutera sur le port 5300.

Paramètres Serveur DNS sur PiHole

Le cas DNSSEC

Les développeurs de PiHole recommandent de ne pas activer l’option « Use DNSSEC » dans PiHole, si il est derrière un proxy DNSCrypt. (Source)

En effet ça m’a généré des instabilité et des temps de réponses horribles.
Cette option fait doublon dans notre cas, on peut la désactiver sans soucis. Et ce n’est pas un problème au niveau de la sécurité étant donné que c’est DNSCrypt qui se chargera de cette partie (DNSSEC) juste derrière.

En revanche, vous pouvez activer la fonction proxy-dnssec dans dnsmasq (utilisé par pihole)-via la ligne de commande suivante: « proxy-dnssec » >> /etc/dnsmasq.d/02-pihole-custom.conf
Cela permet de remonter les informations DNSSEC du DNSCrypt vers PiHole, mais ça ne fonctionne pas encore dans la version que j’utilise.

Option DNSSEC désactivé sur PiHole

Conclusion

Voila, les systèmes sont en place, je vous invite néanmoins à parcourir les autres paramètres pour répondre un maximum a vos besoins.

En cas de problèmes, l’outil nslookup est votre ami et consultez les logs de PiHole et DNSCrypt

Voici comment utiliser la solution PiHole (bloqueur de pub via DNS) avec Pfsense (Firewall).
On pourra donc proposer les avantages de PiHole aux clients de notre réseau tout en gardant la possibilité de résoudre les noms locaux.

Configuration PiHole

Dans mon cas, j’utilise PiHole uniquement pour son role de DNS, il sera l’unique DNS de mon réseau.
Je n’utilise donc pas les fonctions DHCP sur le PiHole, mais bien sur le PfSense.

La première étape est donc d’installer PiHole sur son réseau local (sur un raspberry pi, image docker, VM,…), je ne m’attarde pas.
Nous pouvons ensuite nous connecter sur l’interface Web. La seule chose à configurer est le conditional forwarding pour permettre de résoudre les noms des clients locaux.

En gros on va dire, « pour résoudre les IPs qui sont dans tel réseau, va plutôt interroger ce serveur DNS spécifique » (ça sera notre pfsense). Pour cela on va utiliser l’option conditional forwarder:

Conditional Forwarding sur PiHole

Ici j’ai configuré cette option de façon qu’il interroge mon firewall (pfsense – 192.168.1.1) pour résoudre les IPs dans le réseau 192.168.1.0/24.

NB: Si vous voulez mettre plusieurs entrées (Si vous avez plusieurs réseaux locaux par exemple), il est possible d’en ajouter mais en modifiant le fichier de config de PiHole en ligne de commande.

Configuration PfSense

DNS Settings

On va configurer PfSense pour qu’il utilise PiHole. (Tout le monde à la meme enseigne ^^)
Dans configuration générale, on renseigne l’ip de notre PiHole et on lui dit de ne pas contacter le serveur DNS en local.

PfSense – Configuration générale

DHCP

Sous Services -> Serveur DHCP vous pouvez modifier pour chaque réseau le champ DNS et renseigner l’ip du serveur PiHole

PfSense – Serveur DHCP -> Champ DNS

Ainsi on indique aux clients de notre LAN d’utiliser PiHole comme DNS.

DNS

Le service DNS Forwarder n’est plus utile donc on peut le désactiver sur le Pfsense.

Le service DNS Resolver quant à lui va nous permettre de résoudre les noms des périphériques connectés sur le LAN (il ne servira à rien d’autre). Il faut donc l’activer et cocher les 3 cases pour résoudres les IPs de nos clients qui ont contactés le DHCP

PfSense – DNS Resolver

Rule

Au niveau des règles, je vous conseille de bloquer les clients à contacter d’autres DNS que notre PiHole (mais quand meme laisser PiHole contacter le port 53/UDP vers internet).

Si vous avez plusieurs réseaux LAN sur votre PfSense, pensez à autoriser les clients à contacter PiHole.

A Savoir

Si vous n’aimez pas PiHole, il est aussi possible d’intégrer directement cette fonctionnalité avec package dans PfSense (PfBlocker-ng). ça fait le meme boulot, mais l’UI de PiHole est plus sympathique et flexible. Cela nous permet également de mettre en place d’autres fonctions (comme DNSCrypt).