CoreDNS Kurulumu: Binary ve Docker ile Yükleme
Üretim ortamında DNS altyapısını değiştirmek her zaman biraz tedirgin edici bir iştir. Yıllarca BIND ile çalıştıktan sonra CoreDNS’e geçtiğimde ilk başta şüpheciydim, ama şunu söyleyeyim: kurulum kolaylığı ve yapılandırma esnekliği açısından CoreDNS ciddi anlamda iyi bir seçenek. Bu yazıda hem binary kurulumu hem de Docker ile nasıl ayağa kaldıracağınızı gerçek dünyadan senaryolarla anlatacağım.
CoreDNS Nedir ve Neden Tercih Edilmeli
CoreDNS, Go ile yazılmış, plugin tabanlı bir DNS sunucusudur. Kubernetes ekosisteminde standart DNS çözümü olarak benimsenmesinin ardından standalone kullanım senaryolarında da ciddi ilgi görmeye başladı. BIND’ın karmaşık zone dosyaları yerine tek bir Corefile ile yönetim yapabilmek, özellikle modern altyapılarda büyük avantaj sağlıyor.
Plugin mimarisi sayesinde sadece ihtiyacınız olan özellikleri aktif ediyorsunuz. Prometheus metriklerini doğrudan CoreDNS’ten çekebiliyor, istekleri logluyor, upstream forwarder olarak kullanabiliyor ya da kendi özel zone’larınızı yönetebiliyorsunuz. Tüm bunları BIND’daki gibi onlarca konfigürasyon dosyasıyla boğuşmadan yapıyorsunuz.
Sistem Gereksinimleri
Kuruluma geçmeden önce ortamı netleştirelim. Bu yazıdaki örnekler Ubuntu 22.04 ve CentOS Stream 9 üzerinde test edilmiştir. Docker kurulumları için Docker Engine 20.10+ kullanıyoruz.
Minimum gereksinimler oldukça mütevazı:
- İşletim Sistemi: Linux (herhangi bir modern dağıtım), macOS veya Windows
- RAM: 64MB yeterli, üretim için 256MB+ önerilen
- CPU: Tek çekirdek küçük ortamlarda yeterli
- Port: 53 (UDP/TCP), yönetim için 8080/8053
Root olmayan kullanıcıyla 53 portunu kullanmak için ek ayar gerektiğini hatırlatayım, buna da değineceğim.
Binary ile Kurulum
İndirme ve Hazırlık
CoreDNS binary dağıtımını GitHub releases sayfasından alıyoruz. Her zaman son stabil sürümü tercih edin, özellikle güvenlik yamaları için sürüm notlarını takip etmek iyi bir alışkanlık.
# En son sürümü değişkene atalım
COREDNS_VERSION="1.11.3"
ARCH="amd64"
# Binary'yi indir
curl -LO "https://github.com/coredns/coredns/releases/download/v${COREDNS_VERSION}/coredns_${COREDNS_VERSION}_linux_${ARCH}.tgz"
# SHA256 checksum doğrulama - bunu atlamayın
curl -LO "https://github.com/coredns/coredns/releases/download/v${COREDNS_VERSION}/coredns_${COREDNS_VERSION}_linux_${ARCH}.tgz.sha256"
sha256sum -c "coredns_${COREDNS_VERSION}_linux_${ARCH}.tgz.sha256"
Checksum doğrulaması üretim ortamında zorunlu bir adım. İndirdiğiniz binary’nin bütünlüğünü doğrulamadan kurmak ciddi güvenlik riski oluşturur.
# Arşivi aç
tar xzf "coredns_${COREDNS_VERSION}_linux_${ARCH}.tgz"
# Binary'yi sistem yoluna taşı
sudo mv coredns /usr/local/bin/
sudo chmod +x /usr/local/bin/coredns
# Kurulumu doğrula
coredns --version
Dizin Yapısını Oluşturma
Düzenli bir kurulum için şu dizin yapısını kullanıyorum:
sudo mkdir -p /etc/coredns
sudo mkdir -p /var/log/coredns
sudo mkdir -p /etc/coredns/zones
# Servis kullanıcısı oluştur - root ile çalıştırmaktan kaçının
sudo useradd --system --no-create-home --shell /bin/false coredns
sudo chown -R coredns:coredns /var/log/coredns
sudo chown -R coredns:coredns /etc/coredns
Corefile Yapılandırması
CoreDNS’in kalbi Corefile’dır. Basit bir forwarder yapılandırmasıyla başlayalım, sonra üzerine inşa ederiz:
sudo nano /etc/coredns/Corefile
# Temel yapılandırma - tüm sorgular için
. {
# Upstream DNS sunucuları - Google ve Cloudflare
forward . 8.8.8.8 8.8.4.4 1.1.1.1 {
max_fails 3
expire 10s
health_check 5s
}
# Prometheus metrikleri
prometheus :9153
# Hata loglama
errors
# Sorgu loglama - üretimde dikkatli kullanın, disk dolabilir
log
# Cache - performans için kritik
cache 300
# Döngü tespiti
loop
# Reload - Corefile değişikliğinde otomatik yeniden yükleme
reload
}
Bu yapılandırma CoreDNS’i basit bir caching forwarder olarak çalıştırır. Küçük ofis ağları için bu kadarı yeterli olabilir.
İç Ağ Zone’u Eklemek
Gerçek hayatta iç ağ çözümlemesi de gerekiyor. Diyelim ki sirket.local domaini için özel kayıtlar tutmak istiyorsunuz:
sudo nano /etc/coredns/zones/sirket.local.db
$ORIGIN sirket.local.
$TTL 300
@ IN SOA ns1.sirket.local. admin.sirket.local. (
2024010101 ; Serial
3600 ; Refresh
900 ; Retry
604800 ; Expire
300 ) ; Minimum TTL
IN NS ns1.sirket.local.
ns1 IN A 192.168.1.10
www IN A 192.168.1.20
app IN A 192.168.1.30
db IN A 192.168.1.40
Corefile’ı bu zone’u içerecek şekilde güncelleyelim:
# İç ağ zone'u
sirket.local {
file /etc/coredns/zones/sirket.local.db
log
errors
}
# Geri kalan tüm sorgular için forwarder
. {
forward . 8.8.8.8 8.8.4.4 1.1.1.1 {
max_fails 3
expire 10s
health_check 5s
}
prometheus :9153
errors
cache 300
loop
reload
}
Systemd Servis Dosyası
Binary kurulumunda servis yönetimi için systemd unit dosyası oluşturmak şart:
sudo nano /etc/systemd/system/coredns.service
[Unit]
Description=CoreDNS DNS Server
Documentation=https://coredns.io
After=network.target
Wants=network-online.target
[Service]
Type=simple
User=coredns
Group=coredns
ExecStart=/usr/local/bin/coredns -conf /etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure
RestartSec=5s
LimitNOFILE=1048576
LimitNPROC=512474
# Güvenlik sertleştirme
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ReadWritePaths=/var/log/coredns
[Install]
WantedBy=multi-user.target
AmbientCapabilities=CAP_NET_BIND_SERVICE satırı önemli. Bu sayede root olmayan coredns kullanıcısı 53 portunu dinleyebiliyor. Bunu atladığınızda “permission denied” hatası alırsınız ve saçlarınızı yolarsınız.
# Systemd'yi yenile ve servisi etkinleştir
sudo systemctl daemon-reload
sudo systemctl enable coredns
sudo systemctl start coredns
# Durumu kontrol et
sudo systemctl status coredns
# Log takibi
sudo journalctl -u coredns -f
Kurulumu Test Etme
# dig ile sorgu testi
dig @127.0.0.1 google.com
# İç zone testi
dig @127.0.0.1 www.sirket.local
# Reverse lookup testi
dig @127.0.0.1 -x 192.168.1.20
# UDP ve TCP testi
dig @127.0.0.1 google.com +tcp
dig çıktısında Query time değerinin ilk sorguda yüksek, sonraki sorgularda düşük olması cache’in çalıştığını gösterir. Bunu görünce içim rahat oluyor.
Docker ile Kurulum
Docker kurulumu daha hızlı ve taşınabilir bir yaklaşım sunuyor. Özellikle CI/CD pipeline’larında veya test ortamlarında tercih edilebilir.
Temel Docker Çalıştırma
# Hızlı test için
docker run -d
--name coredns
-p 53:53/udp
-p 53:53/tcp
-p 9153:9153
coredns/coredns:1.11.3
-conf /dev/null
Bu komut varsayılan yapılandırmayla CoreDNS’i ayağa kaldırır ama gerçek kullanım için kendi Corefile’ınızı mount etmeniz gerekiyor.
Konfigürasyon ile Docker Çalıştırma
# Konfigürasyon dizinini oluştur
mkdir -p ~/coredns/config
mkdir -p ~/coredns/zones
# Corefile oluştur
cat > ~/coredns/config/Corefile << 'EOF'
. {
forward . 8.8.8.8 8.8.4.4 1.1.1.1 {
max_fails 3
expire 10s
health_check 5s
policy sequential
}
prometheus :9153
errors
log
cache 300
loop
reload 10s
health :8080
}
EOF
# CoreDNS'i konfigürasyonla çalıştır
docker run -d
--name coredns
--restart unless-stopped
-p 53:53/udp
-p 53:53/tcp
-p 9153:9153
-p 8080:8080
-v ~/coredns/config:/etc/coredns
coredns/coredns:1.11.3
-conf /etc/coredns/Corefile
Docker Compose ile Yapılandırma
Üretim ortamında Docker Compose kullanmak çok daha yönetilebilir bir yaklaşım. Özellikle monitoring stack ile birlikte çalışıyorsanız:
version: '3.8'
services:
coredns:
image: coredns/coredns:1.11.3
container_name: coredns
restart: unless-stopped
command: -conf /etc/coredns/Corefile
ports:
- "53:53/udp"
- "53:53/tcp"
- "9153:9153"
- "8080:8080"
volumes:
- ./config:/etc/coredns:ro
- ./zones:/etc/coredns/zones:ro
networks:
- dns_network
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 15s
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "5"
networks:
dns_network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
Docker Compose ile başlatma:
# Servisi başlat
docker-compose up -d
# Logları takip et
docker-compose logs -f coredns
# Container durumunu kontrol et
docker-compose ps
# Konfigürasyonu güncelle ve reload
docker-compose exec coredns kill -SIGUSR1 1
# Tam yeniden başlatma
docker-compose restart coredns
Docker Container’ında Debug
Sorun yaşadığınızda container içine girmek yerine şu komutları kullanmak daha pratik:
# DNS sorgusu testi (host makineden)
dig @localhost google.com
# Container loglarına bakma
docker logs coredns --tail 100 -f
# Health endpoint kontrolü
curl http://localhost:8080/health
# Prometheus metrikleri
curl http://localhost:9153/metrics | grep coredns_dns_requests_total
Güvenlik Yapılandırmaları
CoreDNS’i internete açık bir sunucuda çalıştırıyorsanız birkaç güvenlik önlemi şart:
Erişim Kısıtlama: Kimden sorgu kabul edeceğinizi sınırlayın. acl plugin’i bu iş için biçilmiş kaftan:
. {
acl {
allow net 192.168.0.0/16
allow net 10.0.0.0/8
allow net 172.16.0.0/12
block
}
forward . 8.8.8.8 8.8.4.4
cache 300
errors
}
Rate Limiting: DDoS amplification saldırılarına karşı ratelimit plugin’i kullanın. Bu özellikle DNS amplification saldırılarında sizi recursive resolver olarak suistimal edilmekten korur.
Firewall Kuralları: Sadece DNS trafiğine izin verin:
# UFW ile temel DNS kuralları
sudo ufw allow from 192.168.0.0/16 to any port 53 proto udp
sudo ufw allow from 192.168.0.0/16 to any port 53 proto tcp
sudo ufw deny 53/udp
sudo ufw deny 53/tcp
Yaygın Sorunlar ve Çözümleri
Kurulum sırasında karşılaşacağınız muhtemel problemler ve çözümleri:
Port 53 zaten kullanımda hatası: Ubuntu sistemlerde systemd-resolved 53 portunu işgal ediyor olabilir.
# Hangi servis 53'ü kullanıyor
sudo ss -tulpn | grep :53
# systemd-resolved'ı devre dışı bırak
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
CoreDNS başlamıyor, log yok: systemd ile çalışıyorsanız journal’a bakın, Docker’da ise docker logs komutunu kullanın. Corefile sözdizimi hatası en yaygın sebep.
# Corefile sözdizimini test et (binary kurulumunda)
coredns -conf /etc/coredns/Corefile -plugins 2>&1 | head -20
Sorgular cevap vermiyor ama servis ayakta: Firewall kurallarını kontrol edin. UDP ve TCP için ayrı ayrı kural gerektiğini unutmayın.
İzleme ve Metrikler
CoreDNS’in Prometheus entegrasyonu gerçekten güçlü. Birkaç temel metrik:
- coredns_dns_requests_total: Toplam sorgu sayısı, tip ve protokole göre
- coredns_dns_responses_total: Yanıt sayısı ve response code dağılımı
- coredns_cache_hits_total ve coredns_cache_misses_total: Cache performansı
- coredns_forward_requests_total: Upstream’e iletilen sorgular
Bu metrikleri Grafana dashboard’una bağladığınızda DNS altyapınızın sağlığını gerçek zamanlı izleyebilirsiniz. Resmi CoreDNS Grafana dashboard’u (ID: 5926) iyi bir başlangıç noktası.
Sonuç
CoreDNS kurulumu göründüğü kadar karmaşık değil. Binary kurulumu tam kontrol ve düşük kaynak tüketimi isteyenler için ideal, Docker kurulumu ise hızlı kurulum ve kolay taşınabilirlik arayanlar için mükemmel bir seçenek.
Benim tavsiyem: Test ortamında Docker ile başlayın, Corefile’ınızı şekillendirin ve üretim ortamına geçerken binary kuruluma veya Kubernetes üzerindeyseniz Helm chart’a geçin. Özellikle iç ağ DNS ihtiyacı olan şirket ortamlarında CoreDNS’in sadeliği ve yönetim kolaylığı BIND karşısında ciddi avantaj sağlıyor.
Yapılandırma değişikliklerini her zaman önce test ortamında deneyin ve zone dosyalarını version control’e alın. DNS bir kez bozulduğunda her şey bozulur, bunu zor yoldan öğrenenler olarak konuşuyorum.
