Préambule
=========
Ce tutoriel va vous permettre de remettre en place un [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 temporairement.** (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;
};
```
**Adaptez puis ajoutez les lignes suivantes.**
```
recursion yes;
listen-on { 192.168.1.42; };
```
**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 ; /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)