Come posso elencare TUTTI i record DNS?

C'è un modo per elencare TUTTI i record DNS di un dominio?

Conosco cose come dig e nslookup, ma vanno solo fino a un certo punto. Per esempio, se ho un record A del sottodominio come

test A somedomain.co.uk

allora, a meno che non lo chieda specificamente, ad es.

dig any test.somedomain.co.uk

Non posso vederlo.

C'è un modo (oltre a guardare i record andando nel gestore DNS) per vedere esattamente quali sono tutti i record DNS?

Soluzione

Quando fai una query per ANY otterrai una lista di tutti i record a quel livello ma non sotto.

# try this
dig google.com any

Questo può restituire record A, record TXT, record NS, record MX, ecc. se il nome di dominio è esattamente "google.com". Tuttavia, non restituirà i record figli (ad esempio, www.google.com). Più precisamente, POTETE ottenere questi record se esistono. Il name server non è obbligato a restituire questi record se sceglie di non farlo (per esempio, per ridurre la dimensione della risposta).

Un AXFR è un trasferimento di zona ed è probabilmente quello che volete. Tuttavia, questi sono tipicamente limitati e non disponibili a meno che tu non controlli la zona. Di solito si effettua un trasferimento di zona direttamente dal server autoritativo (il @ns1.google.com sotto) e spesso da un server di nomi che potrebbe non essere pubblicato (un server di nomi stealth).

# This will return "Transfer failed"
dig @ns1.google.com google.com axfr

Se hai il controllo della zona, puoi impostarla per ottenere trasferimenti protetti da una chiave TSIG. Questo è un segreto condiviso che il client può inviare al server per autorizzare il trasferimento.

Commentari (6)

In assenza della capacità di fare trasferimenti di zona, ho scritto questo piccolo script bash, dg:

#!/bin/bash
COMMON_SUBDOMAINS=(www mail smtp pop imap blog en ftp ssh login)
if [[ "$2" == "x" ]]; then
    dig +nocmd "$1" +noall +answer "${3:-any}"
    wild_ips="$(dig +short "*.$1" "${3:-any}" | tr '\n' '|')"
    wild_ips="${wild_ips%|}"
    for sub in "${COMMON_SUBDOMAINS[@]}"; do
        dig +nocmd "$sub.$1" +noall +answer "${3:-any}"
    done | grep -vE "${wild_ips}"
    dig +nocmd "*.$1" +noall +answer "${3:-any}"
else
    dig +nocmd "$1" +noall +answer "${2:-any}"
fi

Ora uso dg example.com per ottenere una bella lista pulita di record DNS, o dg example.com x per includere un mucchio di altri popolari sottodomini.

grep -vE "${wild_ips}" filtra i record che potrebbero essere il risultato di una voce DNS jolly come * 10800 IN A 1.38.216.82. Altrimenti, una voce jolly farebbe sembrare che ci siano record per ogni $COMMON_SUBDOMAN.

Nota: Questo si basa su query ANY, che sono bloccate da alcuni provider DNS come CloudFlare.

Commentari (1)

Quello che vuoi è chiamato trasferimento di zona. Puoi richiedere un trasferimento di zona usando dig -t axfr.

Una zona è un dominio e tutti i domini sottostanti che non sono delegati ad un altro server.

Nota che i trasferimenti di zona non sono sempre supportati. Non sono usati nella normale ricerca, solo per replicare i dati DNS tra i server; ma ci sono altri protocolli che possono essere usati per questo (come rsync su ssh), ci può essere un rischio per la sicurezza dall'esporre i nomi, e le risposte al trasferimento di zona costano di più per generare e inviare rispetto alle normali ricerche DNS.

Commentari (0)