# Serveur DNS récursif avec Unbound

## Objectif

Mettre en place un serveur DNS récursif avec **Unbound** permettant :

- la résolution récursive des domaines Internet sans utiliser de DNS public comme résolveur intermédiaire ;
- la mise en cache des réponses DNS ;
- la résolution de noms DNS internes ;
- l'utilisation depuis plusieurs réseaux IPv4 ;
- le support d'IPv6 ;
- le contrôle des réseaux autorisés à utiliser le resolver.

---

## 1. Fichier de configuration principal

La configuration Unbound est organisée dans :

```text
/etc/unbound/unbound.conf

```

Les configurations supplémentaires peuvent être placées dans :

```text
/etc/unbound/unbound.conf.d/

```

Par exemple :

```text
/etc/unbound/unbound.conf.d/local.conf

```

Le fichier `unbound.conf` charge généralement les fichiers présents dans `unbound.conf.d`.

---

# 2. Configuration réseau

Dans :

```text
/etc/unbound/unbound.conf.d/local.conf

```

Ajouter ou adapter la section `server:` :

```conf
server:
    verbosity: 0

    # Écoute IPv4
    interface: 0.0.0.0

    # Écoute IPv6
    interface: ::0

    # Réseaux IPv4 autorisés
    access-control: 127.0.0.0/8 allow
    access-control: 192.168.10.0/24 allow
    access-control: 10.20.0.0/24 allow

    # Réseaux IPv6 autorisés
    access-control: ::1 allow
    access-control: fd00::/8 allow

    # Protocoles
    do-ip4: yes
    do-ip6: yes

    # Ne privilégie pas IPv6 pour les communications sortantes
    prefer-ip6: no

```

### Écoute IPv4

```conf
interface: 0.0.0.0

```

Unbound écoute sur toutes les interfaces IPv4 disponibles.

### Écoute IPv6

```conf
interface: ::0

```

Unbound écoute sur les interfaces IPv6 disponibles.

### Contrôle d'accès

Les directives `access-control` déterminent quels réseaux peuvent interroger le serveur DNS.

Exemple :

```conf
access-control: 192.168.10.0/24 allow

```

autorise les clients du réseau `192.168.10.0/24`.

Pour IPv6, le préfixe doit être adapté au réseau réellement utilisé.

Exemple avec un réseau ULA :

```conf
access-control: fd00::/8 allow

```

Il est préférable d'utiliser le préfixe IPv6 réel du réseau plutôt qu'une plage plus large que nécessaire.

---

# 3. Support IPv4 et IPv6

Les deux protocoles sont activés avec :

```conf
do-ip4: yes
do-ip6: yes

```

Cela concerne les communications d'Unbound avec les autres serveurs DNS.

L'écoute des clients est configurée séparément avec :

```conf
interface: 0.0.0.0
interface: ::0

```

Il faut donc distinguer :

- `do-ip6` → permet à Unbound d'utiliser IPv6 ;
- `interface: ::0` → permet aux clients IPv6 de contacter Unbound.

---

# 4. Résolution DNS locale

Unbound peut également gérer une zone locale pour résoudre des noms internes.

Dans :

```text
/etc/unbound/unbound.conf.d/local.conf

```

Déclarer la zone :

```conf
server:
    local-zone: "lan." static

```

Puis ajouter les enregistrements avec `local-data`.

Exemple générique :

```conf
server:
    local-zone: "lan." static

    local-data: "serveur.lan. IN A 192.168.10.10"
    local-data: "nas.lan. IN A 192.168.10.20"
    local-data: "proxy.lan. IN A 192.168.10.30"

```

Un enregistrement IPv6 peut être ajouté avec `AAAA` :

```conf
local-data: "serveur.lan. IN AAAA fd00::10"

```

Un même nom peut donc avoir simultanément un enregistrement `A` et un `AAAA`.

---

# 5. Validation de la configuration

Après toute modification, vérifier la configuration avec :

```bash
sudo unbound-checkconf

```

Si aucune erreur n'est retournée, la configuration est syntaxiquement valide.

---

# 6. Redémarrage ou rechargement

Après modification de la configuration :

```bash
sudo systemctl restart unbound

```

Pour vérifier l'état du service :

```bash
sudo systemctl status unbound

```

Les logs peuvent être consultés avec :

```bash
sudo journalctl -u unbound

```

ou en temps réel :

```bash
sudo journalctl -u unbound -f

```

---

# 7. Tests DNS

## Test d'un domaine Internet

```bash
dig example.com @127.0.0.1

```

## Test d'un enregistrement IPv4

```bash
dig A example.com @127.0.0.1

```

## Test d'un enregistrement IPv6

```bash
dig AAAA example.com @::1

```

Cette commande teste également que le serveur Unbound est joignable via IPv6 sur l'interface loopback.

## Test d'un nom local

```bash
dig serveur.lan @127.0.0.1

```

---

# 8. Statistiques

Unbound fournit l'outil `unbound-control`.

État du serveur :

```bash
sudo unbound-control status

```

Statistiques :

```bash
sudo unbound-control stats

```

Statistiques sans réinitialisation :

```bash
sudo unbound-control stats_noreset

```

Quelques métriques utiles :

```text
total.num.queries
total.num.cachehits
total.num.cachemiss

```

Elles permettent notamment de suivre :

- le nombre total de requêtes ;
- le nombre de réponses provenant du cache ;
- le nombre de requêtes nécessitant une résolution.

---

# 9. Pare-feu

Le DNS utilise principalement :

```text
UDP/53
TCP/53

```

Le pare-feu doit autoriser ces ports depuis les réseaux qui doivent utiliser le resolver.

Pour IPv6, les règles du pare-feu IPv6 doivent également autoriser les connexions vers UDP/TCP 53.

L'accès doit rester limité aux réseaux nécessaires.

---

## Structure des fichiers

La configuration finale peut être organisée ainsi :

```text
/etc/unbound/
├── unbound.conf
└── unbound.conf.d/
    └── local.conf

```

Le fichier `local.conf` contient notamment :

```conf
server:
    verbosity: 0

    interface: 0.0.0.0
    interface: ::0

    access-control: 127.0.0.0/8 allow
    access-control: 192.168.10.0/24 allow
    access-control: 10.20.0.0/24 allow

    access-control: ::1 allow
    access-control: fd00::/8 allow

    do-ip4: yes
    do-ip6: yes
    prefer-ip6: no

    local-zone: "lan." static

    # Enregistrements DNS locaux à ajouter ici
    # local-data: "serveur.lan. IN A 192.168.10.10"

```

Cette organisation permet de conserver la configuration spécifique au serveur dans `unbound.conf.d/local.conf`, sans modifier inutilement le fichier principal `/etc/unbound/unbound.conf`.