Utilizar curl para obtener resultados DNS

Introducción de dos métodos para usar el comando curl para obtener resultados de consulta DNS.

Este artículo presenta dos métodos para utilizar curl para obtener resultados de consulta DNS:

  1. Formato JSON DNS
  2. Formato Wire Format DNS

1. Consulta en formato JSON DNS

Devuelve una respuesta DNS en formato JSON, fácil de analizar.

Google

curl -H 'accept: application/dns-json' "https://dns.google/resolve?name=baidu.com&type=A" | jq .

Cloudflare

curl -H 'accept: application/dns-json' 'https://cloudflare-dns.com/dns-query?name=baidu.com&type=A' | jq .

Aliyun

curl -H "accept: application/dns-json" "https://223.5.5.5/resolve?name=baidu.com&type=1" | jq .

dns.pub

curl -H 'accept: application/dns-json' 'https://doh.dns.pub/dns-query?name=baidu.com&type=A' | jq .

AdGuard Private DNS

# No soportado temporalmente

2. Consulta en formato DNS Wire Format

Devuelve una respuesta DNS en formato binario, que necesita un análisis adicional.

Google

curl -H 'accept: application/dns-message' 'https://dns.google/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB'  | hexdump -c

Cloudflare

curl -H 'accept: application/dns-message' 'https://cloudflare-dns.com/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB'  | hexdump -c

Aliyun

curl -H 'accept: application/dns-message' "https://dns.alidns.com/dns-query?dns=P8QBAAABAAAAAAAABWJhaWR1A2NvbQAAAQAB"  | hexdump -c

dns.pub

curl -H 'accept: application/dns-message' 'https://doh.dns.pub/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB'  | hexdump -c

AdGuard Private DNS

curl -H 'accept: application/dns-message' 'https://public0.adguardprivate.com/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB'  | hexdump -c

Uso de Python para analizar respuestas DNS

# pip install dnspython
# pip install requests
# Analizar respuestas en formato JSON
import json
import requests

def query_dns_json(domain="example.com", type="A"):
  """Consultar DNS usando formato JSON"""
  url = "https://dns.google/resolve"
  params = {"name": domain, "type": type}
  headers = {"accept": "application/dns-json"}

  response = requests.get(url, params=params, headers=headers)
  return json.dumps(response.json(), indent=2)

# Analizar respuestas en formato Wire Format
def query_dns_wire(domain="example.com"):
  """Consultar DNS usando formato Wire Format"""
  import dns.message
  import requests
  import base64

  # Crear mensaje de consulta DNS
  query = dns.message.make_query(domain, 'A')
  wire_format = query.to_wire()
  dns_query = base64.b64encode(wire_format).decode('utf-8')

  # Enviar solicitud
  url = "https://dns.google/dns-query"
  params = {"dns": dns_query}
  headers = {"accept": "application/dns-message"}

  response = requests.get(url, params=params, headers=headers)
  dns_response = dns.message.from_wire(response.content)
  return str(dns_response)

if __name__ == "__main__":
  print("Resultado de consulta en formato JSON:")
  print(query_dns_json())
  print("\nResultado de consulta en formato Wire Format:")
  print(query_dns_wire())

Generar datos codificados en Base64 en formato DNS Wire Format

# pip install dnspython
import base64
import dns.message
import dns.rdatatype

# Crear un mensaje de consulta DNS
query = dns.message.make_query('example.com', dns.rdatatype.A)

# Convertir el mensaje a formato Wire Format
wire_format = query.to_wire()

# Convertir a base64
wire_format_base64 = base64.b64encode(wire_format).decode('utf-8')

# Imprimir
print(wire_format_base64)