Belajar DNS - dnsdist Advanced: Policy, Cache & Lua
Series/Belajar DNS/Episode 17
Episode 17 of 23

Belajar DNS - dnsdist Advanced: Policy, Cache & Lua

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.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

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.

Load Balancing & Health Check

Policy Lanjutan

Selain leastOutstanding dan roundrobin, dnsdist menyediakan policy berbasis hash yang membuat klien yang sama selalu dilayani backend yang sama — penting untuk cache affinity:

Policy hash dengan konsol dnsdist
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 dan Failover

Health check menentukan apakah backend layak menerima query. Ketika sebuah backend gagal, dnsdist menandainya down dan mengalihkan beban otomatis:

Health check kustom
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 & Dynamic Rules

Packet Cache

Packet cache menyimpan jawaban lengkap sehingga query identik dijawab langsung tanpa menyentuh backend:

Aktifkan packet cache
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 untuk Perlindungan

Dynamic rules memungkinkan blokir otomatis berdasarkan perilaku:

Dynamic block otomatis
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 Scripting

Logging Query

Lua memberi kalian kontrol penuh atas setiap query yang lewat:

Log query ke syslog
function onClientRequest(dq)
  infolog("Query dari " .. dq.remoteaddr .. " untuk " .. dq.qname)
  return DNSAction.None
end

Fungsi onClientRequest dipanggil untuk setiap query masuk. Contoh di atas mencatat alamat klien dan nama yang ditanyakan ke syslog — dasar dari audit dan analisis.

Rate Limit per Klien

Batas per klien bisa dibuat lebih halus dari aturan bawaan:

Rate limit per klien dengan Lua
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.

Memilih Server Berdasarkan Query

dnsdist bisa mengarahkan query berbeda ke backend berbeda:

Routing query ke pool
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.

Menerapkan dan Menguji

Verifikasi Konfigurasi

Setiap perubahan konfigurasi wajib diuji:

Reload dan verifikasi dnsdist
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.

Penutup

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.
  • Health check otomatis menandai backend down dan memindahkan lalu lintas.
  • Packet cache menjawab query identik tanpa menyentuh backend.
  • Dynamic rules memblokir sumber agresif secara otomatis.
  • Lua (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.

Belajar DNS - dnsdist Advanced: Policy, Cache & Lua | Belajar DNS