Unbound’da Forward Zone ile Upstream DNS Yönlendirme
Bir DNS sunucusu kurduğunuzda eninde sonunda şu soruyla yüzleşirsiniz: “Hangi sorgular nereye gitsin?” Unbound’un forward zone özelliği tam da bu soruyu yanıtlamak için var. Yıllarca BIND, dnsmasq ve Unbound ile uğraştıktan sonra şunu söyleyebilirim: forward zone’ları doğru yapılandırmak, DNS altyapınızın hem performansını hem de güvenliğini doğrudan etkiler. Bu yazıda Unbound’da forward zone ile upstream DNS yönlendirmesini gerçek dünya senaryolarıyla ele alacağız.
Forward Zone Nedir ve Neden Gereklidir?
Unbound varsayılan olarak recursive bir çözümleyicidir. Yani bir sorgu geldiğinde root sunuculara gider, oradan TLD sunucularına, oradan yetkili sunuculara ulaşarak cevabı kendisi bulur. Bu harika bir yaklaşım ama her zaman istediğiniz şey değildir.
Forward zone, belirli bir DNS bölgesi için gelen sorguları kendiniz çözmek yerine başka bir DNS sunucusuna iletmek demektir. Örneğin:
- Şirket içi
.corp.example.comsorgularını iç DNS sunucunuza yönlendirmek - Tüm dış sorguları Cloudflare veya Quad9 gibi bir upstream sunucuya göndermek
- Belirli bölgeler için farklı resolver’lar kullanmak
Dnsmasq ile bu işi yapıyorsanız ve Unbound’a geçiyorsanız, konsept aynı ama sözdizimi farklı. Şaşırmayın, birkaç satır yapılandırmayla halloluyor.
Temel Yapılandırma Dosyası Yapısı
Unbound’un ana yapılandırma dosyası genellikle /etc/unbound/unbound.conf konumundadır. Modern dağıtımlarda ise bu dosya /etc/unbound/unbound.conf.d/ dizinindeki parçalı yapılandırmaları include eder. Ben her zaman parçalı yapıyı tercih ederim, nedenini birazdan anlayacaksınız.
# Mevcut yapılandırma yapısını inceleyelim
ls -la /etc/unbound/
cat /etc/unbound/unbound.conf | grep include
Tipik bir Unbound kurulumunda şu yapıyı görmek normaldir:
# /etc/unbound/unbound.conf içeriği
server:
# Temel ayarlar buraya gelir
include: "/etc/unbound/unbound.conf.d/*.conf"
Eğer sisteminizde bu include direktifi yoksa manuel olarak eklemenizi öneririm. Böylece her forward zone için ayrı bir dosya tutabilir, değişiklikleri izole edebilirsiniz.
İlk Forward Zone: Tüm Sorguları Upstream’e Yönlendirme
En basit senaryodan başlayalım. Unbound’u bir caching resolver olarak kullanmak istiyorsunuz ve tüm sorguları Cloudflare’e yönlendirmek istiyorsunuz.
# /etc/unbound/unbound.conf.d/forward-all.conf
forward-zone:
name: "."
forward-addr: 1.1.1.1@853#cloudflare-dns.com
forward-addr: 1.0.0.1@853#cloudflare-dns.com
forward-tls-upstream: yes
Burada name: "." ifadesi root zone anlamına gelir, yani tüm sorgular bu kurala tabidir. @853 portu DNS over TLS (DoT) kullandığımızı belirtir. #cloudflare-dns.com kısmı ise TLS sertifika doğrulaması için gerekli hostname’dir.
Bu yapılandırmayı test etmeden önce mutlaka sözdizimini kontrol edin:
# Yapılandırma sözdizimini doğrula
unbound-checkconf /etc/unbound/unbound.conf
# Servisi yeniden başlat
systemctl restart unbound
# Çalışıyor mu kontrol et
systemctl status unbound
Şirket İçi DNS Yönlendirmesi: Gerçek Hayat Senaryosu
Şimdi daha ilginç bir senaryoya geçelim. Diyelim ki şirketinizin Windows Active Directory ortamı var ve .corp.sirket.local gibi bir iç domain kullanıyorsunuz. Bu sorguların iç DNS sunucularınıza gitmesi, dış sorguların ise upstream resolver’a gitmesi gerekiyor.
Bunu yanlış yapılandırdığınızda ne olur? Iç hostname’leri çözemediniz, kullanıcılar dosya sunucularına ulaşamadı, IT’ye telefonlar yağmaya başladı. O yüzden dikkatli olun.
# /etc/unbound/unbound.conf.d/internal-zones.conf
# Şirket iç domain'i için yönlendirme
forward-zone:
name: "corp.sirket.local"
forward-addr: 192.168.1.10
forward-addr: 192.168.1.11
forward-first: no
# Ters DNS için de yönlendirme (iç IP bloğu)
forward-zone:
name: "168.192.in-addr.arpa"
forward-addr: 192.168.1.10
forward-addr: 192.168.1.11
forward-first: no
forward-first: no parametresine dikkat edin. Bu, Unbound’un forward zone yapılandırmasında belirtilen sunuculardan cevap alamazsa kendi recursive çözümlemesine geçmeyeceği anlamına gelir. İç domain’ler için bu davranış genellikle istediğiniz şeydir; iç sunucu cevap vermiyorsa recursive çözümleme yine de işe yaramayacak, kullanıcıya hatalı bir cevap döneceğine SERVFAIL dönsün daha iyi.
forward-first: yes Ne Zaman Kullanılır?
forward-first: yes seçeneği ise şu anlama gelir: Önce belirttiğim upstream sunucuya sor, cevap gelmezse ya da hata dönerse sen kendin çöz. Bu ne zaman işe yarar?
Örneğin bir ISP’nin local mirror’larını kullanmak istiyorsunuz ama ISP’nin DNS’i bazen yanıt vermeyebilir. Yedek olarak root sunuculara dönebilmek istiyorsunuz.
# /etc/unbound/unbound.conf.d/isp-forward.conf
forward-zone:
name: "."
forward-addr: 217.x.x.x # ISP DNS sunucusu
forward-first: yes # Cevap gelmezse recursive çöz
Pratikte bu yapıyı pek önermem. Ya tam forward kullanın, ya da tamamen recursive. Karma yaklaşımlar beklenmedik davranışlara yol açabiliyor.
DNS over TLS ile Güvenli Yönlendirme
Günümüzde upstream sunucularla şifresiz iletişim kurmak kabul edilebilir bir durum değil. DNS sorguları plain-text giderse ISP seviyesinde dinlenebilir, manipüle edilebilir. DoT kullanımı bu riski ortadan kaldırır.
# /etc/unbound/unbound.conf.d/forward-tls.conf
forward-zone:
name: "."
# Cloudflare DoT
forward-addr: 1.1.1.1@853#cloudflare-dns.com
forward-addr: 1.0.0.1@853#cloudflare-dns.com
# Quad9 DoT (yedek)
forward-addr: 9.9.9.9@853#dns.quad9.net
forward-addr: 149.112.112.112@853#dns.quad9.net
forward-tls-upstream: yes
DoT yapılandırmasının çalışması için server bloğunda birkaç şeyin doğru tanımlanmış olması gerekir:
# /etc/unbound/unbound.conf.d/server-tls.conf
server:
# TLS için sertifika doğrulama
tls-cert-bundle: "/etc/ssl/certs/ca-certificates.crt"
# Debian/Ubuntu için alternatif yol
# tls-cert-bundle: "/etc/pki/tls/certs/ca-bundle.crt"
Debian ve RHEL tabanlı sistemlerde sertifika demet dosyasının yolu farklıdır. Yanlış yol belirtirseniz TLS doğrulaması başarısız olur ve Unbound upstream’e bağlanamaz.
Yapılandırmayı Test Etme
Yapılandırmayı test etmek için unbound-control ve dig araçlarını kullanın:
# Unbound istatistiklerini ve durumunu kontrol et
unbound-control status
# Belirli bir sorgunun nasıl çözümlendiğini izle
dig @127.0.0.1 google.com +stats
# TLS bağlantısını doğrula
dig @1.1.1.1 -p 853 +tls google.com
# Önbelleği temizle ve tekrar dene
unbound-control flush_zone "."
dig @127.0.0.1 example.com
Özellikle +stats bayrağı çok değerli bilgi verir. Query time, sunucu adresi ve port numarasını gösterir. Forward zone doğru çalışıyorsa query time değeri recursive çözümlemeden daha düşük olmalıdır çünkü upstream sunucu büyük ihtimalle kendi önbelleğinden yanıtlıyordur.
Split-DNS Yapılandırması
Bu konu, kurumsal ortamlarda sıkça karşılaştığım ama yeterince belgelenmemiş bir alan. Split-DNS, aynı domain adı için iç ve dış ağlarda farklı cevaplar döndürmek demek. Unbound bunu forward zone ile zarif bir şekilde halleder.
Senaryo: uygulama.sirket.com için dışarıdan load balancer IP’si görünmeli, içeriden ise doğrudan uygulama sunucusu IP’si.
# /etc/unbound/unbound.conf.d/split-dns.conf
# İç ağdan gelen sorgular için local data
server:
local-data: "uygulama.sirket.com. A 10.0.1.50"
local-data-ptr: "10.0.1.50 uygulama.sirket.com"
# Dış sorgular için forward (eğer iç veri bulunamazsa)
forward-zone:
name: "sirket.com"
forward-addr: 192.168.1.10 # İç yetkili DNS sunucusu
forward-addr: 192.168.1.11
Bu yapıda Unbound önce local-data tanımlarına bakar, bulamazsa forward zone’a yönlendirir.
Windows Active Directory Ortamında Unbound
Active Directory ortamları özel dikkat gerektirir. AD, Kerberos, LDAP ve çeşitli servisler için DNS SRV kayıtlarına yoğun şekilde bağımlıdır. Bu kayıtların yanlış çözümlenmesi sessiz sedasız büyük sorunlara yol açar.
# /etc/unbound/unbound.conf.d/ad-forward.conf
# AD domain için forward
forward-zone:
name: "ad.sirket.com"
forward-addr: 10.0.0.1 # AD DNS 1
forward-addr: 10.0.0.2 # AD DNS 2
forward-first: no
# AD'nin kullandığı MSDCS subdomain
forward-zone:
name: "_msdcs.ad.sirket.com"
forward-addr: 10.0.0.1
forward-addr: 10.0.0.2
forward-first: no
# Ters DNS yönlendirmesi
forward-zone:
name: "0.10.in-addr.arpa"
forward-addr: 10.0.0.1
forward-addr: 10.0.0.2
forward-first: no
_msdcs zone’unu ayrıca belirtmek önemlidir. Bazı Unbound versiyonlarında parent zone forward tanımı subdomain’leri kapsamayabiliyor. Güvende olmak için kritik subzone’ları ayrıca tanımlayın.
Çoklu Upstream ile Yük Dağılımı ve Yedeklilik
Tek bir upstream sunucuya bağımlı olmak doğru değil. Unbound, birden fazla forward addr tanımladığınızda bunları round-robin mantığıyla kullanır ve bir sunucu yanıt vermezse diğerine geçer.
# /etc/unbound/unbound.conf.d/forward-redundant.conf
forward-zone:
name: "."
# Birincil: Cloudflare DoT
forward-addr: 1.1.1.1@853#cloudflare-dns.com
forward-addr: 1.0.0.1@853#cloudflare-dns.com
# İkincil: Quad9 DoT
forward-addr: 9.9.9.9@853#dns.quad9.net
forward-addr: 149.112.112.112@853#dns.quad9.net
# Üçüncül: Google DoT (acil durum)
forward-addr: 8.8.8.8@853#dns.google
forward-addr: 8.8.4.4@853#dns.google
forward-tls-upstream: yes
Burada bir nüans var. Unbound tüm bu sunucuları paralel sorgulamaz, sırayla dener. Birincisi yanıt verirse ikincisine gitmez. Birincisi timeout olursa ikincisini dener. Timeout süresi server bloğundaki timeout parametresiyle ayarlanabilir.
Hata Ayıklama: En Sık Karşılaşılan Sorunlar
Yıllarca DNS sorunlarıyla boğuştuktan sonra şunu öğrendim: sorunların yüzde sekseninin kaynağı ya yanlış IP adresi ya yanlış port ya da firewall kuralıdır.
Forward zone çalışmıyor ama yapılandırma doğru görünüyorsa:
# Unbound log seviyesini artır
# /etc/unbound/unbound.conf içine ekle:
server:
verbosity: 2
log-queries: yes
# Logları izle
journalctl -u unbound -f
# Veya log dosyasına yazıyorsa
tail -f /var/log/unbound/unbound.log
Network erişimini test et:
# Upstream sunucuya erişilebilirlik testi
nc -zv 1.1.1.1 853
nc -zv 9.9.9.9 853
# TCP üzerinden DNS sorgusu (firewall testi)
dig @1.1.1.1 +tcp google.com
# TLS el sıkışmasını test et
openssl s_client -connect 1.1.1.1:853 -servername cloudflare-dns.com
Sık karşılaşılan hata durumları:
- SERVFAIL dönüyorsa: Forward zone’daki sunucu IP’sini veya portu kontrol edin. TLS kullanıyorsanız sertifika bundle yolunu doğrulayın.
- NXDOMAIN dönüyorsa: Upstream sunucu sorguyu alıyor ama domain gerçekten yok. Forward zone çalışıyor demektir.
- Timeout oluyor: Firewall port 853’ü engelliyor olabilir. Port 53 ile deneyin, fark varsa firewall sorunu.
- Yavaş yanıt süresi: Upstream sunucu coğrafi olarak uzakta ya da yüklü olabilir. Alternatif sunucu deneyin.
Yapılandırmaları Dinamik Olarak Yönetmek
Büyük ortamlarda forward zone’ları elle yönetmek zorlaşır. unbound-control ile bazı işlemler restart gerektirmeden yapılabilir:
# Belirli bir zone'u önbellekten temizle
unbound-control flush_zone "corp.sirket.local"
# Tüm önbelleği temizle
unbound-control flush_all
# Çalışan yapılandırmayı yeniden yükle (reload)
unbound-control reload
# Forward zone ekle (kalıcı değil, restart'ta kaybolur)
unbound-control forward_add +i corp.sirket.local 192.168.1.10
# Mevcut forward zone'ları listele
unbound-control list_forwards
unbound-control reload komutu servisi durdurmadan yapılandırmayı yeniden okur. Bu production ortamlar için kritik bir özelliktir. Ancak şunu da söyleyeyim: reload bazen tüm değişiklikleri tam olarak uygulamayabilir. Şüpheniz varsa tam restart yapın.
Performans Optimizasyonu
Forward zone kullanıyorsanız cache etkinliğini artırmak önemlidir:
# /etc/unbound/unbound.conf.d/performance.conf
server:
# Önbellek boyutunu artır
msg-cache-size: 64m
rrset-cache-size: 128m
# Prefetch: TTL dolmadan yenile
prefetch: yes
prefetch-key: yes
# Paralel sorgu sayısı
num-threads: 4
# EDNS buffer boyutu
edns-buffer-size: 1232
# Negative cache TTL sınırı
cache-min-ttl: 300
cache-max-ttl: 86400
prefetch: yes seçeneği, cache’deki bir kaydın TTL’inin yüzde onu kaldığında arka planda upstream’den taze kaydı çeker. Kullanıcı hiçbir zaman cache miss yaşamaz, her zaman hızlı yanıt alır. DNS performansı konusunda en fark yaratan tek parametre budur.
Güvenlik Notları
Forward zone’ları yapılandırırken güvenlik perspektifini de akılda tutmak gerekir:
DNSSEC ile forward zone birlikte kullanımı:
# /etc/unbound/unbound.conf.d/dnssec.conf
server:
# DNSSEC doğrulamasını etkinleştir
auto-trust-anchor-file: "/var/lib/unbound/root.key"
# Forward zone ile DNSSEC uyumu
# forward-tls-upstream: yes kullanıyorsanız
# harden-dnssec-stripped: yes ekleyin
harden-dnssec-stripped: yes
Önemli bir uyarı: Eğer DoT ile forward kullanıyorsanız ve upstream sunucu DNSSEC destekliyorsa sorun yok. Ancak iç DNS sunucularına forward yapıyorsanız ve bu sunucular DNSSEC imzalamıyorsa harden-dnssec-stripped: yes false-positive SERVFAIL’lara neden olabilir. İç zone’lar için DNSSEC doğrulamasını domain bazında kapatmanız gerekebilir.
Gerçek Bir Kurumsal Senaryo: Her Şeyi Bir Arada
Şimdi gerçekçi bir kurumsal yapıyı özetleyelim. Elimde böyle bir yapılandırma varken her yeni kurulumda başlangıç noktası olarak kullanıyorum:
# /etc/unbound/unbound.conf.d/kurumsal-forward.conf
# 1. Şirket iç domain'i -> AD DNS
forward-zone:
name: "sirket.local"
forward-addr: 10.0.0.10
forward-addr: 10.0.0.11
forward-first: no
# 2. Şirket public domain'i (intranet) -> İç DNS
forward-zone:
name: "intranet.sirket.com"
forward-addr: 10.0.0.10
forward-addr: 10.0.0.11
forward-first: no
# 3. Ters DNS - RFC1918 blokları -> İç DNS
forward-zone:
name: "10.in-addr.arpa"
forward-addr: 10.0.0.10
forward-addr: 10.0.0.11
forward-first: no
forward-zone:
name: "168.192.in-addr.arpa"
forward-addr: 10.0.0.10
forward-addr: 10.0.0.11
forward-first: no
# 4. Geri kalan her şey -> Cloudflare DoT
forward-zone:
name: "."
forward-addr: 1.1.1.1@853#cloudflare-dns.com
forward-addr: 1.0.0.1@853#cloudflare-dns.com
forward-addr: 9.9.9.9@853#dns.quad9.net
forward-tls-upstream: yes
Bu yapıda sıra önemlidir. Unbound en uzun eşleşen zone’u kullanır. sirket.local için gelen sorgu, . zone’u yerine sirket.local zone’una eşleşir. Yani daha spesifik olanlar öncelik alır; bunu aklınızda tutun.
Sonuç
Unbound’da forward zone yapılandırması göründüğünden daha güçlü bir araç. Temel kullanım basit birkaç satırdan ibaret, ama iç DNS yönlendirmesi, split-DNS, DoT ile güvenli iletim ve DNSSEC entegrasyonu gibi katmanlar ekledikçe gerçek anlamda sağlam bir DNS altyapısına kavuşuyorsunuz.
En önemli nokta şu: Hangi sorgunun nereye gideceğini önceden kağıda dökün. Sonra yapılandırmayı yazın, test edin, logları inceleyin. DNS sorunları çoğunlukla sessiz olur; yanlış cevap veriyor ama fark edilmiyor. dig, unbound-control ve verbosity artırılmış loglar bu noktada en iyi arkadaşlarınızdır.
Production ortamına almadan önce mutlaka unbound-checkconf ile sözdizimini doğrulayın ve en az bir istemciden dig ile test edin. Beş dakikalık test, gece yarısı gelen destek çağrısından çok daha değerlidir.
