DNS (Domain Name System) adalah buku kontak internet: dia menerjemahkan nama seperti catatan.example.com jadi alamat IP seperti 203.0.113.10, karena komputer cuma bisa tersambung lewat IP. Bayangin kontak di HP-mu. Kamu cukup mengetik "Sari", HP yang mencarikan nomornya. Kalau Sari ganti nomor, kontak di HP teman-temannya masih nomor lama sampai mereka memperbaruinya. DNS persis begitu, termasuk masalah nomor lamanya.
🧪 Tebakan cepat: record A
catatan.example.compunya TTL 3600. Jam 09:50, resolver 1.1.1.1 bertanya dan dapat203.0.113.10(web-1). Jam 10:00 kamu ganti record itu ke203.0.113.20(web-2). Sampai jam berapa resolver itu masih menjawab IP lama? Tebak dulu, jawabannya ada di bagian "TTL: kenapa perubahan butuh waktu".
Record di zona example.com
Semua record sebuah domain dikumpulkan di satu zona, yang dipegang authoritative nameserver: server yang punya jawaban resmi. example.com adalah domain yang dicadangkan khusus untuk contoh, jadi di pelajaran ini anggap zonanya milik tim catatan-api. Authoritative-nya a.iana-servers.net dan b.iana-servers.net, dan record untuk catatan-api, sama dengan yang ada di Lab:
catatan.example.com. 3600 IN A 203.0.113.10
catatan.example.com. 3600 IN AAAA 2001:db8::10
www.catatan.example.com. 3600 IN CNAME catatan.example.com.
catatan.example.com. 3600 IN MX 1 smtp.google.com.
catatan.example.com. 3600 IN TXT "v=spf1 include:_spf.google.com ~all"
Tiap baris: nama, TTL (detik), kelas (IN = internet), tipe, nilai. Titik di akhir nama menandai nama lengkap.
- A: nama ke alamat IPv4.
catatan.example.comke web-1,203.0.113.10. - AAAA: nama ke alamat IPv6,
2001:db8::10, untuk pengunjung yang tersambung lewat IPv6. - CNAME: alias ke nama lain.
www.catatan.example.comartinya "pakai saja jawabancatatan.example.com", jadi resolver bertanya sekali lagi. IP web-1 cukup ditulis di satu tempat. - MX: server email untuk nama ini, dengan angka prioritas (kecil = dicoba duluan). Email ke
[email protected]dikirim ke Google Workspace. - TXT: teks bebas. Dipakai untuk SPF (server mana yang boleh mengirim email atas nama domain ini) dan bukti kepemilikan domain.
- NS: nameserver yang memegang zona. Record NS
example.comdisimpan di server.com, supaya dunia tahu harus bertanya ke mana.
Bertanya dengan dig
dig menanyakan record ke DNS dan mencetak jawabannya. @1.1.1.1 artinya bertanya ke resolver Cloudflare. +noall +answer artinya cetak bagian jawabannya saja:
$ dig @1.1.1.1 www.catatan.example.com +noall +answer
www.catatan.example.com. 3600 IN CNAME catatan.example.com.
catatan.example.com. 3600 IN A 203.0.113.10
- Resolver mengikuti CNAME untukmu: dia menjawab aliasnya, lalu record A tujuannya. Rantainya
www.catatan.example.comlalucatatan.example.com. - Tanpa
+noall +answer, dig mencetak laporan lengkap:status: NOERROR(ketemu) ataustatus: NXDOMAIN(nama itu gak ada), bagian pertanyaan, waktu, dan server yang menjawab. dig @a.iana-servers.net catatan.example.combertanya langsung ke authoritative, melewati semua cache. Itu jawaban yang paling baru.dig catatan.example.com MXmenanyakan tipe lain. Tanpa tipe, dig menanyakan A.
Perjalanan satu pertanyaan
Resolver (misalnya 1.1.1.1 milik Cloudflare atau 8.8.8.8 milik Google) adalah server yang mencarikan jawaban untukmu dan menyimpannya di cache. Kalau belum ada di cache, dia bertanya berjenjang, dan dig +trace mengulang perjalanan itu langkah demi langkah:
| Langkah | Yang ditanya | Jawabannya |
|---|---|---|
| 1 | resolver 1.1.1.1 | daftar 13 root server, a.root-servers.net sampai m |
| 2 | root server, misalnya l.root-servers.net |
"aku gak tahu, tanya server .com" (a.gtld-servers.net sampai m) |
| 3 | server TLD .com, misalnya e.gtld-servers.net |
"example.com diurus a.iana-servers.net dan b" |
| 4 | authoritative a.iana-servers.net |
catatan.example.com A 203.0.113.10, TTL 3600 |
Dua langkah terakhir di output dig @1.1.1.1 +trace +nodnssec catatan.example.com (+nodnssec menyembunyikan tanda tangan DNSSEC supaya ringkas):
example.com. 172800 IN NS a.iana-servers.net.
example.com. 172800 IN NS b.iana-servers.net.
;; Received 96 bytes from 192.12.94.30#53(e.gtld-servers.net) in 24 ms
catatan.example.com. 3600 IN A 203.0.113.10
;; Received 64 bytes from 199.43.135.53#53(a.iana-servers.net) in 8 ms
Root dan TLD gak tahu IP catatan.example.com. Mereka cuma menunjuk ke server berikutnya, sampai authoritative yang menjawab. Cache browser dan OS sebelum semua ini dibahas di pelajaran DNS di Web Fundamentals.
TTL: kenapa perubahan butuh waktu
TTL (Time To Live) adalah berapa detik sebuah jawaban boleh disimpan di cache. Selama TTL belum habis, resolver menjawab dari cache tanpa bertanya lagi, dan dig menampilkan sisa TTL-nya, yang terus berkurang. Dengan TTL 3600:
| Jam | Kejadian | Jawaban resolver 1.1.1.1 |
|---|---|---|
| 09:50 | resolver bertanya ke authoritative, menyimpan jawabannya 3600 detik | 203.0.113.10, TTL 3600 |
| 10:00 | kamu ganti A ke 203.0.113.20 |
203.0.113.10, sisa 3000 |
| 10:30 | authoritative sudah menjawab IP baru | 203.0.113.10, sisa 1200 |
| 10:50 | cache habis, resolver bertanya lagi | 203.0.113.20, TTL 3600 |
Resolver itu baru ikut jam 10:50. Itu jawaban tebakannya. Yang disebut "propagasi DNS" sebenarnya cuma menunggu cache di ribuan resolver di seluruh dunia habis satu per satu. Gak ada yang mengirim perubahanmu ke mereka.
Resep pindah server catatan-api dari web-1 ke web-2:
- Sehari sebelumnya, turunkan TTL record A dan AAAA ke 300 (5 menit). Tunggu minimal TTL lama (1 jam) supaya semua cache menyimpan versi TTL 300.
- Ganti IP-nya ke web-2. Paling lama 5 menit kemudian, semua resolver ikut.
- Biarkan web-1 tetap menyala sampai lalu lintasnya habis, lalu naikkan TTL lagi ke 3600 supaya resolver gak terlalu sering bertanya.
Mengikuti CNAME di kode
Di latihan, kamu menulis resolver mini: zona berupa array { name, type, value, ttl }, dan function yang mengikuti CNAME sampai ketemu tipe yang diminta:
function resolveDns(zone, domain, type) {
const chain = [];
let current = domain;
for (let hop = 0; hop < 10; hop++) {
chain.push(current);
const direct = zone.find((r) => r.name === current && r.type === type);
if (direct) return { value: direct.value, ttl: direct.ttl, chain };
const alias = zone.find((r) => r.name === current && r.type === "CNAME");
if (!alias) return { error: "NXDOMAIN" };
current = alias.value;
}
return { error: "NXDOMAIN" };
}
| Panggilan | Hasil |
|---|---|
resolveDns(zone, "catatan.example.com", "A") |
{ value: "203.0.113.10", ttl: 3600, chain: ["catatan.example.com"] } |
resolveDns(zone, "www.catatan.example.com", "A") |
{ value: "203.0.113.10", ttl: 3600, chain: ["www.catatan.example.com", "catatan.example.com"] } |
resolveDns(zone, "blog.catatan.example.com", "A") |
{ error: "NXDOMAIN" } |
chainmencatat setiap nama yang dilewati, termasuk nama asalnya.- Urutan key di object hasil harus
value,ttl,chain, karena hasilnya dibandingkan sebagai teks JSON. hop < 10menjaga dari CNAME yang saling menunjuk (akeb,bkea), yang kalau gak dibatasi berputar selamanya.- Di DNS sungguhan, nama yang ada tapi gak punya record tipe itu dijawab
NOERRORdengan jawaban kosong, bukanNXDOMAIN. Latihan ini menyederhanakannya.
⚠️ Jebakan yang sering ketemu
- Ganti IP tanpa menurunkan TTL dulu. Dengan TTL 86400 (1 hari), sebagian pengunjung masih dikirim ke server lama sampai sehari penuh.
- AAAA lupa diganti. Pindah server tapi cuma mengubah A: pengunjung lewat IPv6 masih sampai ke server lama.
- CNAME di apex. Nama utama sebuah zona (apex, misalnya
example.comsendiri) gak boleh CNAME, karena di sana sudah ada record NS dan SOA, dan CNAME gak boleh berdampingan dengan record lain. Pakai A/AAAA, atau fitur "CNAME flattening" seperti di Cloudflare. - Mengecek dari satu tempat saja. Resolver-mu mungkin masih memegang cache lama. Bandingkan dengan
dig @a.iana-servers.net(jawaban resmi) sebelum menyimpulkan perubahannya gagal.
TL;DR: DNS menerjemahkan nama jadi IP. Record utama: A (IPv4), AAAA (IPv6), CNAME (alias ke nama lain, gak boleh di apex), MX (server email, dengan prioritas), TXT (teks bebas, misalnya SPF dan verifikasi), NS (siapa authoritative-nya). Resolver mencari dari root, lalu server TLD, lalu authoritative, dan dig +trace menampilkan perjalanan itu; dig @1.1.1.1 nama bertanya ke resolver, dig @a.iana-servers.net nama ke authoritative. Resolver menyimpan jawaban selama TTL, jadi perubahan baru terlihat setelah cache lama habis: turunkan TTL ke sekitar 300 sebelum pindah server, supaya perubahan IP cepat terlihat.