Unbound ve Pi-hole Entegrasyonu ile Gelişmiş Reklam Engelleme
Ev ağında ya da küçük bir ofis ortamında DNS çözümlemesini kontrol altına almak istediğinizde, Pi-hole tek başına oldukça işlevsel bir araç. Ama Pi-hole’u Unbound ile birleştirdiğinizde ortaya çıkan şey bambaşka bir seviye: tam anlamıyla özyinelemeli (recursive) bir DNS çözümleyici, reklam engelleme katmanı ve gizlilik odaklı bir yapı. Bu yazıda bu iki aracı nasıl entegre ettiğimi, hangi sorunlarla karşılaştığımı ve production benzeri bir ev ağında bu yapının nasıl durduğunu aktaracağım.
Neden Pi-hole Tek Başına Yetmez?
Pi-hole varsayılan kurulumunda upstream DNS olarak Cloudflare (1.1.1.1) ya da Google (8.8.8.8) gibi sunucuları kullanır. Bu mimaride şu sorun var: DNS sorgularınız şifreli olsun ya da olmasın, nihayetinde üçüncü taraf bir sunucuya gidiyor. Cloudflare’e güvenseniz bile, onlar sizin tüm DNS geçmişinizi görüyor demektir.
Unbound devreye girdiğinde bu tablo değişiyor. Unbound, kök DNS sunucularından (root servers) başlayarak sorguları kendi çözümler. Yani bir istek geldiğinde önce root sunuculara gider, oradan ilgili TLD sunucularına, oradan da yetkili (authoritative) DNS sunucularına yönlenir. Hiçbir şeyi üçüncü tarafa devretmez.
Bu mimarinin avantajları şunlar:
- Gizlilik: DNS geçmişiniz herhangi bir upstream sağlayıcıda birikmiyor
- DNSSEC doğrulama: Unbound DNSSEC’i natively destekler, yanıtların sahiciliğini doğrulayabilirsiniz
- Önbellek kontrolü: Kendi TTL politikalarınızı uygulayabilirsiniz
- Gecikme: İlk sorgu biraz daha uzun sürebilir ama önbellekteki sonuçlar inanılmaz hızlı döner
Mimari Genel Bakış
Kurulumumuzun çalışma mantığı şu şekilde:
İstemci --> Pi-hole (53/udp) --> Unbound (5335/udp) --> Root DNS Sunucuları
Pi-hole reklam ve tracker listelerini filtreler, sonra upstream olarak yerel Unbound servisine yönlendirir. Unbound ise internete çıkarak sorguyu kendi başına çözümler.
Bu yazıdaki ortam Ubuntu 22.04 LTS üzerinde kurulu. Raspberry Pi 4 ya da herhangi bir x86 sistem için de aynı adımlar geçerlidir.
Unbound Kurulumu
Önce sistemi güncelleyelim ve Unbound’u kuralım:
sudo apt update && sudo apt upgrade -y
sudo apt install unbound -y
Kurulum sonrasında Unbound otomatik olarak başlar. Ama henüz Pi-hole ile konuşmak üzere yapılandırılmadı. Ana konfigürasyon dosyası /etc/unbound/unbound.conf olsa da biz buraya dokunmayacağız; bunun yerine /etc/unbound/unbound.conf.d/ dizinine özel bir dosya oluşturacağız. Bu yaklaşım, paket güncellemelerinde ana config’in ezilmesi riskini ortadan kaldırır.
sudo nano /etc/unbound/unbound.conf.d/pi-hole.conf
Aşağıdaki yapılandırmayı bu dosyaya yapıştırın:
server:
# Temel ayarlar
verbosity: 0
interface: 127.0.0.1
port: 5335
do-ip4: yes
do-udp: yes
do-tcp: yes
# IPv6 kullanmıyorsanız kapatın
do-ip6: no
prefer-ip6: no
# Root hints dosyası
root-hints: "/var/lib/unbound/root.hints"
# Güvenlik ayarları
harden-glue: yes
harden-dnssec-stripped: yes
use-caps-for-id: yes
harden-large-queries: yes
harden-referral-path: no
# Gizlilik
qname-minimisation: yes
private-address: 192.168.0.0/16
private-address: 169.254.0.0/16
private-address: 172.16.0.0/12
private-address: 10.0.0.0/8
private-address: fd00::/8
private-address: fe80::/10
# Önbellek ayarları
cache-min-ttl: 3600
cache-max-ttl: 86400
neg-cache-size: 4m
prefetch: yes
prefetch-key: yes
num-threads: 1
# EDNS
edns-buffer-size: 1232
# Erişim kontrolü
access-control: 127.0.0.1/32 allow
access-control: 0.0.0.0/0 refuse
Bu konfigürasyonda dikkat edilmesi gereken birkaç nokta var. qname-minimisation: yes ayarı, QNAME minimizasyonunu aktif eder; bu sayede her DNS sunucusuna yalnızca ihtiyacı kadar bilgi gönderilir ve gizlilik artar. use-caps-for-id: yes ise 0x20 encoding olarak bilinen bir teknik olup DNS cache poisoning saldırılarına karşı ekstra bir katman sağlar.
Root Hints Dosyasını İndirin
Unbound’un kök sunucuları bulabilmesi için root hints dosyasına ihtiyacı var. Bu dosya zaman içinde değiştiğinden periyodik olarak güncellenmeli:
sudo wget -O /var/lib/unbound/root.hints https://www.internic.net/domain/named.root
Bu işlemi düzenli yapmak için cron’a ekleyelim:
sudo crontab -e
Şu satırı ekleyin:
0 0 1 * * wget -O /var/lib/unbound/root.hints https://www.internic.net/domain/named.root && systemctl restart unbound
Her ayın birinde root hints güncellenecek ve Unbound yeniden başlatılacak.
Unbound’u Test Edin
Servisi başlatıp test edelim:
sudo systemctl enable unbound
sudo systemctl restart unbound
sudo systemctl status unbound
Eğer her şey yolundaysa şunu test edelim:
dig @127.0.0.1 -p 5335 google.com AAAA
Yanıt olarak Google’ın IPv6 adresleri geliyorsa Unbound düzgün çalışıyor demektir. Bir de DNSSEC testi yapalım:
dig @127.0.0.1 -p 5335 sigok.verteiltesysteme.net
Yanıt status: NOERROR ile geliyorsa DNSSEC doğrulaması çalışıyor. Şimdi de kasıtlı olarak bozulmuş bir DNSSEC kaydını test edelim:
dig @127.0.0.1 -p 5335 sigfail.verteiltesysteme.net
Bu sorgu SERVFAIL döndürmeli. Döndürüyorsa Unbound DNSSEC doğrulamasını doğru yapıyor.
Pi-hole Kurulumu
Pi-hole’u kurmak için resmi kurulum betiğini kullanacağız:
curl -sSL https://install.pi-hole.net | bash
Kurulum sihirbazı birkaç şey soracak. Upstream DNS Sağlayıcısı sorusunda şimdilik herhangi birini seçebilirsiniz; biz bunu sonradan manuel olarak değiştireceğiz.
Kurulum tamamlandıktan sonra Pi-hole web arayüzüne erişebilmek için şifreyi ayarlayalım:
sudo pihole -a -p
Pi-hole’u Unbound ile Entegre Edin
Pi-hole’un admin paneline gidin: http://[sunucu-ip]/admin
Settings > DNS sekmesine gidin. Sol taraftaki upstream DNS sağlayıcılarının tümünü kaldırın. Özel upstream DNS kısmına şunu yazın:
127.0.0.1#5335
Use DNSSEC seçeneğini işaretleyin. Zira Unbound zaten DNSSEC doğruluyor, Pi-hole’un da bunu bilmesi iyi olur.
Alternatif olarak bunu komut satırından da yapabilirsiniz. Pi-hole’un konfigürasyon dosyasını düzenleyelim:
sudo nano /etc/pihole/setupVars.conf
Şu satırları bulun ve güncelleyin:
PIHOLE_DNS_1=127.0.0.1#5335
PIHOLE_DNS_2=
DNS_FQDN_REQUIRED=true
DNS_BOGUS_PRIV=true
DNSSEC=true
Değişiklikleri uygulamak için:
sudo pihole restartdns
Sistem Genelinde DNS’i Yapılandırın
Sunucunuzun kendi DNS çözümlemesini de Pi-hole üzerinden yapmasını sağlayalım. Ubuntu 22.04’te systemd-resolved devrede olduğundan önce bunu devre dışı bırakmalıyız:
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo rm /etc/resolv.conf
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
Bu noktada dikkatli olun. Eğer sunucunuz uzak bir makine ise ve bağlantınız DNS’e bağımlıysa, bu adım sizi kitleyebilir. Önce yerel konsoldan ya da IP adresi üzerinden erişiminizin olduğundan emin olun.
Reklam Engelleme Listelerini Ayarlayın
Pi-hole varsayılan olarak birkaç liste ile geliyor ama bunları zenginleştirebilirsiniz. Group Management > Adlists bölümüne gidin ve aşağıdaki listeleri ekleyin. Ben uzun süredir şu kombinasyonla çalışıyorum ve hem kapsam hem de yanlış pozitif dengesi açısından oldukça tatmin edici:
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://adaway.org/hosts.txt
https://v.firebog.net/hosts/AdguardDNS.txt
https://v.firebog.net/hosts/Easylist.txt
https://v.firebog.net/hosts/Easyprivacy.txt
https://raw.githubusercontent.com/FadeMind/hosts.extras/master/UncheckyAds/hosts
https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext
Listeleri ekledikten sonra güncelleyin:
sudo pihole -g
Bu işlem listeleri indirir ve Pi-hole’un veritabanına ekler. İlk çalıştırmada biraz zaman alabilir.
Yerel DNS Kayıtları
Ev ağınızdaki cihazlara güzel isimler vermenin tam zamanı. Pi-hole’un Local DNS > DNS Records bölümünden bunu yapabilirsiniz. Ama komut satırını tercih ediyorsanız:
sudo nano /etc/pihole/custom.list
Şu formatta girişler ekleyin:
192.168.1.10 nas.ev.local
192.168.1.20 yazici.ev.local
192.168.1.30 kamera.ev.local
192.168.1.1 router.ev.local
DNS servisini yeniden başlatın:
sudo pihole restartdns
Artık ağdaki cihazlar bu isimlerle birbirlerine erişebilir.
İzleme ve Log Yönetimi
Pi-hole’un yaptığı her şeyi logladığını biliyoruz. Ama Unbound da log üretir ve bu loglar başlangıçta çok gürültülü gelebilir. Verbosity ayarını production’da 0’da bırakmanızı öneririm. Hata ayıklamak gerektiğinde geçici olarak artırabilirsiniz:
sudo unbound-control verbosity 2
İşiniz bitince:
sudo unbound-control verbosity 0
Unbound’un anlık durumunu görmek için:
sudo unbound-control stats_noreset
Bu komut sorgu sayıları, önbellek hit oranları ve yanıt süreleri hakkında detaylı bilgi verir. Önbellek hit oranı zamanla %70-80’lere çıkarsa sistem iyi çalışıyor demektir.
Pi-hole istatistiklerini komut satırından kontrol etmek için:
sudo pihole -c
Bu komut gerçek zamanlı bir dashboard açar; engellenen sorgu sayısı, aktif istemciler ve en çok sorgulanan domainleri görebilirsiniz.
Yaygın Sorunlar ve Çözümleri
Sistemi kurarken ya da sonrasında karşılaşılan birkaç tipik sorun ve çözümleri:
Unbound başlamıyor: Çoğu zaman 5335 portu başka bir süreç tarafından kullanılıyordur. Kontrol edin:
sudo ss -tulpn | grep 5335
Eğer başka bir süreç bu portu kullanıyorsa pi-hole.conf dosyasında farklı bir port numarasına geçin ve Pi-hole’un upstream ayarını güncelleyin.
DNSSEC hataları: Bazı domainlerin DNSSEC kayıtları bozuk olabiliyor. Bu durumda harden-dnssec-stripped: yes ayarı bu domainleri erişilemez yapacak. Eğer belirli bir domain için sorun yaşıyorsanız ve o domainin gerçekten meşru olduğuna eminseniz, Unbound’a bu domain için DNSSEC doğrulamasını atlayabilirsiniz:
server:
domain-insecure: "problemli-domain.com"
Pi-hole ile Unbound arasında döngüsel referans: resolv.conf dosyasının 127.0.0.1 gösterdiğinden ve Pi-hole’un da Unbound’u upstream olarak kullandığından emin olun. Unbound’un upstream kullanmadığını, doğrudan root sunuculara gittiğini unutmayın.
Yüksek gecikme ilk sorgularda: Bu normaldir. Unbound recursive çözümleme yaptığı için ilk sorgu 200-400ms sürebilir. Ama prefetch ve önbellekleme devreye girince bu değerler dramatik biçimde düşer.
Güvenlik Duvarı Ayarları
Eğer sisteminizde UFW ya da iptables aktifse Pi-hole’a dışarıdan DNS sorguları gelmesi için port açmanız gerekir:
sudo ufw allow 53/udp comment 'Pi-hole DNS'
sudo ufw allow 53/tcp comment 'Pi-hole DNS TCP'
sudo ufw allow 80/tcp comment 'Pi-hole Web'
Unbound’un 5335 portunu ise dışarıya açmayın. Bu port yalnızca localhost üzerinden Pi-hole ile konuşmak için kullanılıyor ve gereksiz yere açmak güvenlik açığı oluşturur.
Router Entegrasyonu
Sistemi kurmak güzel ama ağdaki tüm cihazların bunu kullanması için router DNS ayarlarını değiştirmeniz gerekiyor. Router’ınızın DHCP ayarlarına gidin ve DNS sunucusu olarak Pi-hole’un IP adresini girin. Örneğin Pi-hole 192.168.1.5 adresindeyse:
Primary DNS: 192.168.1.5
Secondary DNS: (boş bırakın ya da 192.168.1.5 tekrar yazın)
Secondary DNS olarak Google veya Cloudflare yazmayın. Pi-hole devre dışı kaldığında cihazlar doğrudan bu adreslere gidecek ve reklam engelleme çalışmayacak. Eğer yedeklilik istiyorsanız ikinci bir Pi-hole kurmak daha doğru bir yaklaşım.
Performans Tuning
Sisteminizde bellek yeterliyse Unbound’un önbellek boyutunu artırabilirsiniz. pi-hole.conf dosyasına ekleyin:
# Önbellek boyutları (512MB RAM için)
msg-cache-size: 128m
rrset-cache-size: 256m
key-cache-size: 32m
# Thread ve bağlantı ayarları
num-threads: 2
so-rcvbuf: 1m
so-sndbuf: 1m
Raspberry Pi 4 (4GB) ya da daha güçlü bir sistem için bu değerleri rahatça uygulayabilirsiniz. Pi Zero ya da 1GB RAM’li bir Pi kullanıyorsanız değerleri yarıya indirin.
Otomatik Güncelleme ve Bakım
Pi-hole kendini güncelleyebilir ama bunu otomatikleştirmek için bir script hazırlayalım:
sudo nano /usr/local/bin/pihole-update.sh
#!/bin/bash
LOG="/var/log/pihole-update.log"
echo "$(date): Güncelleme başlıyor" >> $LOG
pihole -up >> $LOG 2>&1
pihole -g >> $LOG 2>&1
echo "$(date): Güncelleme tamamlandı" >> $LOG
sudo chmod +x /usr/local/bin/pihole-update.sh
sudo crontab -e
Haftalık güncelleme için:
0 3 * * 0 /usr/local/bin/pihole-update.sh
Sonuç
Bu yapıyı ev ağımda yaklaşık iki yıldır çalıştırıyorum. Kurulduktan sonra neredeyse hiç müdahale gerektirmedi. Telefondaki uygulamalar, smart TV’ler, bilgisayarlar, hepsi reklamsız ve tracker’sız bir DNS katmanının arkasında çalışıyor.
Unbound ve Pi-hole kombinasyonunun asıl gücü şurada: biri filtreleme yapar, diğeri çözümleme. Her biri kendi işine odaklandığından hem bakımı kolay hem de sorun tespiti daha anlaşılır oluyor. Bir sorun çıktığında Pi-hole mı sorunlu, Unbound mı sorunlu, hemen ayırt edebiliyorsunuz.
Gizlilik açısından da değerlendirdiğimizde, artık DNS trafiğiniz ne Google’a ne Cloudflare’e ne de ISS’ye görünür biçimde gidiyor. Root sunuculardan başlayan recursive çözümleme ile her sorgu doğrudan yetkili sunucuya ulaşıyor.
Eğer bu kurulumu bir sonraki seviyeye taşımak istiyorsanız, DNS-over-TLS ya da DNS-over-HTTPS ekleyebilirsiniz. Ama tek başına bu yapı bile çoğu ev ve küçük ofis ağı için fazlasıyla yeterli. Kurun, bir hafta izleyin, Pi-hole istatistiklerine bakın ve ağınızda ne kadar gürültü olduğunu görün.
