Login Logout

Howto Unbound

Unbound est un serveur DNS récursif. Il gère notamment du cache et la validation DNSSEC. Par rapport à Bind 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.

Installation

Debian

# apt install unbound

$ /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

OpenBSD

Unbound est intégré dans la base d’OpenBSD, il est donc déjà présent.

Configuration

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 :

server:
  interface: 192.0.2.254
  interface: 127.0.0.1
  interface: ::1

  access-control: 0.0.0.0/0 refuse
  access-control: 127.0.0.0/8 allow
  access-control: 192.0.2.0/24 allow
  access-control: ::0/0 refuse
  access-control: ::1 allow

Activation sous OpenBSD

On active Unbound dans rc.conf.local et on démarre le daemon :

# rcctl enable unbound
# rcctl start unbound

FAQ

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:
  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."

Rajouter / modifier un enregistrement DNS

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 :

  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"

Configuration sur un routeur

Il NE faut JAMAIS mettre une configuration de type :

  interface: 0.0.0.0

…car Unbound ne va pas forcément répondre avec la bonne interface et on peut avoir des erreurs du type :

$ dig @IP-routeur
;; reply from unexpected source: autre.ip.du.routeur#53, expected ipdurouteur#53

Il faut lister explicitement toutes les interfaces sur lesquelles on souhaite qu’Unbound écoute.

dig +trace ne fonctionne pas

C’est certainement parce que le client a une autorisation insuffisante pour ce type de requête particulière. Il faut donc remplacer dans la directive access-control: le mot-clé allow par allow_snoop.

Avoir des statistiques

On peut facilement accéder à des statistiques avec unbound-control(8).

Sous Debian :

# unbound-control stats

Sous OpenBSD :

$ doas -u _unbound unbound-control stats