Episode ini memperdalam dnsdist: kebijakan load balancing seperti leastOutstanding, roundrobin, dan hash, health check backend dengan failover, konfigurasi packet cache dan dynamic rules, serta scripting Lua untuk pemilihan server, rate limit per klien, dan logging query.

dnsdist yang dipakai secara dasar sudah menyeimbangkan beban dan melindungi pintu masuk. Episode 17 membawanya ke level berikutnya: kebijakan yang bisa disesuaikan, cache yang memangkas beban backend, dan scripting Lua yang membuat dnsdist bertindak sesuai logika bisnis kalian — dari memilih backend hingga membatasi klien tertentu.
Di sini dnsdist berubah dari alat menjadi platform. Kalian akan menulis aturan, bukan sekadar membaca konfigurasi.
Selain leastOutstanding dan roundrobin, dnsdist menyediakan policy berbasis hash yang membuat klien yang sama selalu dilayani backend yang sama — penting untuk cache affinity:
setServerPolicy(leastOutstanding)
setServerPolicy(roundrobin)
setServerPolicy(chash)setServerPolicy(chash) memakai consistent hashing: alamat klien dipetakan ke backend, dan perubahan jumlah backend hanya memindahkan sebagian kecil kunci. Ini menjaga efektivitas cache ketika backend ditambah atau dihapus.
Health check menentukan apakah backend layak menerima query. Ketika sebuah backend gagal, dnsdist menandainya down dan mengalihkan beban otomatis:
newServer({ address="192.0.2.11:53", checkName="example.com",
checkType="A", checkTimeout=500, maxCheckFailures=3 })Konfigurasi di atas memeriksa example.com A setiap interval. Setelah tiga kali gagal, backend ditandai down dan query dialihkan ke yang sehat — failover berjalan tanpa intervensi manusia.
Packet cache menyimpan jawaban lengkap sehingga query identik dijawab langsung tanpa menyentuh backend:
pc = newPacketCache(10000)
getPool("") : setCache(pc)
setCacheHitResponseRule(AllRule(), AllowResponseRule())newPacketCache(10000) membuat cache 10 ribu entri. Query yang cocok dijawab dari cache — backend lega, latensi turun drastis.
Dynamic rules memungkinkan blokir otomatis berdasarkan perilaku:
addAction(MaxQPSIPRule(20, 32, 64), TCAction())Baris di atas memblokir sementara klien yang melebihi 20 qps. MaxQPSIPRule memicu aksi TC untuk sumber yang agresif — proteksi DDoS yang beradaptasi sendiri.
Lua memberi kalian kontrol penuh atas setiap query yang lewat:
function onClientRequest(dq)
infolog("Query dari " .. dq.remoteaddr .. " untuk " .. dq.qname)
return DNSAction.None
endFungsi onClientRequest dipanggil untuk setiap query masuk. Contoh di atas mencatat alamat klien dan nama yang ditanyakan ke syslog — dasar dari audit dan analisis.
Batas per klien bisa dibuat lebih halus dari aturan bawaan:
local limits = newNMG()
addAction(AndRule({QTypeRule(DNSQType.SOA), NotRule(makeRule(limits))}), DropAction())Dengan aturan Lua seperti di atas, klien di luar daftar limits yang mengirim SOA berlebihan akan di-drop. Ini menunjukkan kekuatan komposisi: aturan kecil dirangkai menjadi kebijakan kompleks.
dnsdist bisa mengarahkan query berbeda ke backend berbeda:
addAction(QNameRule("internal.example.com"), PoolAction("internal"))
addAction(AllRule(), PoolAction("internet"))PoolAction mengarahkan query ke pool tertentu. Query untuk internal.example.com pergi ke pool Authoritative internal, sisanya ke pool Recursor internet — split-horizon dalam satu frontend.
Setiap perubahan konfigurasi wajib diuji:
sudo systemctl restart dnsdist
dnsdist -c
showServers()
showStats()
quit()showStats() menampilkan metrik seperti query per detik, cache hits, dan jumlah blokir. Pastikan angka cache hits naik setelah packet cache aktif — itu bukti kerja keras kalian.
Episode 17 membuat dnsdist melayani kebutuhan spesifik: policy yang sesuai, health check dengan failover, packet cache yang meringankan backend, dan scripting Lua untuk routing, rate limit, dan logging yang tak mungkin dicapai konfigurasi statis.
Inti yang harus dibawa pulang:
chash memberi cache affinity; leastOutstanding menyeimbangkan beban dinamis.onClientRequest, addAction, PoolAction) memberi kontrol penuh per query.showStats adalah bukti bahwa konfigurasi bekerja seperti yang diharapkan.Di episode 18 selanjutnya kita akan membahas high availability dan redundancy — redundant authoritative dengan hidden primary dan secondary publik, distribusi geografis, NOTIFY yang handal, serta multi-instance recursor di belakang dnsdist dengan ECMP dan anycast untuk skala besar.