
Biblioteca de Consulta DNS Rápida e Ferramenta CLI
ZDNS é um resolvedor DNS de alta velocidade e utilitário de linha de comando para realizar medições DNS em larga escala. ZDNS é escrito em Go e contém seu próprio código de resolução recursiva e um cache otimizado para realizar consultas de um conjunto diversificado de nomes. Usamos https://github.com/zmap/dns para construir e analisar pacotes DNS brutos. Para mais informações sobre a arquitetura e desempenho do ZDNS, consulte o seguinte artigo apresentado na ACM's Internet Measurement Conference '22.
[!TIP] O ZDNS Wiki contém informações adicionais sobre o ZDNS e exemplos de casos de uso.
ZDNS pode ser instalado baixando o repositório e executando make install.
git clone https://github.com/zmap/zdns.git
cd zdns
make install
ZDNS consiste em uma biblioteca de resolvedor recursivo e um invólucro CLI.
A biblioteca consiste em uma struct ResolverConfig que conterá todas as opções de configuração para todas as consultas realizadas.
O ResolverConfig é usado para criar 1+ struct(s) Resolver que realizarão todas as consultas. Um Resolver
deve fazer apenas uma única consulta por vez (não é thread-safe) e múltiplas structs Resolver devem ser
usadas para paralelismo. Consulte nossos exemplos para saber como usar a
biblioteca. Módulos são usados para definir o comportamento das consultas.
ZDNS fornece vários tipos de módulos:
Módulos DNS brutos fornecem a resposta DNS bruta do servidor, semelhante ao dig, mas em JSON. Existe um módulo para (quase) cada tipo de registro DNS.
Módulos de consulta fornecem respostas mais úteis quando várias consultas são
necessárias (por exemplo, completar uma consulta A adicional para endereços IP se um NS for
recebido em NSLOOKUP).
Módulos diversos fornecem outros meios adicionais de consultar servidores (por exemplo,
bind.version).
Detalhamos os módulos abaixo:
Os 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 e URI fornecem a resposta DNS bruta em formato JSON, semelhante ao dig.
Por exemplo, o comando:
echo "censys.io" | zdns A
retorna:
{
"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"
}
}
}
Respostas DNS brutas frequentemente não fornecem os dados que você deseja. Por exemplo,
uma resposta MX pode não incluir os registros A associados na seção
adicional, exigindo uma consulta adicional. Para resolver essa lacuna e fornecer uma
interface mais amigável, também fornecemos vários módulos de consulta: alookup,
mxlookup e nslookup.
alookup atua de forma semelhante ao nslookup e seguirá registros CNAME.
mxlookup também fará uma consulta A para os endereços IP que correspondem a um registro de exchange.
nslookup também fará uma consulta A/AAAA para endereços IP que correspondem a um registro NS.
Por exemplo,
echo "censys.io" | zdns mxlookup --ipv4-lookup
retorna:
{
"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 também suporta consultas DNS especiais de "debug". Os módulos incluem: BINDVERSION.
ZDNS suporta fornecer entrada em uma variedade de formatos, dependendo do comportamento desejado.
A entrada mais básica é uma lista de nomes separados por novas linhas. Por exemplo:
Do stdin:
echo "google.com\nyahoo.com" | zdns A
cat list_of_domains.txt | zdns A
De um arquivo
zdns A --input-file=list_of_domains.txt
Se você não precisa resolver muitos domínios, fornecer o domínio como argumento CLI, semelhante ao dig, é suportado para facilidade de uso.
Por exemplo:
zdns A google.com --name-servers=1.1.1.1
Equivalente a dig -t A google.com @1.1.1.1
Normalmente, o ZDNS escolherá um servidor de nomes aleatório para cada consulta de domínio a partir de --name-servers. Se, em vez disso, você quiser especificar
um servidor de nomes diferente para cada domínio, pode fazer isso fornecendo pares domainName,nameServerIP separados por novas linhas.
Isso substituirá quaisquer servidores de nomes fornecidos com --name-servers.
Por exemplo:
echo "google.com,1.1.1.1\nfacebook.com,8.8.8.8" | zdns A
Você pode ver o resolver conforme especificado para cada domínio na saída (additionals/answers redigidos por brevidade):
$ 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"}}}
Arquivos de zona (do ICANN CZDS ou similares) podem ser usados como fonte de entrada para o ZDNS com a flag --zone-file. Isso permite analisar arquivos de zona a partir do stdin (padrão) ou de um arquivo com a flag --input-file.
Por padrão, o ZDNS extrairá apenas o nome de cada registro do arquivo de zona. Se você também quiser resolver os nomes referenciados na seção de resposta de tipos de registro como CNAMEs ou registros NS, pode usar a flag CLI --zone-file-include-targets.