Scritp Python para múltiples consultas DNS
About
Script de consultas DNS en Python
El sistema de nombres de dominio (DNS) es el directorio de Internet. Las personas acceden a la información en línea a través de nombres de dominio como amazon.com o x.com. Los navegadores web interactúan mediante direcciones de Protocolo de Internet (IP). El DNS traduce los nombres de dominio a direcciones IP para que los navegadores puedan cargar los recursos de Internet. Cada dispositivo conectado a Internet tiene una dirección IP única que otros equipos pueden usar para encontrarlo. Los servidores DNS suprimen la necesidad de que los humanos memoricen direcciones IP tales como 192.168.1.100 (en IPv4) o nuevas direcciones IP alfanuméricas más complejas, tales como 2400:cb00:2048:1::c630:7b2 (en IPv6).

DNS Recursivo
El solucionador recursivo es el equipo que responde a una solicitud recursiva del cliente y dedica tiempo a detectar el registro DNS. Lo hace mediante una serie de solicitudes hasta que alcanza al servidor de nombres DNS autoritativo para el registro solicitado (o se vuelve inactivo o devuelve un error si no se encuentra ningún registro). Afortunadamente, los solucionadores de DNS recursivos no siempre tienen que hacer varias solicitudes para inspeccionar los registros necesarios para responder a un cliente. El almacenamiento en caché es un proceso de persistencia de datos que ayuda a saltarse las solicitudes necesarias sirviendo antes el registro del recurso solicitado en la búsqueda DNS.
DNS Autoritativo
Un servidor DNS autoritativo es un servidor que alberga realmente registros de recursos DNS y es responsable de los mismos. Este es el servidor al final de la cadena de búsqueda DNS que responderá con el registro del recurso consultado, permitiendo finalmente que el navegador web haga la solicitud para llegar a la dirección IP necesaria para acceder a un sitio web u otros recursos web. Un servidor de nombres autoritativo puede satisfacer solicitudes de sus propios datos sin necesidad de consultar a otros recursos, ya que es la fuente final de verdad para ciertos registros DNS.
TLD (Top Level Domain)
El servidor de dominio de nivel superior (TLD) se puede comparar con una estantería de libros en una biblioteca. Es el paso siguiente en la búsqueda de una dirección IP específica y aloja la última parte de un nombre de servidor (en example.com, el servidor TLD es "com").
Tipos de Registros DNS
Los registros DNS son recursos que se utilizan para almacenar información asociada a un nombre de dominio. Algunos tipos de registros DNS comunes incluyen:
- Registro A (Address): Mapea un nombre de dominio a una dirección IP.
- Registro AAAA (Address): El registro que contiene la dirección IPv6 de un dominio (a diferencia de los registros A, que enumeran la dirección IPv4).
- Registro CNAME (Canonical Name): Reenvía un dominio o subdominio a otro dominio, NO proporciona una dirección IP.
- Registro MX (Mail Exchanger): Dirige el correo a un servidor de correo electrónico.
- Registro TXT (Text): Permite que un administrador pueda almacenar notas de texto en el registro. Estos registros se suelen
- Registro NS (Name Server): Almacena el servidor de nombres para una entrada DNS.
- Registro SOA (Start of Authority): Almacena la información del administrador sobre un dominio.
- Registro SRV (Service): Especifica un puerto para servicios específicos.
- Registro PTR (Pointer): Proporciona un nombre de dominio en búsquedas inversas.
Código Python para realizar consultas DNS
import dns.resolver
import dns.exception
import time
resolver = dns.resolver.Resolver()
dns_servers = ["1.0.0.1","8.8.4.4","8.26.56.26"]
with open('listadoDNS.txt', 'r') as f:
domains = [line.strip() for line in f.readlines()]
for domain in domains:
print(f'############### DOMAIN - {domain} ##################')
for dns_server in dns_servers:
try:
print(f'TESTING IN DNS SERVER -----> "{dns_server}"')
resolver.nameservers = [dns_server]
for rdata in resolver.query(domain):
print(f'Query: {domain}, IP Address: {rdata}')
time.sleep(1)
except dns.exception.DNSException as e:
if isinstance(e, dns.resolver.NXDOMAIN):
print("Dominio no encontrado " + str(e))
elif isinstance(e, dns.resolver.Timeout):
print("Tiempo de respuesta alto de resolución" + str(e))
else:
print("Error no controlado")