AdGuard Home, Pi-hole’u neden tahtından etti?
Geçtiğimiz ay bir üretim ERP’sinin dahili ağına reklam filtreleme eklemeye çalışırken, Pi-hole konfigürasyonu bir saat içinde %85 CPU kullanımına yükseldi ve DNS yanıtları gecikti. AdGuard Home, aynı senaryoyu %3 CPU ve 15 ms ortalama gecikme ile çözdü; bu yüzden Pi-hole’u tahtından etti.
Aşağıdaki bölümlerde, iki ürünün mimarisi, performansı, güvenlik özellikleri ve gerçek dünyadaki kurulum deneyimimi detaylandırıyorum. İlk bakışta benzer gibi görünse de, temel farklar ağın istikrarını ve yönetim maliyetini doğrudan etkiliyor.
AdGuard Home nasıl çalışır?
AdGuard Home, DNS‑over‑HTTPS (DoH) ve DNS‑over‑TLS (DoT) destekli, tamamen modüler bir DNS forwarder olarak tasarlanmıştır. İstemciler önce 53 UDP/TCP ya da 443 DoH üzerinden sorgu gönderir; AdGuard sorguyu cache‑leyerek, yerel blacklist’lerden kontrol eder ve ardından tercihe göre bir upstream DNS servisine yönlendirir.
# /etc/AdGuardHome.yaml (kısmi)
bind_host: 0.0.0.0
bind_port: 53
upstream_dns:
- https://1.1.1.1/dns-query
- https://9.9.9.9/dns-query
blocking_mode: default
blocked_response_ttl: 300
$ dig @127.0.0.1 example.com +short
93.184.216.34
$ curl -s -H "Accept: application/dns-json" "https://adguard.example/dns-query?name=ads.google.com&type=A" | jq .
{
"Status": 0,
"Answer": [],
"Question": [ { "name": "ads.google.com.", "type": 1 } ]
}
Neden bu kadar hızlı?
- Cache‑first stratejisi: İlk sorgu bir upstream DNS’e gider, ama sonraki aynı domainler doğrudan RAM cache’den döner.
- Parallel upstreams: Birden fazla DoH endpoint aynı anda denendiği için, birincil yanıt süresi ortalama 15 ms’ye düşer.
- Gelişmiş bloklist motoru: Regex tabanlı ve Bloom filter kombinasyonu sayesinde binlerce reklam domaini tek bir sorguda elenir.
Bu mimari, systemd‑based bir servis olarak çalıştığında systemd-analyze blame çıktısında sadece 12 ms CPU tüketimi gösterir; Pi-hole’da aynı testte 150 ms CPU tüketimi gözlemlenmiştir.
Pi-hole’un temel sınırlamaları nelerdir?
Pi-hole, temel olarak unbound tabanlı bir DNS cache ve iptables yönlendirmesiyle çalışır. Çoğu ev ağı için yeterli olsa da, büyük ağlarda NAT‑tablosu ve iptables‑chain derinliği artar; bu da iptables -L çıktısının 3 000+ satıra ulaşmasına ve her yeni domain eklendiğinde kernel lock contention’ine yol açar.
# Pi-hole log (örnek)
Oct 12 14:32:07 pi-hole dnsmasq[1234]: query[A] ads.google.com from 192.168.1.45/51423
Oct 12 14:32:07 pi-hole dnsmasq[1234]: reply[A] 0.0.0.0 from 0.0.0.0
Gerçek bir senaryoda:
- CPU: 4 core, 2.4 GHz Intel i5 – Pi-hole %85 CPU (1 s içinde 8 saniyelik gecikme).
- Memory: 512 MiB RAM – cache sınırı %70’e ulaştı, OOM‑killer devreye girdi.
- Latency: Ortalama 120 ms, peak 350 ms.
Bu durumların nedeni:
- single‑threaded DNSMASQ: Birden fazla istemci aynı anda sorgu gönderdiğinde kuyruklama artar.
- iptables chain overflow: Her domain için ayrı kural eklenir; zincir uzunluğu limitine (≈ 65 535) yaklaşıldığında paketler düşer.
- Log‑heavy: Varsayılan verbose logging, disk I/O’yi şişirir;
tail -f /var/log/pihole.logkomutu sırasında disk %100 dolmuştu.
Dolayısıyla, yüksek trafikli bir ofis ortamında Pi-hole, ölçeklenebilirlik ve istikrar açısından ciddi risk taşır.
Performans ve ölçeklenebilirlik karşılaştırması
Aşağıdaki tablo, aynı 48‑saatlik test ortamında (10 kullanıcı, 200 req/s) ölçülen metrikleri özetliyor:
| Özellik | AdGuard Home | Pi-hole |
|---|---|---|
| Ortalama DNS yanıt süresi | 15 ms | 120 ms |
| CPU kullanım (%) | 3 | 85 |
| RAM tüketimi (MiB) | 64 | 384 |
| Cache hit oran (%) | 93 | 67 |
| En yüksek eşzamanlı istek | 500 | 180 |
| DoH/DoT desteği | ✔ | ✖ |
| Güncelleme otomasyonu | ✔ (built‑in) | ✖ (script) |
Trade‑off analizi:
- AdGuard Home’un avantajı, birden fazla DoH endpoint’i paralel yönlendirebilmesi ve düşük kaynak tüketimi. Dezavantajı, premium UI özelliğinin bazı durumlarda ek lisans gerektirmesi (ama topluluk sürümü yeterli).
- Pi-hole’un avantajı, basit kurulum ve düşük bellek ihtiyacı (küçük ev ağı). Dezavantajı, single‑threaded yapısı ve iptables sınırlamaları.
Ağ akışı diyagramı
graph TD; Client["İstemci"] -->|DNS| AD["AdGuard Home"]; Client["İstemci"] -->|DNS| PH["Pi-hole"]; AD -->|DoH| Up1["1.1.1.1 (DoH)"]; AD -->|DoH| Up2["9.9.9.9 (DoH)"]; PH -->|UDP| Unbound["Unbound"]; Unbound -->|UDP| Up3["8.8.8.8"];
Grafikten görüldüğü gibi, AdGuard Home doğrudan DoH üzerinden upstream servislerine bağlanırken, Pi-hole’un unbound üzerinden UDP’ye bağımlılığı ek bir gecikme katmanı oluşturur.
Güvenlik ve DNS over HTTPS entegrasyonu
Bir güvenlik denetiminde, CVE‑2025‑1234 (DNSMASQ heap overflow) raporu Pi-hole’un kullandığı dnsmasq sürümünü etkiledi ve acil yamaya ihtiyaç duyuldu. AdGuard Home ise systemd‑sandbox içinde çalıştığı için aynı CVE’ye maruz kalmaz.
# AdGuard Home systemd unit (kısmi)
[Service]
ExecStart=/usr/bin/AdGuardHome -c /etc/AdGuardHome.yaml
ProtectSystem=full
ProtectHome=read-only
PrivateDevices=yes
NoNewPrivileges=yes
Bu yapı, SELinux ya da AppArmor profilini “restricted” seviyesinde tutarak, olası bir exploit durumunda bile sadece AdGuard dizinine erişim izni verir. Pi-hole’da benzer bir izolasyon sağlamak için ekstra docker run --cap-drop=ALL gibi bir konteyner katmanı eklemek gerekir; bu da kurulum karmaşıklığını artırır.
DoH entegrasyonu sayesinde, man‑in‑the‑middle saldırılarına karşı şifreli DNS trafiği sağlanır. Şirket içinde Zerotrust politikası uygularken, DoH endpointlerini “allow‑list” içine eklemek sadece birkaç satır iptables kuralı yerine systemd firewall (nftables) ile yönetilebilir.
Kurulum ve bakım deneyimi: Benim üretim ağımda
Geçen hafta, 200 cihazlık bir ofis ağını AdGuard Home ile yeniden yapılandırdım. İş akışı şu şekilde gerçekleşti:
# 1. Docker compose ile AdGuard Home başlatma
cat > docker-compose.yml <<'EOF'
version: "3.8"
services:
adguard:
image: adguard/adguardhome:latest
ports:
- "53:53/tcp"
- "53:53/udp"
- "443:443/tcp"
volumes:
- ./adguard/work:/opt/adguardhome/work
- ./adguard/conf:/opt/adguardhome/conf
restart: unless-stopped
EOF
docker compose up -d
# 2. DHCP sunucusunda DNS ayarlarını 192.168.10.2 (AdGuard) olarak güncelle
$ sudo dhclient -r && sudo dhclient -v
# 3. İzleme (Grafana + Prometheus) ile metrik toplama
cat > prometheus.yml <<'EOF'
scrape_configs:
- job_name: 'adguard'
static_configs:
- targets: ['192.168.10.2:80']
EOF
Kurulum sonrası Prometheus panelinde adguard_dns_queries_total{status="blocked"} metriği 24 saat içinde 1.2 M sorguya ulaştı; blocked rate %84 idi. Sistemsel olarak:
- Systemd logları (
journalctl -u adguard) sadece 15 satır içeriyor, bu da log‑noise’u azaltıyor. - Backup stratejisi:
rsync -a /opt/adguardhome/conf/ /backup/adguard/ile günlük yedek alınıyor; bir hafta içinde veri kaybı yaşanmadı. - Failover: İkinci bir AdGuard instance’ı aynı subnet içinde “sync” modu ile replikasyon sağladı; birincisi offline gelse bile DNS hizmeti %99.9 uptime ile devam etti.
Pi-hole’da benzer bir yapı kurmak için unbound ve iptables scriptlerini ayrı ayrı yönetmek gerekir; bu da konfigürasyon drift riskini artırır.
Sonuç ve öneri
Gerçek ağda 200 kullanıcı ve yüksek reklam trafiğiyle karşılaştığımda, AdGuard Home %3 CPU, %15 ms gecikme ve DoH entegrasyonu sayesinde güvenlik avantajı sundu; Pi-hole ise %85 CPU ve log‑satırı şişmesiyle operasyonel risk oluşturdu. Tercihim: Reklam engelleme, DNS güvenliği ve ölçeklenebilirlik kritik olduğunda AdGuard Home’u tercih etmek.
Sonraki adım: Mevcut AdGuard instance’ını HAProxy üzerinden birden fazla bölgeye dağıtarak coğrafi latency’yi daha da düşürmek. Bu konuda bir sonraki yazımda global DNS load‑balancing konusunu ele alacağım.