**NDLR : tuto en cours de refonte (remplacement de bind9 par [PiHole](https://pi-hole.net/)). Certaines parties du tuto pourraient être cassé durant la durée de rédaction.**
![Screenshot-2018-10-23-Pi-Hole-WEBUI-Dashboard-Admin](https://image.ibb.co/iGHEmV/Screenshot-2018-10-23-Pi-Hole-WEBUI-Dashboard-Admin.png)
Préambule
=========
Ce tutoriel va vous permettre de remettre en place un semblant de [HairPinning](https://fr.wikipedia.org/wiki/Hairpinning), ce qui pourra s'avérer salvateur pour les services auto-hébergés derrière des routeurs bridés.
La méthode qu'on va mettre en place ici vous apportera même un belle feature : le blocage d'une partie de la publicité sur tout votre réseau.
**Par contre en déplacement, les machines peuvent parfois mettre un peu de temps (généralement 1-5 min max) pour renouveller leur cache DNS. En attendant ce renouvellement, les services ne sont de facto pas joignable.**
La consommation machine est très faible et doit pouvoir tenir sur un RPI1 sans problème. Il n'y a que l'interface WEB qui a tendance a surconsommer le pauvre navigateur du client (testé sur firefox-ubuntu).
NDLR : J'ai [proposé l'ajout de la feature Rogue DNS directement à PiHole](https://discourse.pi-hole.net/t/add-rogue-dns-feature/13878) afin de ne plus avoir besoin de DNSChef. Peut-être que DNSChef ne sera plus nécessaire dans le futur.
Introduction
============
Le [serveur DNS](https://fr.wikipedia.org/wiki/Serveur_DNS) est un [serveur](https://fr.wikipedia.org/wiki/Serveur_informatique) qui permet aux [clients d'un réseau informatique](https://fr.wikipedia.org/wiki/Client_%28informatique%29) de transformer un [nom de domaine](https://fr.wikipedia.org/wiki/Nom_de_domaine) du type www.helloworld.com en [adresse IP](https://fr.wikipedia.org/wiki/Adresse_ip), permettant ainsi aux machines de communiquer.
Comme les logiciels de serveur DNS (comme Bind9) ne permettent pas de modifier l'adresse IP attribuée à un nom de domaine, nous allons donc ici utiliser deux logiciels :
* [DNSChef](http://thesprawl.org/projects/dnschef/) ([rogue DNS](https://en.wikipedia.org/wiki/DNS_hijacking#Rogue_DNS_server)) qui ira récupérer les vrais adresses IP liées aux noms de domaine. Ce logiciel écoutera sur 127.0.2.1 ([boucle locale](https://fr.wikipedia.org/wiki/127.0.0.1)).
* [PiHole](https://pi-hole.net/) ([serveur DNS](https://fr.wikipedia.org/wiki/Serveur_DNS)) qui recevra les requêtes des clients et les redirigera, ou non, vers le serveur DNS, ou utilisera son propre cache. Ce logiciel écoutera sur l'adresse IP LAN du serveur.
Une fois ce serveur mis en place, vous pouvez au choix :
* configurer votre routeur pour qu'il utilise ce serveur DNS (le routeur pouvant servir de cache DNS)
* configurer votre routeur pour que les clients utilisent ce serveur DNS en lieu et place de celui du routeur.
Nous allons ici choisir la deuxième méthode : le DNS primaire (principale) utilisé par les clients sera notre propre serveur, tandis que le DNS secondaire (de secours) sera le routeur lui-même (ou un second serveur DNS maison).
Dans le tutoriel nous considérerons que notre serveur imaginaire a comme adresse IP LAN 192.168.1.42 et tourne sous ubuntu 16+.
Mise en place de DNSChef.
=========================
**Passez en admin**
* sur Raspbian / Ubuntu
```
sudo su
```
* sur Debian / Ubuntu Minimal
```
su
```
**Installez les pré-requis.**
```
apt-get install python-pip screen
pip install --upgrade pip
python -m pip install dnslib IPy
```
**Rendez-vous dans le dossier où enregistrer le script de dnschef, ici on choisit _/opt/scripts_**
```
cd /opt/scripts
```
**Téléchargez [dnschef](http://thesprawl.org/projects/dnschef) et rendez le exécutable.**
```
wget https://raw.githubusercontent.com/iphelix/dnschef/master/dnschef.py
chmod +x /opt/scripts/dnschef.py
```
**Maintenant, on va préparer un fichier de configuration externe, qui permettra de rediriger des noms de domaines vers des adresses IP spécifiques.**
```
nano /opt/scripts/config/dnschef.ini
```
**Ajoutez dedans les noms de domaines que vous souhaitez filtrer et vers quelle IP il faut rediriger les clients.
Voici un exemple ([A] concerna la section [IPv4](https://fr.wikipedia.org/wiki/Ipv4) tandis que [AAAA] concerne la section [IPv6](https://fr.wikipedia.org/wiki/Ipv6), plus d'infos ici : [External definitions file](http://thesprawl.org/projects/dnschef/#external-definitions-file)):**
```
[A]
*.google.com=192.0.2.1
thesprawl.org=192.0.2.2
*.google-analytics.*=192.168.42.42
[AAAA]
*.google.com=2001:4860:4860:0:0:0:0:8888
thesprawl.org=2001:4860:4860:0:0:0:0:8844
*.wordpress.*=2001:4860:4860:0:0:0:0:8888
```
* Une fois terminé, tapez _CTRL+X_ pour sauver et quitter.
**Éditez le planificateur de tâche (cron) de root**
_ndlr : vérifier si, par sécurité, on ne peut se passer de root_
```
crontab -e
```
**Ajoutez la commande suivante au démarrage via cron (n'oubliez pas le sudo)**
```
@reboot ( sleep 10 ; sudo /opt/scripts/start_DNS_Rogue.bash )
```
**Créez et éditez notre fichier de lancement.**
```
touch /opt/scripts/start_DNS_Rogue.bash
chmod +x /opt/scripts/start_DNS_Rogue.bash
nano /opt/scripts/start_DNS_Rogue.bash
```
**Et ajoutez le script script**
```
#!/bin/bash
/usr/bin/screen -S dnschef -X quit
sleep 1
/usr/bin/screen -d -m -S dnschef /opt/scripts/dnschef.py --file /opt/scripts/config/dnschef.ini --interface 127.0.2.1 --nameservers 80.67.169.12,195.238.2.21,80.67.169.40,195.238.2.22,1.1.1.1,185.233.100.100,89.234.141.66,89.234.186.18,85.214.20.141,1.0.0.1,8.8.8.8,8.8.4.4,9.9.9.9 --nameservers 2a0c:e300::100,2a0c:e300::101,2001:4860:4860:0:0:0:0:8888,2001:4860:4860:0:0:0:0:8844 -q
# --file /opt/scripts/config/dnschef.ini
# --logfile=/var/log/dnschef.log
```
* Note : si vous devez lancer deux fois l'instance de DNSChef (par exemple pour avoir un DNS pour votre LAN et un pour votre VPN), pensez à donner des noms différents aux fenêtres [screen](https://help.ubuntu.com/community/Screen).
Quelques paramètres de dnschef
------------------------------
#### --interface
```
--interface 0.0.0.0
```
```
--interface 192.168.1.42
```
```
--interface ::
```
* Permet de spécifier l'adresse sur laquelle écouter. Par défaut uniquement 127.0.0.1, pour écouter sur toutes les adresses [IPv4](https://fr.wikipedia.org/wiki/Ipv4) utilisez --interface 0.0.0.0 ou pour écouter sur toutes les adresses [IPv6](https://fr.wikipedia.org/wiki/Ipv6) utilisez --interface ::
#### --nameservers
```
--nameservers 8.8.8.8
```
```
--nameservers 2001:4860:4860:0:0:0:0:8888,2001:4860:4860::8844
```
```
--nameservers 80.67.169.40,195.238.2.21,195.238.2.22,8.8.8.8,8.8.4.4
```
* Permet de spécifier une liste de nom de domaines. (une [liste fournie ici](https://www.commentcamarche.com/faq/1496-serveurs-dns-des-principaux-fai#belgacom))
Par défaut dnschef utilise 8.8.8.8 ([google](https://developers.google.com/speed/public-dns/docs/using?csw=1)).
Mise en place de PiHole.
=======================
* Note : vous avez intérêt à avoir déjà fixé votre IP LAN ;)
**Passez en admin**
* sur Raspbian / Ubuntu
```
sudo su
```
* sur Debian / Ubuntu Minimal
```
su
```
**Installez [PiHole](https://pi-hole.net/).**
```
curl -sSL https://install.pi-hole.net | bash
```
* Si vous faites une erreur, la commande suivante vous permettre de relancer l'installation ou la reconfiguration :
```
pihole -r
```
**Comme serveur DNS, choisissez _Custom_ puis indiquez _127.0.2.1_. Vous pouvez, mais n'êtes pas obligé, installer la WEBUI ou encore choisir ou non d'enregistrer les logs sans impacte sur votre installation finale.**
**Si vous avez installez l'interface graphique web (WEBUI)**
* **Éditez le fichier _/etc/lighttpd/lighttpd.conf_**
```
nano /etc/lighttpd/lighttpd.conf
```
* **Cherchez (_CTRL+W_) "port" et définissez le port HTTP que vous souhaitez utiliser. Par exemple**
```
server.port = 88
```
* **Adaptez et ajoutez la ligne suivante afin de fixer l'adresse IP que le serveur web peut écouter (afin d'éviter certaines attaques).**
```
server.bind = "192.168.1.42"
```
* **Générez votre mot de passe administrateur pour l'interface web.**
```
pihole -a -g
```
**À ce stade, vous devez redémarrer la machine.**
Finalisation
============
**Sur votre serveur DNS, activez Pihole**
_ndlr : s'active seul normalement, sauf s'il y a eu un problème, pas forcément bloquant, lors de l'installation (par exemple port 80 ou 53 déjà utilisé par un autre logiciel)_
```
pihole enable
```
**Vous pouvez utiliser la commande suivante pour checker quel logiciel écoute sur quelle IP/port. :**
```
netstat -ntlp | grep LISTEN
```
**Sur une machine cliente, testez la commande suivante en spécifiant un des noms de domaines que vous avez indiquez a DNSChef. Remplacez _192.168.1.42_ par l'adresse IP Lan de votre nouveau serveur DNS.**
```
host -t A www.helloworld.com 192.168.1.42
```
* La commande doit vous retourner quelque chose du type :
```
└─ $ ▶ host -t A www.helloworld.com 192.168.1.42
Using domain server:
Name: 192.168.1.42
Address: 192.168.1.42#53
Aliases:
www.helloworld.com has address 192.168.1.42
```
**Configurez ensuite votre routeur pour que les clients utilisent le serveur DNS que nous venons d'installer. Voici un tuto pour [la BBOX2](https://linuxfr.org/wiki/tuto-howto-configurer-la-bbox2-proximus-changer-les-dns-utilises-par-les-clients-du-lan).**
Farm Link
=========
* [[Tuto/HowTo] Mettre en place un serveur DNS aux noms de domaines parametrable (Rogue DNS)](https://www.0rion.netlib.re/forum4/viewtopic.php?f=79&t=809) (article d'origine)
* [ubuntu-fr - DNS - Système des noms de domaine](https://doc.ubuntu-fr.org/dns)
* [Youtube - Monsieur Bidouille - Le laisser passer A38 d'Internet (DNS) - système de nom de domaines - part 1](https://www.youtube.com/watch?v=xhP_guPY1CM)
* [[Tuto/HowTo] configurer la BBOX2 (proximus) - Changer les DNS utilisés par les clients du LAN](https://linuxfr.org/wiki/tuto-howto-configurer-la-bbox2-proximus-changer-les-dns-utilises-par-les-clients-du-lan)