Sepanjang section ini kita mengetik server-kantor dan membiarkan resolver menerjemahkannya ke 192.0.2.10 — mekanisme sisi klien yang sudah kita bedah pada Chapter DNS
. Sekarang kita pindah kursi ke sisi server: siapa yang menjawab pertanyaan itu. Pada Chapter ini kita kenali dua peran DNS server — forward resolver dan authoritative server — beserta dua perangkatnya di Linux: BIND9 yang lengkap untuk mengelola zone sendiri, dan dnsmasq yang kecil untuk kantor sederhana. BIND tidak terpasang di mesin latihan, jadi zone file kita bedah lewat fixture, sementara formatnya kita periksa dengan awk seperti admin memeriksa konfigurasi sebelum diterapkan.
Forward atau Authoritative #
Dua kata ini sering tertukar padahal pekerjaannya berbeda. Forward resolver bekerja untuk klien: menerima pertanyaan “berapa alamat web.latihan.example.com?”, menjawab dari cache bila tahu, dan bertanya ke server DNS lain bila tidak — inilah yang dikerjakan resolver ISP, router kantor, atau 8.8.8.8. Authoritative server bekerja untuk domain miliknya: hanya menjawab pertanyaan tentang zone yang dikelolanya, dari data yang kita tulis sendiri, tanpa pernah bertanya ke pihak lain. Sebuah server boleh memegang keduanya sekaligus — begitulah kebiasaan kantor kecil — tetapi di jaringan besar kedua peran itu dipisah ke mesin berbeda.
Domain latihan.example.com kita kelola sendiri: setiap nama mesin kantor dicatat sebagai record di dalam zone file, dan setiap perubahan cukup dilakukan di satu tempat.
BIND9: named dan Zone File #
BIND adalah name server tertua yang masih dipakai luas; daemon-nya bernama named, terpasang di Debian lewat apt install bind9. Sebuah zone didaftarkan pada file named.conf.local dengan blok singkat:
zone "latihan.example.com" {
type master;
file "/etc/bind/db.latihan.example.com";
};type master berarti server ini sumber kebenaran zone tersebut (server slave akan menyalinnya), dan file menunjuk ke zone file tempat record disimpan. Zone file itulah inti pekerjaan kita — fixture berikut tersedia di bundle materi ini sebagai db.latihan.example.com:
cat db.latihan.example.comOutput yang Dihasilkan:
$ORIGIN latihan.example.com.
$TTL 86400
@ IN SOA ns1.latihan.example.com. admin.latihan.example.com. (
2026011501 ; serial: YYYYMMDDnn
3600 ; refresh
900 ; retry
604800 ; expire
86400 ) ; negative cache TTL
@ IN NS ns1
@ IN MX 10 mail
ns1 IN A 192.0.2.53
mail IN A 192.0.2.25
web IN A 192.0.2.55
www IN CNAME webMari kita bedah isi zone file tersebut baris demi baris:
$ORIGIN latihan.example.com.: nama dasar yang dilengkapi ke setiap nama pendek di bawahnya — menuliswebsama artinya denganweb.latihan.example.com.$TTL 86400: masa berlaku jawaban dalam detik (satu hari); selama itu, resolver lain boleh menyimpan jawaban kita di cache.@ IN SOA ns1... admin... (: pembuka record SOA (start of authority) — identitas zone.@berarti “zone ini sendiri”,INkelas internet,ns1name server utama,admin.latihan.example.com.alamat email admin dengan format khusus (titik pertama menggantikan@).2026011501 ; serial: nomor versi zone, kebiasaan menulisYYYYMMDDnn. Server slave membandingkan angka ini untuk tahu apakah perlu menyalin ulang — naikkan setiap mengubah record.3600 ; refresh,900 ; retry,604800 ; expire: jadwal server slave — berapa sering mengecek, menunggu berapa lama bila gagal, dan kapan menyerah.86400 ) ; negative cache TTL: masa cache jawaban “nama tidak ada” — penutup kurung SOA.@ IN NS ns1: record NS — serverns1adalah authoritative untuk zone ini.@ IN MX 10 mail: record MX — email untuk@latihan.example.comdikirim kemail, angka 10 prioritasnya (kecil = didahulukan).ns1,mail,web IN A ...: record A — masing-masing nama dipetakan ke satu alamat IPv4.www IN CNAME web: record CNAME — alias:wwwhanyalah nama lain untukweb.
Dua kebiasaan penulisan membedakan nama yang benar dan salah: nama yang berakhir titik (ns1.latihan.example.com.) sudah lengkap dan tidak ditambah $ORIGIN; nama tanpa titik (ns1) dilengkapi $ORIGIN secara otomatis.
SOA dalam Satu Tabel #
Kelima angka di dalam kurung SOA punya tugas masing-masing:
| Parameter | Nilai fixture | Arti |
|---|---|---|
| serial | 2026011501 | versi data; wajib naik setiap perubahan |
| refresh | 3600 | jeda slave mengecek master (detik) |
| retry | 900 | jeda mencoba lagi bila master tidak menjawab |
| expire | 604800 | batas slave memakai data lama (7 hari) |
| negative TTL | 86400 | masa cache jawaban “tidak ada” |
Urutannya kaku — serial refresh retry expire negative-TTL — dan named-checkconf/named-checkzone adalah pasangan alat resmi untuk memeriksa sintaksnya sebelum rndc reload menerapkan perubahan. Pemeriksaan serupa bisa disiapkan sendiri dengan awk; dua pertanyaan yang paling sering ditanyakan auditor: record jenis apa saja yang ada, dan siapa memegang alamat mana:
echo '== jumlah record per jenis =='
awk '$2 == "IN" && $3 !~ /^[0-9]+$/ && $3 != "SOA" {c[$3]++} END {for (t in c) print t, c[t]}' db.latihan.example.com | sort
echo '== pemetaan nama ke alamat (record A) =='
awk '$3 == "A" {printf "%-8s -> %s\n", $1, $4}' db.latihan.example.comOutput yang Dihasilkan:
== jumlah record per jenis ==
A 3
CNAME 1
MX 1
NS 1
== pemetaan nama ke alamat (record A) ==
ns1 -> 192.0.2.53
mail -> 192.0.2.25
web -> 192.0.2.55Pola pertama menghitung record per jenis dengan array asosiatif lalu mengurutkannya; pola kedua mencetak nama dan alamat record A berjajar rapi. Zone dengan sepuluh mesin terbaca dalam sekali lihat — kebiasaan kecil yang menghemat banyak saat insiden.
dnsmasq untuk Kantor Kecil #
BIND lengkap tetapi besar: daemon, zone, dan file konfigurasi tersendiri. Untuk kantor dengan satu server, dnsmasq menawarkan paket yang lebih ringkas — cache DNS forward, plus beberapa baris nama lokal, plus DHCP — dalam satu file /etc/dnsmasq.conf. Contoh isinya yang paling sering dipakai:
printf 'domain-needed\nbogus-priv\nserver=192.0.2.53\ncache-size=1000\naddress=/server-kantor/192.0.2.10\n' > dnsmasq.conf
cat dnsmasq.confOutput yang Dihasilkan:
domain-needed
bogus-priv
server=192.0.2.53
cache-size=1000
address=/server-kantor/192.0.2.10Lima baris tersebut bekerja sebagai berikut: domain-needed melarang meneruskan nama tanpa titik ke server hulu, bogus-priv menolak membalik alamat privat ke DNS publik, server=192.0.2.53 menunjuk server hulu yang ditanya bila cache kosong, cache-size=1000 menampung seribu jawaban, dan address=/server-kantor/192.0.2.10 memetakan satu nama tetap — cara cepat menggantikan entri /etc/hosts di banyak klien sekaligus. Satu baris dhcp-range=192.0.2.100,192.0.2.200,12h bahkan mengaktifkan DHCP sederhana bila diperlukan.
Menguji dengan dig dan nslookup #
Alat ujinya sama dengan sisi klien: dig bertanya langsung ke server pilihan kita lewat @alamat. Berikut contoh tampilan jawaban untuk nama alias www:
$ dig @192.0.2.53 +short www.latihan.example.com
web.latihan.example.com.
192.0.2.55
Dua baris jawaban itu adalah kerja CNAME: pertama alias www diterjemahkan ke web, lalu nama web diterjemahkan ke alamatnya. Perintah nslookup www.latihan.example.com 192.0.2.53 memberi jawaban serupa dalam format berbeda — berguna karena tersedia bawaan di banyak sistem tanpa memasang paket tambahan.
Split-Horizon: Dua Wajah Satu Nama #
Server DNS kantor yang sama kadang perlu menjawab berbeda tergantung penanyanya: klien internal mendapat alamat privat 192.0.2.55 untuk web, sementara dunia luar mendapat alamat publik. Tekniknya disebut split-horizon — dua definisi zone untuk nama yang sama, dipilih berdasarkan alamat sumber pertanyaan lewat view di BIND. Kesalahan paling umum bukan teknisnya, melainkan lupa bahwa dua versi data itu harus dirawat terpisah: ubah salah satu, dan sebagian jaringan melihat dunia yang berbeda.
Nama kini dijawab oleh server milik kita sendiri. Kita kembali ke jalur web untuk materi terakhir arah server: Nginx yang kita kenal di awal section dapat dipromosikan menjadi pintu depan beberapa aplikasi sekaligus — reverse proxy, chapter berikutnya.
Referensi lanjut: wiki Debian tentang BIND9 untuk paket dan tata letaknya di Debian, halaman manual named.conf(5) untuk sintaks konfigurasi, serta panduan dnsmasq di wiki Arch untuk opsi lengkapnya.