SwordArMor

Le concept d’empty non terminal (ENT) en DNS, et son interaction avec les wildcards

Cet article est écrit en collaboration avec Axel Viala. Tout au long de l’article nous parlons de serveurs faisant autorité, les révolveurs n’ayant pas ce cas à gérer.

Sur un nom de domaine, on peut se retrouver avec des sous-domaines vides mais ayant des enfants. Nous appelons cela un ENT (empty non terminal). Ceci peut rentrer en conflit avec deux autres mécanismes du DNS : le qname-minimisation et le wildcard.
Sur cet article nous allons partir d’une zone sans aucune fioriture, puis en rajouter au fur et à mesure afin de voir comment un ENT peut invalider un wildcard. Prenons pour exemple une zone sans piège mais contenant un ENT :

$ORIGIN alarig.example.
@			10800	IN	SOA	ns hostmaster 2023051900 14400 3600 604800 86400
@			10800	IN	NS	ns
ns			10800	IN	A	192.0.0.8
ns			10800	IN	AAAA	2001:db8::35

www.ent			10800	IN	AAAA	2001:db8::1bb

Ici nous avons un seul NS, son A/AAAA associé et un enregistrement pour le serveur web du sous-domaine ent.
Pourquoi est-ce un ENT ? Car le domaine ent ne contient rien en lui-même, et pourtant www.ent existe. Nous avons donc affaire à un sous-domaine www d’un domaine vide ent. Ceci est défini dans la section 2.2.2 de la RFC 4592. Les serveurs DNS doivent alors répondre avec un status NOERROR et une section de réponse vide (on appelle cela NODATA).
En soit ici, d’un point de vue de la compréhension de la zone, comprendre le concept d’ENT n’est pas forcément essentiel. On voit assez bien où on veut arriver ; tout ce qui est resolvable étant explicitement écrit dans la zone, à l’inverse d’un wildcard qui permet implicitement une infinité de labels.

Par contre maintenant, si je pars d’une zone avec un wildcard mais sans ENT, toutes les requêtes au niveau du wildcard auront une réponse correspondant à ce que j’ai défini :

$ORIGIN alarig.example.
@			10800	IN	SOA	ns hostmaster 2023051901 14400 3600 604800 86400
@			10800	IN	NS	ns
ns			10800	IN	A	192.0.0.8
ns			10800	IN	AAAA	2001:db8::35

*			10800	IN	CNAME	example.com.

Ici, une requête sur ent.alarig.example. répondra le CNAME vers example.com.

Mais si je veux ajouter un sous-domaine par rapport au wildcard, je vais créer un ENT et je vais donc invalider le wildcard du domaine parent :

$ORIGIN alarig.example.
@			10800	IN	SOA	ns hostmaster 2023051902 14400 3600 604800 86400
@			10800	IN	NS	ns
ns			10800	IN	A	192.0.0.8
ns			10800	IN	AAAA	2001:db8::35

*			10800	IN	CNAME	example.com.
www.ent			10800	IN	AAAA	2001:db8::1bb

Ici, une question sur ent.alarig.example. aura une réponse vide, alors que c’était précédemment le contenu du CNAME.
Pourtant, un humain lisant la zone saurait trouver la réponse, car nous sommes capables de lever l’ambigüité nous-mêmes. Mais ce n’est pas aussi évidement pour un ordinateur. Pour quelle raison me direz-vous ? Car il faut gérer une consistance. Lorsque l’on définit quelque chose déjà couvert par un wildcard, il en prend la précédence, pour des questions de cohérence. On peut appeler ça la règle du plus spécifique. Sans cela nous ne pourrions pas garantir au sens du protocole un comportement prévisible entre les différentes implémentations.
Concrètement, cela veut dire qu’un label à un niveau couvert par un wildcard sera utilisé au lieu du wildcard. Donc ici, bien qu’ent ne soit pas explicitement défini, il existe quand même pour que www.ent puisse exister, mais il est vide ; ce qui provoque une réponse vide pour les questions sur ce domaine.

Si on veut continuer à avoir les réponses que l’on avait avant, il faut le déclarer explicitement, ce qui donnera donc cette zone :

$ORIGIN alarig.example.
@			10800	IN	SOA	ns hostmaster 2023051903 14400 3600 604800 86400
@			10800	IN	NS	ns
ns			10800	IN	A	192.0.0.8
ns			10800	IN	AAAA	2001:db8::35

*			10800	IN	CNAME	example.com.
ent			10800	IN	CNAME	example.com.
www.ent			10800	IN	AAAA	2001:db8::1bb

Dans cette version de la zone, le domaine ent n’est finalement plus un ENT, nous avons un enregistrement directement dessus. Ceci est nécessaire afin que le CNAME original soit toujours utilisable.