Visualiser une révision

[Tuto/HowTo] Mettre en place un serveur DNS aux noms de domaines parametrable (Rogue DNS)

voxdemonix : remplacement de Bind9 (named) par PiHold (23 octobre 2018 13:00:09)

**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 5-101-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).

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 recevra les requêtes des clients et les redirigera, ou non, verira récupérer les vrais adresses IP liées aux noms lde serveur DNSdomaine. Ce logiciel écoutera sur l'adresse IP LAN du serveur.
 * [Bind9](https://doc.ubuntu-fr.org/bind9) ([serveur DNS](https://fr.wikipedia.org/wiki/Serveur_DNS)) qui ira récupérer les vrais adresses IP liées aux noms de domaine et les conservera en cache. Ce logiciel écoutera sur 127.0.0.1 ([boucle locale](https://fr.wikipedia.org/wiki/127.0.0.1))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.
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 Bind9DNSChef.
=========================

**Passez en admin**

* sur Raspbian / Ubuntu 

```
sudo su
```

* sur Debian / Ubuntu Minimal 

```
su
```

**Mettez à jours les listes de paquets.**

```
apt-get update
```

**Installez le paquet [bind9](https://doc.ubuntu-fr.org/bind9).**

```
apt-get install -y bind9
```

**Éditez le fichier _/etc/bind/named.conf.options_**

```
nano /etc/bind/named.conf.options
```

**Décommentez les lignes suivantes en enlevant les double slash ( _//_ ) devant chaque ligne.**

```
         forwarders {
                0.0.0.0;
         };
```

**Remplacez _0.0.0.0_ par n'importe quelle adresse de serveur DNS (google (8.8.8.8), FFDN (80.67.169.40), Proximus (195.238.2.21) [etc](http://www.commentcamarche.net/faq/1496-serveurs-dns-des-principaux-fai)). Vous pouvez bien entendu en ajouter plusieurs (fortement conseillé même).
Par exemple :**

```
         forwarders {
                80.67.169.12;           // FFDN         (fr)
                195.238.2.21;           // Proximus     (be)
                80.67.169.40;           // FFDN         (fr)
                195.238.2.22;           // Proximus     (be)
                1.1.1.1;                // CloudFlare   (usa)
                185.233.100.100;        // FFDN         (fr)
                89.234.141.66;          // FFDN         (fr)
                89.234.186.18;          // FFDN         (fr)
                85.214.20.141;          // D.Courage    (de)
                1.0.0.1;                // CloudFlare   (usa)
                8.8.8.8;                // Google       (usa)
                8.8.4.4;                // Google       (usa)
                9.9.9.9;                // Quad9        (usa)
                2a0c:e300::100;         // FFDN-IPv6    (fr)
                2a0c:e300::101;         // FFDN-IPv6    (fr)

         };
```

**Ajoutez les lignes suivantes.**

```
        recursion yes;
        listen-on { 127.0.0.1; };
```

**Entrez _CTRL+X_ pour sauver et quitter.**

**Redémarrez bind9.**

```
systemctl restart bind9 
```

**Il est possible que vous deviez [désactiver dnsmasq de NetworkManager](https://doc.ubuntu-fr.org/dns#utilisation_d_un_serveur_dns_local) si et seulement si il écoute sur la même adresse que bind9. Normalement il n'y a aucun problème de compatibilité : par défaut bind9 (named) écoute sur 127.0.0.1 tandis que dnsmasq écoute sur 127.0.1.1. Vous pouvez utiliser la commande suivante pour checker qui écoute sur quoi :**

```
netstat -ntlp | grep LISTEN
```



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
```

**Lancez et testez dnschef.**

* Sans redirection en IPv6

```
/opt/scripts/dnschef.py --fakedomains helloworld.com --interface 0.0.0.0 --nameservers 127.0.0.1,8.8.4.4 -q
```
 *  _--interface 192.168.1.42_ => l'adresse sur laquelle DNSChef doit écouter.

* Avec redirection aussi en IPv6

```
/opt/scripts/dnschef.py --fakeip 192.168.1.42 --fakeipv6 ::1 --fakedomains helloworld.com --interface 0.0.0.0 --nameservers 127.0.1.1,8.8.4.4 --nameservers ::1,2001:4860:4860:0:0:0:0:8888,2001:4860:4860:0:0:0:0:8844 -q
```

 * _--fakeip 192.168.1.42_ => l'adresse sur laquelle DNSChef doit écouter.
 * _--fakeipv6 ::1_ => si, comme dans l'exemple ici, le serveur DNS se trouve sur la même machine que DNS chef, et que vous avez configuré le serveur DNS pour écouter sur ::1, alors attention a ne pas faire écouter dnschef sur cette même adresse ( ::1 étant l'équivalent IPv6 de 127.0.0.1 chez IPv4).

**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 la machine de DNSChef.**

```
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
```

**Si cela fonctionne bien, vous pouvez passer par un fichier de configuration externe, se 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.

**Pour lancer dnschef avec le fichier de configuration c'est simple :**

```
/opt/scripts/dnschef.py --file /opt/scripts/dnschef.ini -q --interface 192.168.1.42 --nameservers 127.0.0.1,8.8.8.8
```

 *  _--interface 192.168.1.42_ => indiquez l'adresse IP LAN statique de votre serveur


**Si tout fonctionne correctement, adaptez puis ajoutez la commande précédente au démarrage via cron (n'oubliez pas le sudo) ou via _/etc/rc.local_**

* Voici un exemple de cron

```
@reboot         ( sleep 10 ; sudo /opt/scripts/start_DNS_Rogue.bash )
```

* Et un exemple de script

```
#!/bin/bash

/usr/bin/screen -S dnschef -X quit
sleep 2
#iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
#iptables -A PREROUTING -t nat -i eth0 -p udp --dport 53 -j REDIRECT --to-port 53
/usr/bin/screen -d -m -S dnschef /opt/scripts/dnschef.py --file /opt/scripts/config/dnschef.ini --interface 192.168.1.42 --nameservers 127.0.0.1,80.67.169.40,8.8.4.4 -q  #> /dev/null 2>&1
        # --file /opt/scripts/config/dnschef.ini
        # --logfile=/var/log/dnschef.log
```

**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).**


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

**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).

**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).**


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_**


Si vous avez installez l'interface graphique web (WEBUI)

**Éditez le fichier _/etc/lighttpd/lighttpd.conf_**

```
nano /etc/lighttpd/lighttpd.conf
```

**Cherrchez (_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 pasdse administrateur pour l'interface web.**

```
pihole -a -g
```

**À ce stade, vous devez redémarrer la machine.**





Finalisation

Sur votre serveur DNS, activez Pihole

```
pihole enable
```

**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
```


**Vous pouvez utiliser la commande suivante pour checker qui écoute sur quoi :**

```
netstat -ntlp | grep LISTEN
```








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)