Topik ini menjelaskan titik akhir DNS over HTTPS (DoH), format permintaan dan tanggapan, serta semantik kesalahan dari Alibaba Cloud HTTPDNS.
1. Prasyarat
Setelah Anda mengonfigurasi layanan DoH, Anda dapat langsung memanggil API DoH untuk mendapatkan alamat IP hasil resolusi.
2. Detail API DoH
API ini mematuhi standar RFC 8484 dan mendukung metode GET maupun POST. Permintaan GET mengirimkan pesan DNS melalui parameter dns (Base64URL), sedangkan permintaan POST mengirimkan pesan DNS dalam badan permintaan biner.
2.1 Metode GET
Metode ini digunakan untuk mengirim pesan DNS yang dikodekan Base64URL sebagai parameter kueri URL. Berikut adalah format permintaan dan tanggapannya:
Permintaan
Metode:
GETJalur:
/dns-query?dns=<base64url(dns_wire_message)>Header permintaan:
Accept: application/dns-message
Parameter kueri:
dns(Wajib): String pesan DNS biner yang dikodekan Base64URL tanpa padding=.
Tanggapan
200: Berhasil. Badan tanggapan berupa
application/dns-message(konfirmasi DNS biner).400: Permintaan Salah. Kesalahan ini terjadi jika suatu parameter tidak valid, misalnya DoH belum diaktifkan atau parameter
dnstidak ada atau tidak valid.5xx: Kesalahan Server Internal.
Jika nama domain tidak ada dalam daftar resolusi nama domain, DoH akan mengembalikan kode status 200 tetapi tidak mengembalikan hasil resolusi.
2.2 Metode POST
Metode ini digunakan untuk mengirim pesan DNS biner secara langsung dalam badan permintaan. Berikut adalah format permintaan dan tanggapannya:
Permintaan
Metode: POST
Jalur:
/dns-queryHeader permintaan:
Content-Type: application/dns-messageAccept: application/dns-message
Badan permintaan:
Pesan DNS biner (format wire).
Tanggapan
200: Berhasil. Badan tanggapan berupa
application/dns-message(konfirmasi DNS biner).400: Permintaan Salah. Kesalahan ini terjadi jika suatu parameter tidak valid, misalnya DoH belum diaktifkan atau pesannya tidak valid.
5xx: Kesalahan Server Internal.
Jika nama domain tidak ada dalam daftar resolusi nama domain, DoH akan mengembalikan kode status 200 tetapi tidak mengembalikan hasil resolusi.
2.3 Contoh permintaan
Contoh Python berikut menunjukkan cara mengirim permintaan DoH untuk mengambil hasil resolusi untuk www.aliyun.com. Contoh ini memerlukan pustaka jaringan dnspython dan requests.
Contoh permintaan GET
Kode contoh
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import requests import base64 import dns.message def query_doh(domain, rrType): # Buat permintaan DNS request = dns.message.make_query(domain, rrType) request_data = request.to_wire() # Kodekan permintaan dalam format Base64URL base64_query = base64.urlsafe_b64encode(request_data).decode().rstrip("=") # Gunakan titik akhir DoH HTTPDNS url = f"https://1xxxx3.aliyunhttpdns.com/dns-query?dns={base64_query}" # Kirim permintaan GET headers = { "Accept": "application/dns-message" } response = requests.get(url, headers=headers) # Periksa kesalahan if response.status_code != 200: print(f"Error: {response.status_code}") return # Uraikan tanggapan response_data = response.content dns_response = dns.message.from_wire(response_data) # Ambil dan cetak alamat IP for answer in dns_response.answer: ttl = answer.ttl for item in answer.items: print(f"Answer: {item} TTL: {ttl}") if __name__ == "__main__": # Nama domain yang akan dikueri domain = "www.aliyun.com" rrType = "A" query_doh(domain, rrType)Hasil yang diharapkan
Answer: www-jp-de-intl-adns.aliyun.com. TTL: 3600 Answer: www-jp-de-intl-adns.aliyun.com.gds.alibabadns.com. TTL: 3600 Answer: www.aliyun.com.w.cdngslb.com. TTL: 3600 Answer: 61.164.xxx.xxx TTL: 3600 Answer: 183.146.xxx.xxx TTL: 3600 Answer: 60.188.xxx.xxx TTL: 3600 Answer: 122.228.xxx.xxx TTL: 3600
Contoh permintaan POST
Kode contoh
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import requests import dns.message def query_doh_post(domain, rrType): # Buat permintaan DNS request = dns.message.make_query(domain, rrType) request_data = request.to_wire() # Gunakan titik akhir DoH HTTPDNS url = "https://1xxxx3.aliyunhttpdns.com/dns-query" # Kirim permintaan POST headers = { "Accept": "application/dns-message", "Content-Type": "application/dns-message" } # Kirim langsung data format wire DNS sebagai badan POST response = requests.post(url, headers=headers, data=request_data) # Periksa kesalahan if response.status_code != 200: print(f"Error: {response.status_code}") return # Uraikan tanggapan response_data = response.content dns_response = dns.message.from_wire(response_data) # Ambil dan cetak alamat IP for answer in dns_response.answer: ttl = answer.ttl for item in answer.items: print(f"Answer: {item} TTL: {ttl}") if __name__ == "__main__": # Nama domain yang akan dikueri domain = "www.aliyun.com" rrType = "AAAA" query_doh_post(domain, rrType)Hasil yang diharapkan
Answer: www-jp-de-intl-adns.aliyun.com. TTL: 120 Answer: www-jp-de-intl-adns.aliyun.com.gds.alibabadns.com. TTL: 300 Answer: www.aliyun.com.w.cdngslb.com. TTL: 120 Answer: 240e:f7:7c00:xxxx:xxxx::xxxx TTL: 60 Answer: 240e:f7:7c00:xxxx:xxxx::xxxx TTL: 603. Ringkasan
Topik ini menjelaskan API DoH yang disediakan oleh HTTPDNS. Anda dapat merujuk pada detail API dan contoh kode untuk mengakses titik akhir DoH guna melakukan resolusi nama domain.