Cara Mendapatkan Hasil DNS dengan curl

Memperkenalkan cara menggunakan perintah curl untuk mengambil hasil query DNS dalam dua format.

Artikel ini memperkenalkan dua cara menggunakan curl untuk mengambil hasil query DNS:

  1. Format DNS JSON
  2. Format DNS Wire Format

1. Query DNS Format JSON

Mengembalikan respons DNS dalam format JSON, mudah untuk di-parse.

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

# Belum didukung

2. Query DNS Format Wire Format

Mengembalikan respons DNS dalam format biner, perlu parsing lebih lanjut.

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

Meng-parse Respons DNS Meng menggunakan Python

# pip install dnspython
# pip install requests
# Parse respons format JSON
import json
import requests

def query_dns_json(domain="example.com", type="A"):
  """Query DNS dengan format 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)

# Parse respons format Wire Format
def query_dns_wire(domain="example.com"):
  """Query DNS dengan format Wire Format"""
  import dns.message
  import requests
  import base64

  # Buat pesanan query DNS
  query = dns.message.make_query(domain, 'A')
  wire_format = query.to_wire()
  dns_query = base64.b64encode(wire_format).decode('utf-8')

  # Kirim permintaan
  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("Hasil query format JSON:")
  print(query_dns_json())
  print("\nHasil query Wire Format:")
  print(query_dns_wire())

Menghasilkan Data Terenkoded Base64 DNS Wire Format

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

# Buat satu pesanan query DNS
query = dns.message.make_query('example.com', dns.rdatatype.A)

# Ubah pesanan ke Wire Format
wire_format = query.to_wire()

# Ubah ke base64
wire_format_base64 = base64.b64encode(wire_format).decode('utf-8')

# Cetak
print(wire_format_base64)