Visualiser une révision

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

voxdemonix : révision n°10 (29 août 2018 04:40:46)

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. **Par contre en déplacement, les machines ont tendance à ne pas ré-actualiser leur cache se qui provoque l'incapacité d'accéder aux services le temps du renouvellement du cache.** (très très désagréable sur smartphone)
La consommation machine est très faible et doit pouvoir tenir sur un RPI1 sans problème.

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, vers le serveur DNS. 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)).

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 Bind9.
=======================

**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 quel 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.40;
                195.238.2.21;
                195.238.2.22;
                8.8.8.8;
                8.8.4.4;
         };
```

**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
pip install --upgrade pip
python -m pip install dnslib
python -m pip install 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 --fakeip 192.168.1.42 --fakedomains helloworld.com --interface 0.0.0.0 --nameservers 127.0.0.1,8.8.4.4 -q
```
 *  _--fakeip 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)).



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)