wiki/HowtoUnbound.md

237 lines
6.4 KiB
Markdown
Raw Normal View History

2017-01-20 11:17:20 +01:00
---
2017-07-27 01:53:00 +02:00
categories: openbsd network DNS
title: Howto Unbound
2017-01-20 11:17:20 +01:00
---
2016-12-29 11:25:39 +01:00
2017-07-27 17:49:30 +02:00
* Documentation : <https://www.unbound.net/documentation/>
2017-07-25 15:20:52 +02:00
* Rôle Ansible : <https://forge.evolix.org/projects/ansible-roles/repository/show/unbound>
2017-07-31 17:25:14 +02:00
* Man pages : <https://man.openbsd.org/unbound> ou <https://manpages.debian.org/stretch/unbound/unbound.8.en.html>
2017-07-25 15:20:52 +02:00
2017-07-27 17:49:30 +02:00
[Unbound](https://www.unbound.net/) est un serveur DNS récursif. Il gère notamment du cache et la validation DNSSEC. Par rapport à [Bind](HowtoBind) il est léger et sécurisé, mais il ne sait pas faire autorité pour un nom de domaine. Il a été écrit et est maintenu par [NLnet Labs](https://www.nlnetlabs.nl/).
2017-07-25 15:36:12 +02:00
2017-07-27 01:53:00 +02:00
## Installation
2017-07-25 15:20:52 +02:00
2017-07-27 01:53:00 +02:00
### Debian
2017-07-25 17:36:30 +02:00
~~~
# apt install unbound
2017-07-27 01:53:00 +02:00
$ /usr/sbin/unbound -h | tail -5
Version 1.6.0
linked libs: libevent 2.0.21-stable (it uses epoll), OpenSSL 1.1.0f 25 May 2017
linked modules: dns64 python validator iterator
BSD licensed, see LICENSE in source package for details.
Report bugs to unbound-bugs@nlnetlabs.nl
2017-07-25 17:36:30 +02:00
~~~
2017-07-27 01:53:00 +02:00
### OpenBSD
2017-07-25 17:36:30 +02:00
2017-07-27 01:53:00 +02:00
Unbound est intégré dans la base d'OpenBSD, il est donc déjà présent.
2017-07-25 16:11:33 +02:00
2017-07-27 01:53:00 +02:00
## Configuration
2017-07-25 15:20:52 +02:00
2017-07-31 17:25:14 +02:00
<https://manpages.debian.org/stretch/unbound/unbound.conf.5.en.html> ou <https://man.openbsd.org/unbound.conf>
Fichiers de configuration sous Debian :
~~~
/etc/unbound/
├── unbound.conf
├── unbound.conf.d
│ ├── qname-minimisation.conf
│ └── root-auto-trust-anchor-file.conf
├── unbound_control.key
├── unbound_control.pem
├── unbound_server.key
└── unbound_server.pem
~~~
Fichiers de configuration sous OpenBSD (Unbound est dans un chroot) :
~~~
/var/unbound/etc/
└── unbound.conf
~~~
Par défaut, Unbound écoute uniquement sur _localhost_, la configuration minimale consiste surtout à le sécuriser :
~~~
server:
hide-identity: yes
hide-version: yes
auto-trust-anchor-file: "/var/unbound/db/root.key"
~~~
Si l'on veut le faire écouter sur un réseau local, il faut ajuster les directives `interface` et `access-control` :
2016-12-29 11:25:39 +01:00
~~~
server:
2017-07-31 17:25:14 +02:00
interface: 192.0.2.254
2017-01-20 11:17:20 +01:00
interface: 127.0.0.1
interface: ::1
2016-12-29 11:25:39 +01:00
2017-01-20 11:17:20 +01:00
access-control: 0.0.0.0/0 refuse
access-control: 127.0.0.0/8 allow
2017-07-31 17:25:14 +02:00
access-control: 192.0.2.0/24 allow
2017-01-20 11:17:20 +01:00
access-control: ::0/0 refuse
access-control: ::1 allow
2016-12-29 11:25:39 +01:00
~~~
### Configuration spécifique sous OpenBSD
Avant d'activer Unbound sous OpenBSD, il faut configurer le nombre maximum de file descriptor qu'il peut ouvrir.
En effet, 2 fd sont ouverts pour chaque IP sur laquelle Unbound écoute, puis 1 fd est ouvert pour chaque requête active.
Dans le cas d'une instabilité réseau, les fd ouverts peuvent s'accumuler et atteindre la limite, bloquant toute nouvelle requête :
~~~
unbound: [12503:0] error: can't create socket: Too many open files
~~~
Par défaut, cette limite est configurée à 512 dans `/etc/login.conf`. Nous conseillons de l'augmenter à 2048 :
~~~
unbound:\
:openfiles=2048:\
:tc=daemon:
~~~
Si cette modification est faite alors qu'unbound est déjà démarré, il faudra le redémarrer pour que la modification soit prise en compte.
Si nécessaire, augmenter également le nombre de file descriptor pouvant être ouverts globalement au système :
~~~
# sysctl kern.maxfiles
kern.maxfiles=7030
# sysctl kern.maxfiles=20480
# echo kern.maxfiles=20480 >> /etc/sysctl.conf
~~~
2017-07-31 17:25:14 +02:00
### Activation sous OpenBSD
2017-07-25 17:36:30 +02:00
2017-07-31 17:25:14 +02:00
On active Unbound dans `rc.conf.local` et on démarre le daemon :
2016-12-29 11:25:39 +01:00
~~~
2017-01-10 17:26:23 +01:00
# rcctl enable unbound
# rcctl start unbound
2016-12-29 11:25:39 +01:00
~~~
2019-03-12 11:38:03 +01:00
## Monitoring
### Avoir des statistiques
On peut accéder à des statistiques avec [unbound-control(8)](https://man.openbsd.org/unbound-control).
Pour cela, le `remote-control` doit être activé :
~~~
remote-control:
control-enable: yes
control-use-cert: no
control-interface: /var/run/unbound.sock
~~~
2019-03-12 11:38:03 +01:00
Sous Debian :
~~~
# unbound-control stats
~~~
Sous OpenBSD :
~~~
$ doas -u _unbound unbound-control stats
~~~
Si l'on veut avoir des statistiques plus détaillées, avec notamment le type de requêtes, on peut ajouter à la configuration :
~~~
extended-statistics: yes
~~~
Enfin, les statistiques peuvent régulièrement être affichées dans les logs avec cette configuration :
~~~
statistics-interval: 300
~~~
2019-03-12 11:38:03 +01:00
### dnstop
Voir [HowtoBind#dnstop]()
2017-07-27 01:53:00 +02:00
## FAQ
2017-07-25 17:16:18 +02:00
### Vider le cache pour un domaine particulier
~~~
unbound-control flush_zone foo.local
~~~
2017-07-31 17:25:14 +02:00
### Utiliser un serveur DNS particulier pour un nom de domaine
On pourra forwarder certaines requêtes vers un serveur différent en rajoutant les directives ci-dessous :
~~~
forward-zone:
2017-07-31 17:25:14 +02:00
name: "foo.local."
forward-addr: 192.0.2.1
forward-first: yes
~~~
Dans le cas présent, les requêtes concernent une zone locale, ainsi afin d'éviter une vérification DNSSEC pour ces dernières on ajoutera la directive suivante dans la configuration de unbound :
~~~
domain-insecure: "foo.local."
~~~
2017-01-24 16:13:44 +01:00
2017-07-27 01:53:00 +02:00
### Rajouter / modifier un enregistrement DNS
2017-01-24 16:13:44 +01:00
Parfois on veut pouvoir modifier un enregistrement DNS, par exemple
quand on a un VPN. On peut utiliser `/etc/hosts` pour les champs A
mais pas pour les MX. On peut donc utiliser unbound pour mentir :
~~~
2017-07-31 17:25:14 +02:00
local-zone: "example.com." typetransparent
local-data: "example.com. IN MX 10 fakemx.example.com."
local-data: "fakemx.example.com. IN A 192.168.1.3"
2017-01-24 16:13:44 +01:00
~~~
2017-07-27 01:53:00 +02:00
### Configuration sur un routeur
2017-07-31 17:25:14 +02:00
Il NE faut JAMAIS mettre une configuration de type :
~~~
2017-07-31 17:25:14 +02:00
interface: 0.0.0.0
~~~
2017-07-31 17:25:14 +02:00
…car Unbound ne va pas forcément répondre avec la bonne interface et on peut avoir des erreurs du type :
~~~
2017-07-31 17:25:14 +02:00
$ dig @IP-routeur
;; reply from unexpected source: autre.ip.du.routeur#53, expected ipdurouteur#53
~~~
2017-07-31 17:25:14 +02:00
Il faut lister explicitement toutes les interfaces sur lesquelles on souhaite qu'Unbound écoute.
2017-07-25 15:44:11 +02:00
2017-07-27 01:53:00 +02:00
### dig +trace ne fonctionne pas
2017-07-25 15:44:11 +02:00
C'est certainement parce que le client a une autorisation insuffisante
2017-07-27 17:49:30 +02:00
pour ce type de requête particulière. Il faut donc remplacer dans la
2017-07-25 15:44:11 +02:00
directive `access-control:` le mot-clé `allow` par `allow_snoop`.
2017-07-25 16:58:16 +02:00
2018-02-12 14:32:10 +01:00
### Mentir sur le TTL
On peut vouloir mettre un TTL minimum pour ne pas respecter le TTL quand il est mis à des valeurs anormalement basses. Pour mettre le TTL minimum à 600 :
~~~
cache-min-ttl: 600
~~~
### Diminuer le cache des réponses négatives
Si on veut diminuer à 30s la durée de mise en cache des résolutions n'ayant pas de réponse :
~~~
cache-max-negative-ttl: 30
~~~