Première rédaction de cet article le 22 février 2022
Dernière mise à jour le 24 février 2022
Inspiré par un excellent article de Julia Evans, voici trois très simples (vraiment très simples !) résolveurs DNS en Python, en Elixir et en Rust. Ne les utilisez pas en production, leur but est purement pédagogique.
Comme dans l'article
originel, l'idée est de montrer, via un programme, le
fonctionnement d'un résolveur
DNS, notamment la délégation d'un
domaine vers un sous-domaine, l'un des principes fondamentaux du
DNS. Voici par exemple le déroulé de la résolution du nom
www.st-cyr.terre.defense.gouv.fr
(choisi pour
son nombre de composants) :
% ./tiny-resolver.py www.st-cyr.terre.defense.gouv.fr A Querying www.st-cyr.terre.defense.gouv.fr./A at 2001:7fd::1, depth 0 Querying www.st-cyr.terre.defense.gouv.fr./A at 2001:678:c::1, depth 1 Querying www.st-cyr.terre.defense.gouv.fr./A at 84.96.147.1, depth 2 Value of www.st-cyr.terre.defense.gouv.fr./A is ('OK', <DNS IN A rdata: 77.129.200.34>)
Trois serveurs faisant autorité ont été interrogés successivement, un de la racine, un de l'Afnic et un de SFR.
Ces deux résolveurs ont beaucoup de limites : ils ne prennent que le premier serveur faisant autorité pour chaque délégation (un vrai résolveur essaie au hasard, puis mémorise le serveur le plus rapide à répondre), par exemple. Et ils sont peu robustes face aux imprévus. Le deuxième résolveur ne gère même pas les alias (mais celui de Julia Evans non plus).
Le premier résolveur est écrit en Python. Il est téléchargeable en tiny-resolver.py
. Il dépend de la bibliothèque dnspython. Si vous ne
connaissez pas Python, cette bibliothèque peut s'installer avec, au
choix, le système de paquetage de votre
système d'exploitation (apt install
python3-dnspython
sur Debian) ou
bien avec l'outil pip (pip3 install
dnspython
).
Le deuxième résolveur est écrit en
Elixir. Il est téléchargeable en tiny-resolver-elixir.tar
. Elixir ne permet pas facilement
de produire un exécutable avec un seul fichier dès qu'on utilise des
bibliothèques extérieures comme elixir-dns. La
marche à suivre est donc (ne pas oublier d'installer les sources
d'Erlang - erlang-src
sur Debian - pour pouvoir compiler la
bibliothèque DNS) :
tar xvf tiny-resolver-elixir.tar cd tiny-resolver-elixir mix deps.get # Et accepter l'installation de Hex, la source des paquetages mix run resolver.exs domain-name
Quant au troisième, écrit par Kim Minh Kaplan, il est en
Rust. Il est téléchargeable en tiny-resolver.rs
. Vous devez avoir un Rust très
récent et ajouter ce manifeste décrivant les dépendances, dans Cargo.toml
:
[package] name = "tiny-resolver" version = "0.1.0" edition = "2021" [dependencies] trust-dns-client = "0.20.4"
Ensuite, un cargo build
, et vous trouverez le
programme exécutable en
./target/debug/tiny-resolver
:
% ./target/debug/tiny-resolver www.afnic.fr dig -r @198.41.0.4 www.afnic.fr d.nic.fr. 172800 IN A 194.0.9.1 dig -r @194.0.9.1 www.afnic.fr ns3.nic.fr. 172800 IN A 192.134.0.49 dig -r @192.134.0.49 www.afnic.fr www.afnic.fr. 600 IN A 91.188.78.66 Result: 91.188.78.66
Bonne lecture de code source !
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)