
Biblioteca de consulta DNS rápida y herramienta CLI
ZDNS es un resolvedor DNS de alta velocidad y una utilidad de línea de comandos para realizar mediciones DNS a gran escala. ZDNS está escrito en Go y contiene su propio código de resolución recursiva y una caché optimizada para realizar consultas de un conjunto diverso de nombres. Usamos https://github.com/zmap/dns para construir y analizar paquetes DNS sin procesar. Para obtener más información sobre la arquitectura y el rendimiento de ZDNS, consulte el siguiente artículo presentado en la Conferencia de Medición de Internet del ACM '22.
[!TIP] La Wiki de ZDNS contiene información adicional sobre ZDNS y explica casos de uso y ejemplos.
ZDNS se puede instalar clonando el repositorio y ejecutando make install.
git clone https://github.com/zmap/zdns.git
cd zdns
make install
ZDNS consiste en una biblioteca de resolvedor recursivo biblioteca y un envoltorio CLI CLI.
La biblioteca consta de una estructura ResolverConfig que contendrá todas las opciones de configuración para todas las consultas realizadas. La ResolverConfig se utiliza para crear 1+ estructuras Resolver que realizarán todas las consultas. Un Resolver solo debe realizar una consulta a la vez (no es seguro para hilos) y se deben usar múltiples estructuras Resolver para el paralelismo. Consulte nuestros ejemplos para saber cómo usar la biblioteca. Los módulos se utilizan para definir el comportamiento de las consultas.
ZDNS proporciona varios tipos de módulos:
Módulos DNS sin procesar proporcionan la respuesta DNS sin procesar del servidor similar a dig, pero en JSON. Hay un módulo para (casi) cada tipo de registro DNS
Módulos de consulta proporcionan respuestas más útiles cuando se requieren múltiples consultas (por ejemplo, completar una consulta A adicional para direcciones IP si se recibe un NS en NSLOOKUP)
Módulos varios proporcionan otros medios adicionales para consultar servidores (por ejemplo, bind.version)
Detallamos los módulos a continuación:
Los módulos 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 y URI proporcionan la respuesta DNS sin procesar en formato JSON, similar a dig.
Por ejemplo, el comando:
echo "censys.io" | zdns A
devuelve:
{
"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"
}
}
}
Las respuestas DNS sin procesar a menudo no proporcionan los datos que desea. Por ejemplo, una respuesta MX puede no incluir los registros A asociados en la sección adicional, lo que requiere una consulta adicional. Para abordar esta brecha y proporcionar una interfaz más amigable, también proporcionamos varios módulos de consulta: alookup, mxlookup y nslookup.
alookup actúa de manera similar a nslookup y seguirá los registros CNAME.
mxlookup adicionalmente realizará una consulta A para las direcciones IP que correspondan con un registro de intercambio.
nslookup adicionalmente realizará una consulta A/AAAA para las direcciones IP que correspondan con un registro NS.
Por ejemplo,
echo "censys.io" | zdns mxlookup --ipv4-lookup
devuelve:
{
"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 también admite consultas DNS especiales de "depuración". Los módulos incluyen: BINDVERSION.
ZDNS admite proporcionar entrada en una variedad de formatos según el comportamiento deseado.
La entrada más básica es una lista de nombres separados por nuevas líneas. Por ejemplo:
Desde stdin:
echo "google.com\nyahoo.com" | zdns A
cat list_of_domains.txt | zdns A
Desde un archivo
zdns A --input-file=list_of_domains.txt
Si no necesita resolver muchos dominios, se admite proporcionar el dominio como argumento CLI, similar a dig, para facilitar su uso.
Por ejemplo:
zdns A google.com --name-servers=1.1.1.1
Equivalente a dig -t A google.com @1.1.1.1
Normalmente, ZDNS elegirá un servidor de nombres aleatorio para cada consulta de dominio de --name-servers. Si en su lugar desea especificar
un servidor de nombres diferente para cada dominio, puede hacerlo proporcionando pares domainName,nameServerIP separados por nuevas líneas.
Esto anulará cualquier servidor de nombres proporcionado con --name-servers.
Por ejemplo:
echo "google.com,1.1.1.1\nfacebook.com,8.8.8.8" | zdns A
Puede ver que el resolver es el especificado para cada dominio en la salida (adicionales/respuestas omitidos por brevedad):
$ 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"}}}
Los archivos de zona (de ICANN CZDS o similares) se pueden utilizar como fuente de entrada para ZDNS con el indicador --zone-file. Esto permite analizar archivos de zona desde stdin (predeterminado) o desde un archivo con el indicador --input-file.