Publié le: 2012-10-13

Override dhclient DNS configuration

La configuration DNS sous UNIX est située dans le fichier /etc/resolv.conf. Dans une configuration classique pour un serveur ce fichier est statique. Il est créé lors de la première installation en se référant au paramétrage spécifié dans l’installeur. Pour une configuration dynamique en DHCP, généralement un client, c’est le binaire dhclient qui va s’occuper de modifier les lignes de configuration afin de mettre les DNS reçus via DNS ainsi que les zones de recherches et suffixe DNS. Le principal problème que nous allons essayer de résoudre ici est essentiellement une problématique de type cloud. Sur un cloud de type AWS nos serveurs sont tous en DHCP, c’est obligatoire. Pour prendre le cas pratique AWS, gérer son DNS sans serveur local consiste à configurer le service route53 avec ses enregistrements, soit via l’interface, awscli ou encore ansible. Si jamais on souhaite pouvoir interagir avec des DNS personnalisés ce n’est donc pas possible facilement, dhclient remplaçant automatiquement le fichier /etc/resolv.conf à chaque interrogation.

Résolution de la problématique

dhclient contient fort heureusement certaines options de configuration nous permettant de gérer le cas d’un DNS statique avec une IP dynamique, ce sont les directives prepend, append et supersede. Ces options permettent d’ajouter avant (prepend), après (append), ou de remplacer (supersede) des options DHCP reçues par le client avant d’interagir avec le système. Vous pouvez donc avoir 2 cas d’usages intéressants. La configuration suivante sera à insérer dans le fichier /etc/dhcp/dhclient.conf.

1. Remplacer le DNS obtenu par un DNS personnalisé

La directive supersede permet de remplacer complètement les DNS obtenus via DHCP

supersede domain-name-servers 172.0.14.1, 172.0.14.2;
supersede domain-name-servers 172.0.14.1, 172.0.14.2;

2 Utiliser un DNS personnalisé par défaut et les DNS obtenus en fallback

On va ici utiliser la directive prepend, nous permettant d’utiliser les DNS obtenus via DHCP uniquement en cas d’erreur d’accès à nos DNS personnalisés

prepend domain-name-servers 172.0.14.1, 172.0.14.2;

Note: Un effet de bord d’usage de ces directives, vous pouvez ainsi spécifier des DNS si votre DHCP n’en fournit pas.

Conclusion

Lors de la prochaine requête DHCP votre fichier resolv.conf sera ainsi configuré pour contenir les 2 serveurs DNS spécifiés dans dhclient.

Bonus

Puisqu’automatiser est très important, voici quelques lignes de configuration ansible à intégrer à vos rôles d’uniformisation des socles applicatifs

- name: "DHCLIENT | Set static nameservers"
  lineinfile: dest="/etc/dhcp/dhclient.conf" line="supersede domain-name-servers {{ dns_servers | join(', ') }};" state=present
  when: dns_servers is defined
  tags: [dhcp]