notes/powerdns-zone-sans-fichier-servfail
PowerDNS rend SERVFAIL pour une zone sans fichier
Une zone déclarée dans named.conf sans son fichier fait répondre SERVFAIL à son nom et à ses sous-noms, pendant que la zone parente répond.
- powerdns
- dns
- cpanel
Un nom répond SERVFAIL, son SOA aussi, et chacun de ses sous-noms. Pendant ce temps, la zone parente répond sans problème. La réponse porte même le drapeau aa, ce qui fait croire à une zone saine. Tu le constates en interrogeant le nœud sans récursion :
dig +norec @<nœud> <nom>
La cause vient d'une déclaration. La zone figure dans /etc/named.conf, mais son fichier /var/named/<zone>.db n'existe plus. Dans le cas vécu, chaque nœud déclarait une zone à son propre nom d'hôte, créée par l'installation de cPanel, et le fichier avait disparu. PowerDNS se tient pour responsable d'une zone déclarée, même quand il n'a pas pu la charger. Il ne descend donc pas vers la zone parente et refuse la requête.
Le journal le dit aussi, après coup. Chaque requête refusée ajoute une ligne dans /var/log/messages : "not loaded (file missing, corrupt or primary dead) sending out servfail". Sur un des nœuds, cela faisait 786 000 lignes en une semaine.
Pour savoir quelles zones sont rejetées, demande son état à PowerDNS. Une zone sans fichier rend [rejected] ... Unable to open file :
pdns_control bind-domain-status <zone>
Pour toutes les zones d'un coup, ne garde que celles qui ne sont pas chargées :
pdns_control bind-domain-status | grep -v "parsed into memory"
Tu sauvegardes /etc/named.conf, tu relèves le SOA de chaque zone, puis tu lances /usr/local/cpanel/scripts/rebuilddnsconfig. Le script réécrit named.conf à partir des fichiers de zone présents et relance lui-même pdns, ce qui prend une seconde environ. Fais-le un nœud à la fois. Les deux nœuds mesurés ont été corrigés comme ça.
Ces chiffres et ces gestes valent pour cPanel 110 en mode DNSONLY, avec PowerDNS 4.9.17 en launch=bind et bind-config=/etc/named.conf. Une autre combinaison, je ne l'ai pas mesurée.
Contrôle la sortie. Compare named.conf avec la sauvegarde par diff, vérifie qu'aucune zone ne reste rejetée et que les SOA sont identiques à ceux relevés avant. Le dernier contrôle se fait de l'extérieur, avec dig.
Des réécritures ordinaires de named.conf par cPanel gardaient la déclaration orpheline. La tenue de la correction après upcp, je ne l'ai pas encore mesurée.