$type=ticker$cols=4

$type=slider$meta=0$snip=0$rm=0

Membangun Sinkhole DNS & Recursive Resolver Pribadi: Integrasi Pi-hole dan Unbound di Docker Compose

Setiap kali perangkat Anda berselancar di internet—mulai dari membuka website, streaming video, hingga komunikasi aplikasi latar belakang...

Membangun Server DNS Sinkhole dan Recursive Resolver Unbound dengan Pi-hole di Docker Compose

Setiap kali perangkat Anda berselancar di internet—mulai dari membuka website, streaming video, hingga komunikasi aplikasi latar belakang—langkah pertama yang selalu dieksekusi adalah penguraian alamat nama domain melalui Domain Name System (DNS). Sayangnya, secara default, hampir seluruh traffic DNS dikirim dalam teks biasa (plaintext) dan dialihkan ke upstream resolver publik milik ISP, Google (8.8.8.8), atau Cloudflare (1.1.1.1). Hal ini membuka celah profiling data perilaku pengguna, pelacakan privasi iklan, hingga potensi manipulasi sensor DNS (DNS hijacking).

Kombinasi antara Pi-hole dan Unbound merupakan standar emas solusi jaringan mandiri. Pi-hole bertindak sebagai DNS Sinkhole di garis depan yang memblokir jutaan domain iklan dan tracker berbahaya sebelum mereka sempat diunduh oleh klien. Sementara itu, Unbound berperan sebagai Recursive DNS Resolver lokal yang berbicara langsung dengan 13 Root DNS Servers dunia (Root hints: a.root-servers.net s.d. m.root-servers.net), mengeliminasi ketergantungan pada DNS perantara mana pun.

Pada artikel ini, kita akan mengemas kedua layanan tersebut ke dalam satu stack terisolasi menggunakan Docker Compose lengkap dengan validasi integritas kriptografis DNSSEC.

1. Arsitektur Alur Resolusi Pi-hole + Unbound

Mekanisme kerja terintegrasi dari stack DNS lokal ini terbagi menjadi tahapan berikut:

  1. Client Query: Laptop, smartphone, atau IoT mengirim permintaan resolusi DNS (port 53 UDP/TCP) ke IP server Pi-hole lokal.
  2. Sinkhole Filter (Pi-hole): Pi-hole mencocokkan domain dengan adlists dan regex blacklist lokal. Jika domain terdaftar sebagai iklan, pelacak malware, atau telemetri, Pi-hole langsung membalas dengan respon 0.0.0.0 (blocked).
  3. Recursive Lookup (Unbound): Jika domain bersih dan valid, query diteruskan ke Unbound via port khusus (misal: port 5335).
  4. Iterative Query to Root: Unbound menghubungi Root DNS Server, lalu Top-Level Domain (TLD) Server (.id, .com, .org), hingga Authoritative Nameserver resmi domain tersebut. Unbound juga memverifikasi tanda tangan digital DNSSEC untuk memastikan jawaban DNS tidak dipalsukan di tengah jalan.
  5. Caching & Delivery: Hasil resolusi di-cache di memori lokal server untuk query berikutnya, sehingga waktu respon berkurang drastis menjadi sub-milidetik (< 1ms).

2. Menonaktifkan Listener Port 53 pada systemd-resolved Host

Distribusi Linux modern seperti Ubuntu Server mengaktifkan systemd-resolved secara default, yang mendengarkan (listen) pada 127.0.0.53:53. Hal ini akan menyebabkan konflik bind: address already in use saat container Docker mencoba membuka port 53.

Jalankan langkah mitigasi berikut di host Linux:

# Nonaktifkan DNSStubListener di systemd-resolved
sudo tee -a /etc/systemd/resolved.conf <<EOF
DNSStubListener=no
EOF

# Update symlink resolv.conf ke file resolv statis
sudo rm -f /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

# Restart service systemd-resolved
sudo systemctl restart systemd-resolved

Pastikan port 53 sudah bebas dari proses host:

sudo ss -tulpn | grep :53
# Jika output kosong, port 53 sudah siap digunakan oleh container Docker

3. Menyusun File Konfigurasi Unbound (unbound.conf)

Buat direktori proyek dan siapkan file konfigurasi optimal untuk daemon Unbound:

mkdir -p ~/dns-stack/pihole ~/dns-stack/unbound && cd ~/dns-stack
nano unbound/unbound.conf

Isikan konfigurasi berikut yang telah dioptimalkan untuk performa dan keamanan DNSSEC:

server:
    verbosity: 1
    interface: 0.0.0.0
    port: 5335
    do-ip4: yes
    do-udp: yes
    do-tcp: yes

    # Izinkan query hanya dari subnet internal Docker
    access-control: 127.0.0.0/8 allow
    access-control: 172.16.0.0/12 allow
    access-control: 192.168.0.0/16 allow
    access-control: 10.0.0.0/8 allow

    # Validasi DNSSEC
    auto-trust-anchor-file: "/var/lib/unbound/root.key"

    # Privasi & Keamanan
    hide-identity: yes
    hide-version: yes
    harden-glue: yes
    harden-dnssec-stripped: yes
    use-caps-for-id: no
    edns-buffer-size: 1232
    prefetch: yes
    num-threads: 1

    # Buffer cache
    msg-cache-size: 32m
    rrset-cache-size: 64m

4. Menjalankan Stack dengan Docker Compose

Buat file docker-compose.yml di direktori root ~/dns-stack:

nano docker-compose.yml

Gunakan konfigurasi deklaratif berikut:

services:
  unbound:
    image: mvance/unbound:latest
    container_name: unbound
    restart: unless-stopped
    volumes:
      - ./unbound/unbound.conf:/opt/unbound/etc/unbound/unbound.conf:ro
    networks:
      dns-network:
        ipv4_address: 172.20.0.2

  pihole:
    image: pihole/pihole:latest
    container_name: pihole
    restart: unless-stopped
    depends_on:
      - unbound
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "8088:80/tcp"  # Web Dashboard Pi-hole diakses via http://IP_HOST:8088/admin
    environment:
      TZ: 'Asia/Makassar'
      WEBPASSWORD: 'PasswordAdminKuat123!'
      FTLCONF_LOCAL_IPV4: '192.168.12.100'
      # Hubungkan langsung ke Unbound di port 5335
      PIHOLE_DNS_: '172.20.0.2#5335'
      DNSSEC: 'true'
    volumes:
      - ./pihole/etc-pihole:/etc/pihole
      - ./pihole/etc-dnsmasq.d:/etc/dnsmasq.d
    networks:
      dns-network:
        ipv4_address: 172.20.0.3

networks:
  dns-network:
    name: dns-net
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24

Jalankan stack container:

docker compose up -d
docker compose ps

5. Verifikasi Fungsionalitas & Pengujian Validasi DNSSEC

Uji resolusi DNS langsung ke server lokal Anda menggunakan perintah dig:

# Test resolusi domain umum
dig @127.0.0.1 -p 53 google.com

# Test validasi DNSSEC (Domain dengan DNSSEC valid wajib mengembalikan flag ad: authenticated data)
dig @127.0.0.1 -p 53 sigok.verteiltesysteme.net +dnssec | grep "flags:"

# Test domain dengan DNSSEC corrupt/rusak (Wajib mengembalikan SERVFAIL)
dig @127.0.0.1 -p 53 sigfail.verteiltesysteme.net +dnssec | grep "status: SERVFAIL"
Proteksi DNS Amplification Attack: Jangan pernah mengekspos port 53 UDP/TCP server DNS lokal Anda langsung ke internet publik melalui port forwarding NAT tanpa autentikasi VPN (WireGuard/Tailscale). Server DNS resolver rekursif terbuka (Open Resolver) akan cepat dieksploitasi oleh botnet global sebagai reflektor dalam serangan DDoS Amplification.

Kesimpulan

Dengan menggabungkan Pi-hole dan Unbound dalam arsitektur container Docker, Anda memiliki kendali penuh atas lalu lintas data jaringan internet Anda. Iklan invasif dan pelacak pihak ketiga diblokir secara terpusat untuk semua perangkat (termasuk Smart TV dan perangkat IoT), sementara riwayat navigasi web Anda tetap menjadi rahasia privat Anda seutuhnya.

COMMENTS

Name

1clickInstall,1,404,1,android,1,Apache2,1,API Telegram,1,Apple,3,AWS,1,Backup,1,bapak internet indonesia,1,blkid,1,booting,1,brainware,1,calc,1,can't mount,3,can't read superblock,1,cara mengatasi disk failure,1,cara mengatasi disk penuh,1,cara mengatasi error disk,1,cara mengatasi error proxmox,1,cara mengatasi log full,1,centOS,1,certificate,1,Chrome,1,cinta sang penguasa,1,CLI,1,Cloud Computing,10,Cloud Storage,6,Clustering,1,Codec,1,CodeIgniter,2,computare,4,computer,4,Cybersecurity,5,dakwah,16,Data Mining,1,dd,1,Debian,2,Deepin Linux,1,DevOps,1,digital,1,Docker,7,dosa,1,dosa besar,1,Enkripsi,1,era digital,1,error certificate,1,error path,1,error subscription,1,excel,1,failed subscription,1,Fedora,1,fedora26,1,Feeder,1,fstab,1,ftp server,1,fujitsu,1,gambar,1,ghibah,1,Git,2,GitHub,2,gitignore,1,gitignore not work,1,Google,2,Google Chrome,1,Google Cloud,1,Google Drive,2,google-drive-ocamlfuse,1,Harddisk,1,Hardware,1,Hashing,1,HDD,2,history,1,host,1,Hostname,1,how to,2,IAM,1,igmp proxy,1,Ilmu Komputer,1,impress,1,indihome,1,INDUKSI MATEMATIKA,1,instalasi,3,install,10,install GIT,1,install linux,6,internet,2,islam,17,javascript,1,K-Means,1,KDE Plasma,1,keamanan,1,Keamanan Cloud,2,keamanan data,1,Keamanan Jaringan,1,keynote,1,kodi,1,komputer,5,kuliah,1,Latte-dock,1,leap,7,leap 42.3,1,LibreOffice,1,Linux,51,linux ringan,3,Machine Learning,1,machintos,4,macOS,5,mageia,1,mandriva,1,mate,1,microsoft office,2,microsoft windows,4,microsoft word,1,Mikrotik,3,mint,1,mount,4,mounting,1,Multimedia Codec,1,Netwatch,1,network,1,network security,1,Networking,6,Nextcloud,1,node js,1,NTFS,3,ntfsfix,2,numbers,1,office,5,Online Account,1,onno,1,onnowpurbo,1,Open Source,3,OpenMandriva,1,OpenOffice,2,openoffice calc,1,openoffice writer,1,openSUSE,11,operating system,1,ownCloud,1,ownCloud Client,1,PAGES,1,PDDikti,1,pemikir islam,1,pengguna,1,perangkat keras,1,Perangkat Lunak,2,PHP,1,PHP 5,1,PKI,1,port 80,1,port 8082,1,postel sevice award,1,Powerpoint,1,presentasi,1,presentation,1,Privacy,1,Proxmox,12,PVE,1,q4os,1,remaja islam,2,review,7,rezeki,1,s1300i,1,scanner,1,scansnap,1,Security,5,sejarah,1,Server,12,setting,1,Sistem Operasi,2,Software,2,spreadsheet,1,SSO,1,stb,1,Storage,4,sukses dunia akhirat,1,Sysadmin,8,Telegram,1,telkom,1,tesseract,1,text,1,Tutorial,23,tv box,1,Ubuntu,3,Unsupervised Learning,1,usb drive,1,useetv,1,user,1,VBA,1,version control,1,virtual machine,2,Virtualization,3,Visual basic,1,Visual Basic for Applications,1,VLC,2,VLC Media Player,1,vsftpd,1,whatsapp api,1,winbox,1,Windows,7,Windows 7,1,word,1,WORD PROCESSOR,2,workstation,1,WPS Office,1,zypper,1,
ltr
item
zhato TECH: Membangun Sinkhole DNS & Recursive Resolver Pribadi: Integrasi Pi-hole dan Unbound di Docker Compose
Membangun Sinkhole DNS & Recursive Resolver Pribadi: Integrasi Pi-hole dan Unbound di Docker Compose
zhato TECH
http://www.zhato-tech.id/2026/11/membangun-sinkhole-dns-recursive.html
http://www.zhato-tech.id/
http://www.zhato-tech.id/
http://www.zhato-tech.id/2026/11/membangun-sinkhole-dns-recursive.html
true
740282316614930842
UTF-8
Loaded All Posts Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS PREMIUM CONTENT IS LOCKED STEP 1: Share to a social network STEP 2: Click the link on your social network Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy Table of Content