¿Cómo puedo listar TODOS los registros DNS?

¿Hay alguna forma de listar TODOS los registros DNS de un dominio?

Conozco cosas como dig y nslookup pero sólo llegan hasta cierto punto. Por ejemplo, si tengo un registro A de un subdominio como

test A somedomain.co.uk

entonces a menos que lo pida específicamente, por ejemplo

dig any test.somedomain.co.uk

No puedo verlo.

Hay alguna forma (que no sea mirar los registros yendo al gestor de DNS) de ver exactamente cuáles son todos los registros DNS?

Solución

Cuando se consulta ANY se obtiene una lista de todos los registros de ese nivel, pero no de los inferiores.

# try this
dig google.com any

Esto puede devolver registros A, registros TXT, registros NS, registros MX, etc. si el nombre de dominio es exactamente "google.com". Sin embargo, no devolverá registros hijos (por ejemplo, www.google.com). Más concretamente, PUEDE obtener estos registros si existen. El servidor de nombres no tiene que devolver estos registros si decide no hacerlo (por ejemplo, para reducir el tamaño de la respuesta).

Un AXFR es una transferencia de zona y es probablemente lo que usted quiere. Sin embargo, suelen estar restringidos y no están disponibles a menos que usted controle la zona. Por lo general, realizará una transferencia de zona directamente desde el servidor autoritativo (el @ns1.google.com de abajo) y, a menudo, desde un servidor de nombres que puede no estar publicado (un servidor de nombres oculto).

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

Si tiene el control de la zona, puede configurarla para obtener transferencias protegidas con una clave TSIG. Se trata de un secreto compartido que el cliente puede enviar al servidor para autorizar la transferencia.

Comentarios (6)

A falta de poder hacer transferencias de zona, escribí este pequeño 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

Ahora utilizo dg ejemplo.com para obtener una bonita y limpia lista de registros DNS, o dg ejemplo.com x para incluir un montón de otros subdominios populares.

El comando grep -vE "${wild_ips}" filtra los registros que podrían ser el resultado de una entrada DNS comodín como * 10800 IN A 1.38.216.82. De lo contrario, una entrada comodín haría parecer que hay registros para cada $COMMON_SUBDOMAN.

Nota: Esto se basa en las consultas ANY, que están bloqueadas por algunos proveedores de DNS como CloudFlare.

Comentarios (1)

Lo que quieres se llama transferencia de zona. Puede solicitar una transferencia de zona utilizando dig -t axfr.

Una zona es un dominio y todos los dominios por debajo de él que no están delegados en otro servidor.

Tenga en cuenta que las transferencias de zona no siempre son compatibles. No se usan en la búsqueda normal, sólo en la replicación de datos DNS entre servidores; pero hay otros protocolos que pueden usarse para eso (como rsync sobre ssh), puede haber un riesgo de seguridad al exponer los nombres, y las respuestas de transferencia de zona cuestan más de generar y enviar que las búsquedas DNS habituales.

Comentarios (0)