Consul DNS en première classe

Consul offre une interface DNS permettant de récupérer facilement les adresses et ports des services et des nodes qui sont déclarés. C’est d’ailleurs extrêmement pratique. Le seul inconvénient de cette interface est qu’elle n’est pas intégrable facilement dans la chaîne de résolution standard. Je vous propose une solution ici pour que les enregistrements de Consul soient traités au même titre que les autres par vos serveurs Linux.

Préambule rapide

Commençons par faire tomber un mythe : le fichier /etc/resolv.conf ne vous sauvera pas à lui tout seul. Il n’est pas possible sous Linux de spécifier un numéro de port dans une entrée nameserver de ce fichier. Ne perdez donc aucun temps à fouiller les tréfonds du net, aucun salut de ce côté là.

D’autre part, la solution de changer le port par défaut de l’interface DNS de Consul pour le port 53 est disqualifiée d’office. Mes convictions profondes m’interdisent de faire tourner un projet comme Consul en utilisateur root juste pour le caler sur le bon port.

Maîtriser la chaîne de résolution

À partir du moment où vous vous penchez sur la chaîne de résolution d’un serveur, c’est que vous avez des besoins sortant du standard simple de ce qui vous est fourni par DHCP (Captain Obvious, pour vous servir). Dans ce cas, il est important de considérer de déporter la configuration de cette partie du système dans un outil dédié à cela : un DNS Resolver.

La solution est donc bien d’avoir une entrée nameserver 127.0.0.1 dans votre fichier /etc/resolv.conf, mais le service qui tournera sur le port 53 sera un service dédié, qui vous offrira plus de souplesse de configuration.

Quand on parle DNS dans le monde Linux, la réponse qui vient le plus souvent est Bind. La résolution DNS fait effectivement partie de ses fonctionnalités, mais aujourd’hui nous allons en voir un autre : Unbound. C’est un DNS Resolver uniquement et vous allez voir dans quelle mesure il va nous faciliter la vie.

Installation

Nous n’allons pas nous attarder là-dessus, dans la mesure où Unbound est présent dans la plupart des paquets systèmes pour les distributions Linux majeures. Un petit coup de yum install unbound ou de apt-get install unbound vous suffira dans la majorité des cas.

Si vous maîtrisez vos configurations réseaux en statique, ajouter un DNS Resolver écoutant uniquement sur loopback ne devrait pas être un défi. Si vous êtes adossé à un service de DHCP, il vous faudra aller modifier la configuration de votre dhclient pour y ajouter votre serveur local.

L’astuce est simplement d’ajouter :

prepend domain-name-servers 127.0.0.1;  

De cette façon, vous êtes assurés que votre modification sera reboot-proof.

Unbound et stub-zone

Dans Unbound, les stub-zones permettent de configurer un serveur d’autorité spécifique à consulter pour les résolutions d’une zone DNS. Dans notre cas, toutes les résolutions de noms d’hôte dans la zone consul doivent être déléguées à notre agent Consul local.

/etc/unbound/conf.d/local-consul.conf

server:  
  interface: 127.0.0.1
  logfile: /var/log/unbound/unbound.log
  verbosity: 1
  do-ip4: yes
  do-ip6: no
  do-udp: yes
  do-tcp: yes
  hide-identity: yes
  hide-version: yes
  harden-glue: yes
  use-caps-for-id: yes

  # Autorise Unbound à consulter un serveur local
  do-not-query-localhost: no
  # Consul ne supporte pas DNSSEC
  domain-insecure: "consul"

stub-zone:  
  name: "consul"
  stub-addr: "127.0.0.1@8600"

Conclusion

Une fois cette configuration en place, votre agent Consul à l’écoute sur son port standard et votre entrée dans le resolv.conf présente, vous pourrez profiter pleinement de l’interface DNS de Consul, sans avoir plus de ports à préciser que cela :

ping graylog.service.consul  

Have fun. Hack in peace.