# [Debian] Serveur DNS

## Introduction

Un serveur DNS permet la résolution de noms de domaine en adresse IP et inversement sur un réseau.

Dans ce tutoriel nous utiliserons la solution **Bind9** sur une Debian 11 ayant comme adresse IP 10.100.0.86.

Le domaine configuré sera **elie.local**.

[![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2023-09/scaled-1680-/01Eimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2023-09/01Eimage.png)

## Installation

- Installez le paquet bind :

```bash
apt update && apt install -y bind9 
```

- Au cas où un fichier vous souhaiteriez restaurer les fichiers de configuration par défaut, je vous recommande de faire une sauvegarde de ces différents fichiers :

```bash
cp /etc/bind/named.conf /etc/bind/named.conf.bak
```

```bash
cp /etc/bind/named.conf.options /etc/bind/named.conf.options.bak
```

```bash
cp /etc/bind/named.conf.local /etc/bind/named.conf.local.bak
```

## Configuration de forwarding

- Éditez le fichier **/etc/bind/named.conf.options** de sorte à obtenir cette configuration (à adapter) :

```bash
options{
    directory "/var/cache/bind";

    recursion yes;

    allow-query { 10.100.0.0/24; 127.0.0.1; };

    forwarders {
        1.1.1.1;
        8.8.8.8;
    };

    forward only;

    dnssec-validation auto;
    auth-nxdomain no;
    listen-on-v6 { any; };
};
```

<p class="callout info">Vous pouvez choisir les DNS primaires et secondaires vers lesquels la redirection va se produire dans les **forwarders**, ici j'utilise celui de Cloudflare en primaire et celui de Google en secondaire.</p>

#### Vérifier les configurations

Vous pouvez vérifier la configuration à l'aide de la commande suivante :

```bash
named-checkconf
```

#### Redémarrer le service DNS

Une fois que vous avez vérifié que votre configuration DNS est bonne, vous pouvez redémarrer le service named pour prendre en compte les changements :

```bash
systemctl restart named
```


## Configuration de zone (classique)

- Éditez le fichier **/etc/bind/named.conf.local** pour configurer la zone DNS et ajoutez-y ce contenu (à adapter) :

```bash
// Configuration DNS
zone "elie.local" IN {
type master;
file "db.elie.local";
allow-update { none; };
};

// Configuration Reverse DNS sur un réseau 10.100.0.X
zone "0.100.10.in-addr.arpa" IN {
type master;
file "rev.elie.local";
allow-update { none; };
};
```

#### Ajout des entrées DNS

À chaque fois que vous voudrez ajouter une entrée DNS, il faudra écrire l'entrée le fichier de configuration DNS et dans le fichier de configuration du reverse DNS.

- Pour commencer, déplacez-vous dans le répertoire **/var/cache/bind/** et créez votre fichier de configuration des enrtées DNS, ici c'est le fichier **db.elie.local** et ajoutez le contenu suivant (à adapter) :

```bash
$TTL 86400
@ IN SOA debian-dns.elie.local. root.elie.local. (
2022111401
1w
1d
4w
1w )
@ IN NS debian-dns.elie.local.
debian-dns IN A 10.100.0.86

; SET DNS RECORDS
mail IN A 10.100.0.200
debian-client-1 IN A 10.100.0.201
```

Ici, le serveur DNS ayant pour adresse IP **10.100.0.86** aura le nom **debian-dns.elie.local** qui est enregistré comme entrée de type A.

On peut voir en dessous qu'un serveur de messagerie et un poste client sont aussi enregistrés dans la base sous leurs noms respectifs (à vous de mettre vos propres entrées).

- Ensuite, toujours dans le répertoire **/var/cache/bind/** il faut créer le fichier de configuration du reverse DNS, ici **rev.elie.local** :

```bash
$TTL 86400
@ IN SOA debian-dns.elie.local. root.elie.local. (
2022111401
1w
1d
4w
1w )
@ IN NS debian-dns.elie.local.
86 IN PTR debian-dns.elie.local

; SET DNS RECORDS
200 IN PTR mail.elie.local
201 IN PTR debian-client-1.elie.local
```

On s'aperçoit que le contenu est similaire à la configuration du DNS avec un différence majeure au niveau des entrées DNS qui sont de type PTR et où on indique la valeur du dernier octet de l'adresse IP pointant vers le nom correspondant.

Par exemple on reconnait l'entrée du serveur de messagerie "***200 IN PTR mail.elie.local***" où **200** correspond au dernier octet de son adresse c'est à dire 10.100.0.**200**.

#### Modification des droits des fichiers

Afin que Bind puisse exploiter vos fichiers de configuration, les bons droits doivent être mis dessus :

```bash
chgrp bind /var/cache/bind/*
```

```bash
chmod 664 /var/cache/bind/*
```

#### Modification de /etc/resolv.conf

Il faut indiquer au serveur que le serveur DNS correspond désormais à lui-même dans le fichier **/etc/resolv.conf** :

```bash
echo "nameserver 10.100.0.86" > /etc/resolv.conf
```

#### Vérifier les configurations

Voici les deux commandes "magiques" qui permettent de vérifier que les configurations sont correctes :

```bash
named-checkconf
```

L'option -z permet d'être beaucoup plus verbeux quant aux erreurs que vous pouvez rencontrer :

```bash
named-checkconf -z
```

#### Redémarrer le service DNS

Une fois que vous avez vérifié que votre configuration DNS est bonne, vous pouvez redémarrer le service named pour prendre en compte les changements :

```bash
systemctl restart named
```

## Configuration de vues (avancé)

Cette approche est particulière puisque contrairement à la configuration en mode zone, nous pourrons définir des entrées et des traitements différents selon **l'interface** par laquelle la requête DNS va entrer.

Le domaine sera toujours **elie.local** .

Pour cet exemple nous aurons un lab avec <span style="text-decoration: underline;">2 réseaux</span> :

<table border="1" id="bkmrk-r%C3%A9seaux-adresse-r%C3%A9se" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td class="align-center">**Réseaux**</td><td class="align-center">**Adresse réseau**</td></tr><tr><td class="align-center">LAN</td><td class="align-center">192.168.0.0/24</td></tr><tr><td class="align-center">DMZ</td><td class="align-center">10.0.0.0/24</td></tr></tbody></table>

Ainsi que <span style="text-decoration: underline;">3 machines</span> :

<table border="1" id="bkmrk-machine-adresse-inte" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 33.3745%;"></col><col style="width: 33.3745%;"></col><col style="width: 16.6873%;"></col><col style="width: 16.6873%;"></col></colgroup><tbody><tr><td class="align-center">**Machine**</td><td class="align-center">**Adresse interface LAN**</td><td class="align-center">**Adresse interface DMZ**</td><td class="align-center">**Rôle**</td></tr><tr><td class="align-center">vm-deb01</td><td class="align-center">192.168.0.253</td><td class="align-center">10.0.0.253</td><td class="align-center">Serveur DNS</td></tr><tr><td class="align-center">vm-deb02</td><td class="align-center">192.168.0.1</td><td class="align-center">/</td><td class="align-center">Client LAN</td></tr><tr><td class="align-center">vm-deb03</td><td class="align-center">/</td><td class="align-center">10.0.0.1</td><td class="align-center">Serveur web</td></tr></tbody></table>

- L'ensemble des configurations se fera dans le dossier **/etc/bind** cette fois :

```bash
cd /etc/bind/
```

- Voici à quoi doit ressembler le fichier **named.conf.options** :

```
acl myclients { 127.0.0.0/8; 192.168.0.0/24; 10.0.0.0/24; };

options {
        directory "/var/cache/bind";

        forwarders { 1.1.1.1; };

        dnssec-validation auto;

        forward only;

        listen-on { 127.0.0.1; 192.168.0.253; 10.0.0.253; };

        allow-transfer { none; };

        allow-query { myclients; };
};
```

- Le fichier **named.conf.zones** :

```
zone "elie.local" {
        type master;
        file "/etc/bind/localzones/db.elie.local";
};

zone "elie.local" {
        type master;
        file "/etc/bind/localzones/db.elie.local.external";
};
```

- Le fichier **common-zones.conf** :

```
zone "elie.local" {
        type master;
        file "/etc/bind/localzones/db.elie.local";
};

zone "elie.local" {
        type master;
        file "/etc/bind/localzones/db.elie.local.external";
};
```

- Le fichier **named.conf** :

```
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
#include "/etc/bind/named.conf.default-zones";

view "local" {
        match-clients { 192.168.0.0/24; };
        allow-query { any; };
        recursion no;
        zone "elie.local" {
                type master;
                file "/etc/bind/localzones/db.elie.local";
        };
        include "/etc/bind/named.conf.default-zones";
};

view "external" {
        match-clients { 10.0.0.0/24; };
        allow-query { any; };
        recursion no;
        zone "elie.local" {
                type master;
                file "/etc/bind/localzones/db.elie.local.external";
        };
        include "/etc/bind/named.conf.default-zones";
};
```

- Le fichier **named.conf.internal-zones** :

```
view "internal" {
        # match all except targets defined on [match-clients] on internal section
        match-clients { 127.0.0.0/8; 192.168.0.0/24 };
        # allow all queries
        allow-query { any; };
        # not allow recursive queries
        recursion no;
        zone "elie.local" {
                type master;
                file "/etc/bind/localzones/db.elie.local";
        };
        include "/etc/bind/named.conf.default-zones";
};
```

- Le fichier **named.conf.external-zones** :

```
view "external" {
        # match all except targets defined on [match-clients] on internal section
        match-clients { 10.0.0.0/24; };
        # allow all queries
        allow-query { any; };
        # not allow recursive queries
        recursion no;
        zone "elie.local" {
                type master;
                file "/etc/bind/localzones/db.elie.local.external";
        };
        include "/etc/bind/named.conf.default-zones";
};
```

- Créer un dossier **localzones** et se déplacer dedans :

```
mkdir localzone && cd localzone
```

- Créer le fichier de la zone interne soit **db.elie.local** :

```
$TTL 86400
@ IN SOA vm-deb01.elie.local. root.elie.local. (
        2022111401
        1w
        1d
        4w
        1w
)
@ IN NS vm-deb01.elie.local.
vm-deb01 IN A 192.168.0.253

; SET DNS RECORDS
vm-deb02 IN A 192.168.0.1
```

- Créer le fichier de la vue externe soit **db.elie.local.externa**l :

```
$TTL 86400
@ IN SOA vm-deb01.elie.local. root.elie.local. (
        2022111402
        1w
        1d
        4w
        1w
)
@ IN NS vm-deb01.elie.local.
vm-deb01 IN A 10.0.0.253

; SET DNS RECORDS
web-srv IN A 10.0.0.1
```

- Créer le fichier du reverse DNS de la <span style="text-decoration: underline;">vue interne</span> **rev.elie.local** :

```
$TTL 86400
@ IN SOA vm-deb01.elie.local. root.elie.local. (
        2022111401
        1w
        1d
        4w
        1w
)
@ IN NS vm-deb01.elie.local.
253 IN PTR vm-deb01.elie.local

; SET DNS RECORDS
1 IN PTR vm-deb02.elie.local
```

- Créer le fichier du reverse DNS de la <span style="text-decoration: underline;">vue externe</span> **rev.elie.local** :

```
$TTL 86400
@ IN SOA vm-deb01.elie.local. root.elie.local. (
        2022111401
        1w
        1d
        4w
        1w
)
@ IN NS vm-deb01.elie.local.
253 IN PTR vm-deb01.elie.local

; SET DNS RECORDS
1 IN PTR web-srv.elie.local
```