
Bibliothèque de recherche DNS rapide et outil en ligne de commande
ZDNS est un résolveur DNS haute vitesse et un utilitaire en ligne de commande pour effectuer des mesures DNS à grande échelle. ZDNS est écrit en Go et contient son propre code de résolution récursive ainsi qu'un cache optimisé pour effectuer des recherches sur un ensemble diversifié de noms. Nous utilisons https://github.com/zmap/dns pour construire et analyser les paquets DNS bruts. Pour plus d'informations sur l'architecture et les performances de ZDNS, consultez l'article suivant papier présenté à l'Internet Measurement Conference '22 de l'ACM.
[!TIP] Le Wiki ZDNS contient des informations supplémentaires sur ZDNS et parcourt des cas d'utilisation et des exemples.
ZDNS peut être installé en clonant le dépôt et en exécutant make install.
git clone https://github.com/zmap/zdns.git
cd zdns
make install
ZDNS se compose d'une bibliothèque de résolveur récursif library et d'un wrapper en ligne de commande CLI wrapper.
La bibliothèque consiste en une structure ResolverConfig qui contiendra toutes les options de configuration pour toutes les recherches effectuées.
Le ResolverConfig est utilisé pour créer une ou plusieurs structures Resolver qui effectueront toutes les recherches. Un Resolver
ne doit effectuer qu'une seule recherche à la fois (il n'est pas thread-safe) et plusieurs structures Resolver doivent être
utilisées pour le parallélisme. Consultez nos exemples pour savoir comment utiliser la
bibliothèque. Les Modules sont utilisés pour définir le comportement des recherches.
ZDNS fournit plusieurs types de modules :
Modules DNS bruts fournissent la réponse DNS brute du serveur, similaire à dig, mais en JSON. Il existe un module pour (presque) chaque type d'enregistrement DNS.
Modules de recherche fournissent des réponses plus utiles lorsque plusieurs requêtes sont
nécessaires (par exemple, effectuer une recherche A supplémentaire pour les adresses IP si une NS est
reçue dans NSLOOKUP).
Modules divers fournissent d'autres moyens supplémentaires d'interroger les serveurs (par exemple,
bind.version).
Nous détaillons les modules ci-dessous :
Les modules A, AAAA, AFSDB, ANY, ATMA, AVC, AXFR, BINDVERSION, CAA, CDNSKEY, CDS, CERT, CNAME, CSYNC, DHCID, DMARC, DNSKEY, DS, EID, EUI48, EUI64, GID, GPOS, HINFO, HIP, HTTPS, ISDN, KEY, KX, L32, L64, LOC, LP, MB, MD, MF, MG, MR, MX, NAPTR, NID, NINFO, NS, NSAPPTR, NSEC, NSEC3, NSEC3PARAM, NSLOOKUP, NULL, NXT, OPENPGPKEY, PTR, PX, RP, RRSIG, RT, SVCBS, MIMEA, SOA, SPF, SRV, SSHFP, TALINK, TKEY, TLSA, TXT, UID, UINFO, UNSPEC et URI fournissent la réponse DNS brute sous forme JSON, similaire à dig.
Par exemple, la commande :
echo "censys.io" | zdns A
retourne :
{
"name": "censys.io",
"results": {
"A": {
"data": {
"additionals": [
{
"flags": "",
"type": "EDNS0",
"udpsize": 512,
"version": 0
}
],
"answers": [
{
"answer": "104.18.10.85",
"class": "IN",
"name": "censys.io",
"ttl": 300,
"type": "A"
},
{
"answer": "104.18.11.85",
"class": "IN",
"name": "censys.io",
"ttl": 300,
"type": "A"
}
],
"protocol": "udp",
"resolver": "[2603:6013:9d00:3302::1]:53"
},
"duration": 0.285295416,
"status": "NOERROR",
"timestamp": "2024-08-23T13:12:43-04:00"
}
}
}
Les réponses DNS brutes ne fournissent souvent pas les données dont vous avez besoin. Par exemple,
une réponse MX peut ne pas inclure les enregistrements A associés dans la section
supplémentaire, nécessitant une recherche supplémentaire. Pour combler cette lacune et fournir une
interface plus conviviale, nous proposons également plusieurs modules de recherche : alookup,
mxlookup et nslookup.
alookup agit de manière similaire à nslookup et suivra les enregistrements CNAME.
mxlookup effectuera en plus une recherche A pour les adresses IP correspondant à un enregistrement d'échange.
nslookup effectuera en plus une recherche A/AAAA pour les adresses IP correspondant à un enregistrement NS.
Par exemple,
echo "censys.io" | zdns mxlookup --ipv4-lookup
retourne :
{
"name": "censys.io",
"results": {
"MXLOOKUP": {
"data": {
"exchanges": [
{
"class": "IN",
"ipv4_addresses": [
"209.85.202.27"
],
"name": "alt1.aspmx.l.google.com",
"preference": 5,
"ttl": 300,
"type": "MX"
},
{
"class": "IN",
"ipv4_addresses": [
"142.250.31.26"
],
"name": "aspmx.l.google.com",
"preference": 1,
"ttl": 300,
"type": "MX"
}
]
},
"duration": 0.154786958,
"status": "NOERROR",
"timestamp": "2024-08-23T13:10:11-04:00"
}
}
}
ZDNS prend également en charge les requêtes DNS spéciales de « débogage ». Les modules incluent : BINDVERSION.
ZDNS permet de fournir une entrée dans différents formats selon le comportement souhaité.
L'entrée la plus basique est une liste de noms séparés par des sauts de ligne. Par exemple :
Depuis l'entrée standard :
echo "google.com\nyahoo.com" | zdns A
cat list_of_domains.txt | zdns A
Depuis un fichier
zdns A --input-file=list_of_domains.txt
Si vous n'avez pas besoin de résoudre beaucoup de domaines, fournir le domaine comme argument CLI, similaire à dig, est pris en charge pour la facilité d'utilisation.
Par exemple :
zdns A google.com --name-servers=1.1.1.1
Équivalent à dig -t A google.com @1.1.1.1
Normalement, ZDNS choisira un serveur de noms aléatoire pour chaque recherche de domaine parmi --name-servers. Si vous souhaitez plutôt spécifier
un serveur de noms différent pour chaque domaine, vous pouvez le faire en fournissant des paires domainName,nameServerIP séparées par des sauts de ligne.
Cela remplacera tout serveur de noms fourni avec --name-servers.
Par exemple :
echo "google.com,1.1.1.1\nfacebook.com,8.8.8.8" | zdns A
Vous pouvez voir que le resolver est celui spécifié pour chaque domaine dans la sortie (additionals/answers tronqués par souci de concision) :
$ echo "google.com,1.1.1.1\nfacebook.com,8.8.8.8" | zdns A
{"name":"google.com","results":{"A":{"data":{"additionals":...,"answers":[...],"protocol":"udp","resolver":"1.1.1.1:53"},"duration":0.030490042,"status":"NOERROR","timestamp":"2024-09-13T09:51:34-04:00"}}}
{"name":"facebook.com","results":{"A":{"data":{"additionals":[...],"answers":[...],"protocol":"udp","resolver":"8.8.8.8:53"},"duration":0.061365459,"status":"NOERROR","timestamp":"2024-09-13T09:51:34-04:00"}}}