
BIND ve PowerDNS: Özel DNS Sunucu Kurulumu ve Yapılandırması
Kendi DNS sunucunuzu kurun: BIND9 ve PowerDNS autoritative ve recursive DNS sunucu kurulumu, zone dosyaları ve güvenlik yapılandırması.
BIND ve PowerDNS: Özel DNS Sunucu Kurulumu ve Yapılandırması
Kendi DNS sunucunuzu kurmak, alan adı yönetiminde tam kontrol demektir: zone dosyalarını siz yazarsınız, transfer politikasını siz belirlersiniz, log'ları siz tutarsınız. Bu yazıda BIND 9 ve PowerDNS'in Ubuntu 22.04 LTS ve AlmaLinux 9 üzerinde kurulumunu, zone yapılandırmasını, master/slave replikasyonunu ve güvenlik sertleştirmesini adım adım ele alıyorum.
DNS Sunucu Yazılımları Ekosistemi
Açık kaynak DNS dünyasında birkaç önemli yazılım var:
BIND 9 (Berkeley Internet Name Domain): Internet Systems Consortium (ISC) tarafından geliştirilen, 1980'lerin sonundan beri kullanılan en yaygın DNS sunucusu. Dünya DNS altyapısının büyük bölümünü taşır; akademik, ISP ve kurumsal ortamlarda referans kabul edilir. Konfigürasyon text tabanlı zone dosyaları üzerinden yapılır.
PowerDNS: Authoritative Server ve Recursor olarak iki ayrı bileşenden oluşur. MySQL, PostgreSQL, SQLite gibi ilişkisel veritabanlarını backend olarak kullanabilir; built-in REST API ve web yönetim arayüzü (PowerAdmin, Poweradmin) ile modern hosting ortamlarında tercih edilir.
Knot DNS: CZ.NIC tarafından geliştirilen, yüksek performans odaklı authoritative DNS sunucusu. Büyük ölçekli TLD işletmecileri için tasarlanmış.
Unbound: NLnet Labs'ın geliştirdiği recursive resolver. Authoritative değil; cache ve forwarder olarak çalışır. Validating, recursive, caching DNS resolver ihtiyaçlarında tercih edilir.
djbdns: Daniel J. Bernstein'in güvenlik odaklı yaklaşımla yazdığı eski DNS uygulaması. Artık aktif geliştirme yok, yeni kurulumda önerilmez.
Bu yazının odağı BIND 9 ve PowerDNS authoritative kurulumudur.
Authoritative ve Recursive DNS Ayrımı
DNS sunucu mimarisinde temel iki rol vardır ve bunları aynı sunucuda karıştırmak güvenlik açığı oluşturur:
Authoritative DNS (yetkili): Belirli zone'ların sahibidir. Yalnızca kendi zone'larına ait sorgulara ANSWER bölümü ile cevap verir; başka domain'ler için REFUSE veya NXDOMAIN döner. ns1.ornek.com tipik bir authoritative sunucudur.
Recursive DNS (özyinelemeli, resolver): İstemcilerin herhangi bir domain için sorgu gönderdiği sunucudur. Kendi cache'inde yoksa root → TLD → authoritative zincirini izleyerek yanıt bulur ve cache'e yazar. Ev yönlendiricinizin DNS'i veya ISP DNS'i recursive resolver'dır.
Modern güvenlik yaklaşımında authoritative ve recursive ayrı sunucularda çalıştırılmalıdır. BIND views ile aynı sunucu üzerinde hem internal hem external görünüm mümkündür, ama bu yapı karmaşıktır ve DNS amplification saldırısına karşı risk taşır.
BIND 9 Kurulumu (Ubuntu 22.04 LTS)
Ubuntu 22.04 üzerinde BIND 9 resmi depolardan gelir:
sudo apt update
sudo apt install bind9 bind9utils dnsutils
Paketler:
bind9— named (DNS daemon)bind9utils—named-checkconf,named-checkzone,rndcaraçlarıdnsutils—dig,nslookup,hosttest araçları
Servis durumunu doğrulayın:
sudo systemctl status bind9
sudo systemctl enable bind9
Konfigürasyon dosyaları Debian tabanlı sistemlerde /etc/bind/ altındadır:
/etc/bind/named.conf — ana giriş dosyası (include'lar)
/etc/bind/named.conf.options — global ayarlar
/etc/bind/named.conf.local — özel zone tanımları
/etc/bind/named.conf.default-zones — root, localhost zone'ları
BIND 9 Kurulumu (AlmaLinux 9 / RHEL 9)
RHEL tabanlı sistemlerde paket adları ve dosya yolları farklıdır:
sudo dnf install bind bind-utils
sudo systemctl start named
sudo systemctl enable named
Konfigürasyon dosyası /etc/named.conf olur; zone dosyaları genellikle /var/named/ altına yerleştirilir. Chroot kurulum bind-chroot paketiyle eklenebilir; saldırı yüzeyi azaltmak için tercih edilebilir.
BIND named.conf Options Yapılandırması
/etc/bind/named.conf.options dosyası global davranışı belirler. Authoritative-only server için güvenli temel yapılandırma:
options {
directory "/var/cache/bind";
// Authoritative server: recursive sorguları reddet
recursion no;
// Sorguları herkesten kabul et (authoritative için)
allow-query { any; };
// Zone transfer: sadece slave'lere izin ver
allow-transfer { none; };
// Versiyon bilgisini gizle
version "Hidden";
hostname none;
// DNSSEC validation (recursive kapalı olduğunda etkisiz
// ama recursive aynı sunucuda çalışırsa gerekli)
dnssec-validation auto;
// IPv4 + IPv6 dinle
listen-on { any; };
listen-on-v6 { any; };
// DNS amplification koruması: rate limiting
rate-limit {
responses-per-second 10;
window 5;
};
};
Dosyayı kaydedin ve sözdizimini doğrulayın:
sudo named-checkconf
BIND Zone Dosyası Yapısı
Zone dosyası /etc/bind/zones/ dizininde tutulur; önce dizini oluşturun:
sudo mkdir -p /etc/bind/zones
/etc/bind/zones/db.example.com dosyası:
$TTL 3600
@ IN SOA ns1.example.com. hostmaster.example.com. (
2026051001 ; Serial (YYYYMMDDNN) — her değişimde artır
3600 ; Refresh — slave ne sıklıkla kontrol etsin
900 ; Retry — transfer başarısız ise tekrar dene
604800 ; Expire — slave ne kadar eskiyi kabul etsin
300 ) ; Negative TTL — NXDOMAIN cache süresi
; Nameserver kayıtları
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
; A ve AAAA kayıtları
@ IN A 91.93.10.5
www IN A 91.93.10.5
ns1 IN A 91.93.10.5
ns2 IN A 91.93.10.6
; Mail kayıtları
@ IN MX 10 mail.example.com.
mail IN A 91.93.10.7
; E-posta kimlik doğrulaması
@ IN TXT "v=spf1 ip4:91.93.10.0/24 ~all"
; DKIM kayıtları (mail provider tarafından verilir)
; mail._domainkey IN TXT "v=DKIM1; k=rsa; p=..."
Serial number: Her zone değişikliğinde mutlaka artırılmalıdır. YYYYMMDDNN formatı yaygındır: gün içindeki ikinci değişiklik ...02 olur. Artırılmadan bırakılırsa slave sunucular yeni zone'u almaz.
Zone dosyasını doğrulayın:
sudo named-checkzone example.com /etc/bind/zones/db.example.com
BIND Master Zone Tanımı (named.conf.local)
/etc/bind/named.conf.local dosyasına zone bloğunu ekleyin:
zone "example.com" {
type master;
file "/etc/bind/zones/db.example.com";
// AXFR/IXFR transferine sadece slave IP'lerine izin ver
allow-transfer { 91.93.10.6; };
// Değişiklikte slave'e bildir
notify yes;
also-notify { 91.93.10.6; };
// Dynamic update kapalı (production'da açık tutmayın)
allow-update { none; };
};
Reload:
sudo named-checkconf
sudo systemctl reload bind9
# veya
sudo rndc reload example.com
BIND Slave (Secondary) Yapılandırması
İkinci sunucuda (ns2, IP 91.93.10.6) slave zone tanımı:
zone "example.com" {
type slave;
masters { 91.93.10.5; }; // master'ın IP'si
file "/var/cache/bind/slaves/db.example.com";
allow-notify { 91.93.10.5; }; // sadece master'dan notify kabul et
};
Slave zone dosyaları dizinini oluşturun ve BIND'e sahipliği verin:
sudo mkdir -p /var/cache/bind/slaves
sudo chown bind:bind /var/cache/bind/slaves
AXFR (tam transfer) ile zone kopyalanır; sonraki değişiklikler IXFR (incremental transfer) ile aktarılır. Transfer başarısını doğrulayın:
dig @91.93.10.6 example.com SOA +short
# Master ile aynı serial number görünmeli
BIND Log ve İzleme
named.conf.options içine logging bloğu ekleyin:
logging {
channel default_log {
file "/var/log/named/named.log" versions 3 size 20m;
print-time yes;
print-severity yes;
print-category yes;
severity info;
};
category default { default_log; };
category queries { default_log; };
category security { default_log; };
category xfer-out { default_log; };
};
sudo mkdir /var/log/named
sudo chown bind:bind /var/log/named
sudo systemctl restart bind9
Gerçek zamanlı durum ve istatistikler:
sudo rndc status // named durumu
sudo rndc stats // /var/cache/bind/named_stats.txt yazar
sudo rndc flush // cache temizle
sudo rndc reload // tüm zone'ları yeniden yükle
Test sorguları:
dig @127.0.0.1 example.com A
dig @127.0.0.1 example.com NS
dig +trace example.com // root'tan izle
BIND statistics channel ile HTTP üzerinden metrik toplama da mümkündür; named.conf.options içine statistics-channels { inet 127.0.0.1 port 8080; }; eklenebilir.
PowerDNS Authoritative Server Kurulumu
PowerDNS authoritative server Ubuntu 22.04'te pdns-server paketiyle gelir:
sudo apt install pdns-server pdns-backend-mysql
MySQL backend için veritabanı kurulumu:
sudo mysql -u root <<'SQL'
CREATE DATABASE pdns CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'pdns'@'localhost' IDENTIFIED BY 'guclu-sifre-buraya';
GRANT ALL PRIVILEGES ON pdns.* TO 'pdns'@'localhost';
FLUSH PRIVILEGES;
SQL
# PowerDNS MySQL schema'sını yükle
sudo mysql -u pdns -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql
/etc/powerdns/pdns.conf temel yapılandırması:
# Backend
launch=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-user=pdns
gmysql-password=guclu-sifre-buraya
gmysql-dbname=pdns
# Güvenlik: recursive reddet
local-address=0.0.0.0
local-port=53
no-shuffle=yes
# REST API
api=yes
api-key=uzun-rastgele-anahtar-buraya
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
webserver-allow-from=127.0.0.1
sudo systemctl start pdns
sudo systemctl enable pdns
sudo systemctl status pdns
PowerDNS REST API ile Zone Yönetimi
PowerDNS'in built-in REST API'si ile zone ve kayıt işlemleri programatik yapılabilir:
# Zone oluştur
curl -s -X POST http://127.0.0.1:8081/api/v1/servers/localhost/zones \
-H "X-API-Key: uzun-rastgele-anahtar-buraya" \
-H "Content-Type: application/json" \
-d '{
"name": "example.com.",
"kind": "Native",
"nameservers": ["ns1.example.com.", "ns2.example.com."],
"rrsets": [
{
"name": "example.com.",
"type": "A",
"ttl": 3600,
"records": [{"content": "91.93.10.5", "disabled": false}]
}
]
}'
# Zone listesi
curl -s http://127.0.0.1:8081/api/v1/servers/localhost/zones \
-H "X-API-Key: uzun-rastgele-anahtar-buraya" | python3 -m json.tool
Terraform PowerDNS provider ve Ansible community.general.pdns_zone modülü bu API üzerinden çalışır; altyapı kodlaması (IaC) senaryolarında zone yönetimi otomatize edilebilir.
PowerDNS DNSSEC Otomatik Kurulum
PowerDNS'te DNSSEC tek komutla etkinleştirilir:
sudo pdnsutil secure-zone example.com
sudo pdnsutil show-zone example.com // DNSKEY, DS kayıtlarını göster
# DS kaydını üst zone'a (registrar) bildirin
sudo pdnsutil export-zone-ds example.com
BIND'de DNSSEC çok daha manueldir: dnssec-keygen ile ZSK/KSK çifti üretilir, dnssec-signzone ile zone imzalanır, signed zone dosyası named.conf'a tanımlanır ve periyodik re-signing gerektirir. Bu konunun detayı bu blogtaki DNSSEC yazısında anlatılıyor.
Hidden Master + Public Slave Mimarisi
Güvenlik açısından en iyi yaklaşım: master DNS sunucuyu internetten gizlemek (hidden master), sadece slave'leri public yapmaktır.
Hidden master avantajları:
- Master sunucuya doğrudan DDoS veya zone sorgulama imkânı yok
- Zone transfer saldırı yüzeyi minimumda
- Master'ı güncellemek slave'leri etkilemez (geçici kapalı kalma yok)
Yapılandırma:
Master sunucu (named.conf):
zone "example.com" {
type master;
file "/etc/bind/zones/db.example.com";
// Slave'lerin IP listesi
allow-transfer { 91.93.10.6; 91.93.10.7; };
notify yes;
also-notify { 91.93.10.6; 91.93.10.7; };
};
NS kayıtlarında ns1.example.com ve ns2.example.com olarak yalnızca slave'ler listelenir; master'ın IP'si NS kaydına yazılmaz.
Firewall kuralı (master):
# Sadece slave'lerden ve yönetim ağından DNS erişimine izin ver
sudo ufw allow from 91.93.10.6 to any port 53
sudo ufw deny 53
Bu mimariyle ilgili nameserver kavramları ve WHM/cPanel entegrasyonu için DNS sunucu kurulumu ve nameserver yapılandırması yazısına bakabilirsiniz.
TSIG ile Güvenli Zone Transfer
TSIG (Transaction SIGnature), AXFR/IXFR transferlerinin HMAC ile imzalanmasını sağlar. IP bazlı allow-transfer'e ek güvenlik katmanı ekler:
# TSIG anahtarı üret
sudo tsig-keygen -a HMAC-SHA256 slave-key > /etc/bind/tsig-slave.key
/etc/bind/tsig-slave.key içeriği:
key "slave-key" {
algorithm hmac-sha256;
secret "base64-uretilmis-gizli-anahtar==";
};
Master named.conf.local:
include "/etc/bind/tsig-slave.key";
zone "example.com" {
type master;
file "/etc/bind/zones/db.example.com";
allow-transfer { key slave-key; };
also-notify { 91.93.10.6; };
};
Slave named.conf.local:
include "/etc/bind/tsig-slave.key";
zone "example.com" {
type slave;
masters { 91.93.10.5 key slave-key; };
file "/var/cache/bind/slaves/db.example.com";
};
TSIG ile artık hem IP hem HMAC imza eşleşmeli; transfer sahteciliği pratikte imkânsız hale gelir.
Güvenlik Sertleştirme: ACL ve Rate Limiting
Authoritative DNS sunucusu için temel güvenlik adımları:
1. Recursive sorguları kesin olarak kapatın:
recursion no;
Açık recursive DNS, DNS amplification DDoS saldırılarında kullanılan başlıca vektördür; bir saldırgan küçük sorguyla büyük yanıt aldırabilir.
2. allow-update kapalı tutun:
allow-update { none; };
Dynamic DNS update gerekmedikçe production zone'larına dışarıdan kayıt yazılması engellenmeli.
3. Versiyon bilgisini gizleyin:
version "Hidden";
hostname none;
dig version.bind chaos txt sorgusuna yanıt vermez; sürüm bilgisi ile fingerprinting saldırısı engellenir.
4. Rate limiting:
rate-limit {
responses-per-second 10;
referrals-per-second 5;
errors-per-second 5;
window 5;
slip 2; // Her 2 cevaptan biri kesilir, TC=1 döner
};
5. allow-query ACL:
acl "trusted-slaves" {
91.93.10.6;
91.93.10.7;
};
zone "example.com" {
allow-transfer { trusted-slaves; };
};
6. Port 53 TCP + UDP güvenlik duvarı:
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 953/tcp // rndc (sadece localhost veya yönetim ağından)
Performance Tuning
BIND'de yüksek yük altında ayarlanabilecek parametreler:
options {
// Paralel zone yükleme thread sayısı
serial-query-rate 100;
// Max cache boyutu (recursive çalışırsa geçerli)
max-cache-size 512m;
// Sorgu kaynak portları (randomization, Kaminsky koruması)
query-source address * port *;
query-source-v6 address * port *;
};
PowerDNS için pdns.conf:
# Sorgu alan thread sayısı
receiver-threads=2
# Sorgu dağıtan thread sayısı
distributor-threads=3
# Backend bağlantı havuzu
gmysql-dnssec=yes
Buyukweb VDS ile BIND/PowerDNS
Buyukweb VDS paketleri KVM hipervizör tabanlıdır; her VDS tam root erişimli Linux sanal makinesidir. Bu mimaride BIND 9 veya PowerDNS kurulumu doğrudan apt/dnf ile yapılır; herhangi bir kısıtlama yoktur.
Tipik BIND/PowerDNS kurulumu için kaynak gereksinimleri:
- Küçük ölçek (1-100 zone): 1 vCPU + 1 GB RAM yeterli
- Orta ölçek (100-1.000 zone): 2 vCPU + 2 GB RAM
- Master + Slave (2 ayrı VDS): Her biri 1-2 vCPU + 1-2 GB RAM
Bursa Tier 3 veri merkezinde koşan Buyukweb VDS, Türkiye içi latency avantajıyla Türk kullanıcılara hızlı DNS yanıtı sunar. KVM web konsol kurtarma özelliği sayesinde yanlış named.conf yapılandırması SSH erişimini kesmişse konsol üzerinden düzeltme yapılabilir.
cPanel hosting'de DNS durumu: Paylaşımlı veya cPanel reseller hosting'de kendi BIND/PowerDNS kurulumu yapılamaz — bunlar izole sanal makine değil, paylaşımlı ortamdır. cPanel'in kendi BIND instance'ı hosting sağlayıcı tarafında çalışır; kullanıcı DNS Zone Editor arayüzüyle A, MX, TXT gibi kayıtları yönetir. Tam DNS sunucu kontrolü için VDS zorunludur.
Kurulum sürecinde sorularınız olursa 0850 302 60 70 numaralı destek hattı arayabilirsiniz.
Sıkça Sorulan Sorular
BIND mi PowerDNS mi seçmeliyim?
Sysadmin'iniz metin tabanlı konfigürasyona alışkınsa, akademik/ISP ortamında çalışıyorsanız → BIND. Web arayüzü, REST API, veritabanı backend ve daha kolay DNSSEC kurulumu istiyorsanız → PowerDNS. Her ikisi de üretimde kanıtlanmış; seçim büyük ölçüde operasyon tercihidir.
Kaç slave sunucu gerekli?
IETF standartları minimum 2 NS kaydı zorunlu kılar (RFC 1035). Üretim ortamı için en az 2 (1 master + 1 slave) farklı IP bloğunda, tercihen farklı veri merkezlerinde. Yüksek erişilebilirlik için 3-4 slave farklı coğrafi konumda mantıklıdır.
DNSSEC zorunlu mu?
Teknik olarak zorunlu değil; ama 2026 itibarıyla güvenlik baseline'ı sayılıyor. MITM ve cache poisoning saldırılarına karşı etkili. PowerDNS'te tek komut (pdnsutil secure-zone); BIND'de biraz daha adım gerektirir.
VDS'te BIND production'da çalışır mı?
Evet. KVM tabanlı Buyukweb VDS'te BIND 9 veya PowerDNS rahatça production kurulumu yapılabilir. Küçük-orta ölçekli zone sayısı için 1-2 vCPU + 2 GB RAM yeterlidir.
TSIG nedir, zorunlu mu?
TSIG, zone transfer mesajlarını HMAC-SHA256 ile imzalar. IP bazlı allow-transfer tek başına güvenlidir ama IP sahteciliğine karşı zayıftır; TSIG ek kriptografik kimlik doğrulama katmanı ekler. Production'da TSIG önerilir.
Buyukweb hosting DNS zone yönetimi nasıl?
cPanel hosting'de DNS Zone Editor paneli üzerinden A, AAAA, CNAME, MX, TXT kayıtları eklenir/düzenlenir. Arka planda Buyukweb'in kendi DNS altyapısı çalışır; müşteri ayrı DNS sunucu kurmaz. Kendi NS sunucunuzu kurmak istiyorsanız VDS alın, BIND/PowerDNS kurun.
Hidden master neden kullanılır?
Master sunucuyu public nameserver olarak açıklamak onu DDoS ve zone enumeration saldırılarına maruz bırakır. Hidden master yapısında master'ın IP'si NS kaydında görünmez, firewall ile korunur; sadece slave'ler internete açıktır. Ayrıca master güncelleme/yeniden başlatma sırasında DNS hizmet kesintisi yaşanmaz.
İlgili Büyükweb Hizmetleri
BIND/PowerDNS kurulumu için root erişimli VDS:
Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.
Domain & DNS İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:

