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.

Faire tenir la charge à une instance mastodon malgré Musk

Si vous lisez ce blog, vous savez sûrement qu’un riche mégalomane étasunien a racheté twitter, et qu’on en attendait pas moins de son mode de gestion. Cela a entraîné un exode vers mastodon, qui ronronnait tranquillement dans son coin jusqu’ici.
Je vais ici partager les différentes actions …

Lire la suite

Avoir une sorte de flowspec sous linux avec ipset

Internet étant truffé de machines plus ou moins vérolées qui scannent le monde entier, j’ai eu envie de les bloquer à l’échelle complète de mon réseau ; un genre de fail2ban2bgp.
Avec netfilter il n’existe pas de mécanisme pour avoir des règles dynamiques, et donc pas de moyen …

Lire la suite

Remonter le constructeur et le modèle d’un serveur en SNMP

Par défaut, la configuration de net-snmpd ne remonte pas le constructeur et le modèle d’un serveur, ce qui fait que LibreNMS (ou Observium) vont afficher « Generic x86 64-bit » là où on pourrait avoir « Dell Inc. [PowerEdge R510] » ou « HP [ProLiant DL320e Gen8] », ce qui rend plus facile l’inventorisation …

Lire la suite

Installer son instance mastodon sous Gentoo

Suite à l’annonce de Valère d’arrêter les services hostux, et donc l’instance mastodon, j’ai décidé de monter la mienne. La principale raison est que je n’ai pas trouvé d’autre instance en Europe avec un TLSA. Je ne vais pas ici expliquer toute l’installation …

Lire la suite

Désactivation de la souris pour urxvt et terminator (et autres terminaux basés sur VTE)

Depuis quelques temps, le support de la souris est activé par défaut sur certaines applications CLI, notamment vim. Ceci empêche d’utiliser le presse-papier « clic milieu » et ne sert en outre à rien, c’est donc fort ennuyeux.

J’ai un peu cherché comment désactiver le support de la souris …

Lire la suite

Vérification RPKI avec routinator, bird et IOS-XE

Quand on fait partie de la DFZ, on peut en gros annoncer n’importe quel préfixe tant que ça passe les filtres de nos pairs, et on est censé leur faire plus ou moins confiance. Sauf que croire encore à ce système de la confiance en 2020, c’est aussi …

Lire la suite

Remplir la table SNMP ifAlias sous Linux

Il m’arrive encore de jouer avec des routeurs soft, et comme à chaque fois il faut bricoler pour avoir ce que l’on veut, ici avoir une table ifAlias correcte. À une époque je le faisais avec FreeBSD, et j’avais trouvé la parade en utilisant un proxy vers …

Lire la suite

Afficher correctement les AS 32 bits avec mtr

mtr est un outil très pratique qui permet de faire un traceroute, mais en mieux. La sortie est beaucoup plus lisible, et ça utilise de l’ICMP par défaut (au lieu de l’UDP sous Linux/*BSD). Seulement, dans les anciennes versions, les AS 32 bits sont mal gérés : ils …

Lire la suite

Sauvegarder la configuration de ses switches et routeurs avec expect

Si vous ne connaissez pas expect, c’est un outil qui permet d’écrire des scripts en TCL qui iront interagir avec telnet/ssh et d’autres trucs du genre, sans que vous ayez à le faire vous même. C’est donc très pratique pour écrire des scripts qui seront …

Lire la suite

Page 1 / 5 »