--- categories: openbsd network DNS title: Howto Unbound --- * Documentation : * Rôle Ansible : * Man pages : ou [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/). ## 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 ou 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 ~~~ ## 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 ~~~ 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 ~~~ ### dnstop Voir [HowtoBind#dnstop]() ## FAQ ### Vider le cache pour un domaine particulier ~~~ unbound-control flush_zone foo.local ~~~ ### 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`. ### 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 ~~~