DNS sorunları, sysadmin hayatının kaçınılmaz bir parçası. Bir servis erişilemiyor, mail sunucusu mail kabul etmiyor, yeni eklediğin kayıt çalışmıyor… Tüm bu senaryolarda ilk başvurman gereken araçlar dig ve nslookup. Bu iki araç, DNS altyapını X-ray gözüyle incelemenizi sağlar. Bugün bu araçları derinlemesine ele alacağız, gerçek dünya senaryolarıyla nasıl kullanacağını göstereceğiz.
dig ve nslookup Nedir, Farkları Nelerdir?
nslookup, eski günlerden gelen, hem Windows hem Linux’ta bulunan bir DNS sorgulama aracı. Basit sorgulamalar için hala işe yarıyor ama bazı sysadminler artık onu “emekli” saymaya başladı.
dig (Domain Information Groper) ise BIND projesinin bir parçası olarak geliştirilmiş, çok daha detaylı ve esnek bir araç. Linux dünyasında dig neredeyse standart haline geldi. Windows’ta da kurulabilir ama asıl evideni Linux.
İkisi arasındaki temel fark şu: dig sana ham DNS cevaplarını gösterir, sorgulama sürecini şeffaf kılar ve scripting için çok daha uygun çıktılar üretir. nslookup daha “kullanıcı dostu” görünse de profesyonel kullanımda dig her zaman üstün gelir.
Kurulum
Çoğu Linux dağıtımında dig, bind-utils veya dnsutils paketinin içinde gelir:
# Debian/Ubuntu
sudo apt install dnsutils
# CentOS/RHEL/Rocky Linux
sudo dnf install bind-utils
# Arch Linux
sudo pacman -S bind
Windows için BIND’ın Windows sürümünü kurabilir ya da WSL2 üzerinden Linux ortamında kullanabilirsiniz. PowerShell’de Resolve-DnsName komutu da benzer işleri görür.
dig ile Temel DNS Sorguları
Basit A Kaydı Sorgulama
En temel kullanım şekli, bir alan adının IP adresini sorgulamak:
dig google.com
# Sadece cevap bölümünü görmek istiyorsan
dig google.com +short
# Belirli bir DNS sunucusunu kullanarak sorgu yapmak
dig @8.8.8.8 google.com
+short parametresi özellikle scripting yaparken çok işe yarıyor. Sadece IP adresini döndürür, gereksiz bilgi yok.
Farklı Kayıt Tiplerini Sorgulamak
DNS dünyasında onlarca kayıt tipi var. En sık kullandıklarımız:
# MX kayıtları - mail sunucuları
dig google.com MX
# NS kayıtları - nameserver'lar
dig google.com NS
# TXT kayıtları - SPF, DKIM, domain doğrulama vb.
dig google.com TXT
# AAAA kaydı - IPv6 adresi
dig google.com AAAA
# CNAME kaydı - takma ad
dig www.github.com CNAME
# SOA kaydı - zone yetkili bilgileri
dig google.com SOA
# Tüm kayıtları görmek (her zaman hepsini getirmez)
dig google.com ANY
Reverse DNS Sorgulama (PTR)
Bir IP adresinin hangi hostname’e işaret ettiğini öğrenmek için:
# -x ile reverse lookup
dig -x 8.8.8.8
# nslookup ile aynı işlem
nslookup 8.8.8.8
Bu özellikle mail sunucularında kritik. Eğer sunucunun PTR kaydı yoksa, gönderdiğin mailler spam klasörüne düşebilir.
dig Çıktısını Anlamak
dig’in çıktısı ilk bakışta korkutucu görünebilir. Hadi bunu parçalara ayıralım:
dig cloudflare.com
; <<>> DiG 9.18.1 <<>> cloudflare.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;cloudflare.com. IN A
;; ANSWER SECTION:
cloudflare.com. 300 IN A 104.16.132.229
cloudflare.com. 300 IN A 104.16.133.229
;; Query time: 12 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Mon Jan 15 10:30:00 TZ 2024
;; MSG SIZE rcvd: 75
Önemli noktalar:
- status: NOERROR: Sorgu başarılı. NXDOMAIN görürsen alan adı mevcut değil demek.
- flags: qr rd ra: qr=cevap, rd=recursive istendi, ra=recursive mevcut
- 300: TTL değeri, saniye cinsinden. Bu kayıt 300 saniye cache’de kalır.
- Query time: DNS cevap süresi. Yüksekse DNS sunucun yavaş demek.
- SERVER: Hangi DNS sunucusunun cevap verdiği.
Gelişmiş dig Kullanımı
DNS Propagasyonunu Test Etmek
Yeni bir kayıt ekledin veya değiştirdin, farklı nameserver’lardan kontrol etmek istiyorsun:
# Google DNS
dig @8.8.8.8 yenidomain.com A +short
# Cloudflare DNS
dig @1.1.1.1 yenidomain.com A +short
# OpenDNS
dig @208.67.222.222 yenidomain.com A +short
# Yerel DNS sunucusu
dig @192.168.1.1 yenidomain.com A +short
Bu sorguları bir döngüyle otomatize edebilirsin:
#!/bin/bash
DOMAIN="orneksite.com"
DNS_SERVERS=("8.8.8.8" "1.1.1.1" "208.67.222.222" "9.9.9.9")
echo "DNS Propagasyon Kontrolu: $DOMAIN"
echo "================================"
for dns in "${DNS_SERVERS[@]}"; do
result=$(dig @$dns $DOMAIN A +short)
echo "[$dns]: $result"
done
Trace ile DNS Çözümleme Yolunu Takip Etmek
Bir DNS sorgusunun root nameserver’dan başlayarak nasıl çözümlendiğini adım adım görmek için:
dig +trace orneksite.com
Bu komut inanılmaz derecede öğretici. Root nameserver’lardan başlar, TLD nameserver’larına geçer, oradan yetkili nameserver’a ulaşır. DNS ile ilgili bir sorun yaşıyorsan bu çıktı sana tam olarak nerede takıldığını gösterir.
DNSSEC Doğrulama
DNSSEC aktif olan bir domain için doğrulama bilgilerini görmek:
# DNSSEC kayıtlarını göster
dig +dnssec cloudflare.com
# DNSKEY kaydını sorgula
dig cloudflare.com DNSKEY
# DS kaydını sorgula
dig cloudflare.com DS
nslookup Kullanımı
nslookup hala bazı durumlarda pratik. Özellikle Windows ortamında veya hızlı bir sorgu için:
# Basit sorgu
nslookup google.com
# Belirli DNS sunucusuyla sorgu
nslookup google.com 8.8.8.8
# MX kaydı sorgulamak
nslookup -type=MX google.com
# TXT kaydı sorgulamak
nslookup -type=TXT google.com
# NS kaydı sorgulamak
nslookup -type=NS google.com
nslookup İnteraktif Mod
nslookup’ı interaktif modda da kullanabilirsin, özellikle birden fazla sorgu yapacaksan:
nslookup
> server 8.8.8.8
> set type=MX
> google.com
> set type=TXT
> google.com
> exit
Gerçek Dünya Senaryoları
Senaryo 1: Mail Sunucusu Sorunları
Bir müşteri “maillerimiz gitmiyor” diye arıyor. İlk yapman gereken şey MX kayıtlarını kontrol etmek:
# MX kayıtlarını kontrol et
dig ornekfirma.com MX +short
# SPF kaydını kontrol et
dig ornekfirma.com TXT +short | grep spf
# DMARC kaydını kontrol et
dig _dmarc.ornekfirma.com TXT +short
# Mail sunucusunun PTR kaydını kontrol et
dig -x 203.0.113.50 +short
Eğer MX kaydı yanlış bir sunucuyu işaret ediyorsa veya SPF kaydı eksikse mailler spam’e düşer ya da hiç gitmiyor olabilir. PTR kaydı eksikse de büyük mail sağlayıcıları seni reddeder.
Senaryo 2: SSL Sertifika Doğrulama Sorunu
Let’s Encrypt veya başka bir CA’dan sertifika almaya çalışıyorsun ama DNS doğrulama başarısız oluyor:
# DNS-01 challenge için oluşturulan TXT kaydını kontrol et
dig _acme-challenge.orneksite.com TXT +short
# Birden fazla DNS sunucusundan kontrol et (propagasyon için)
for dns in 8.8.8.8 1.1.1.1 9.9.9.9; do
echo -n "[$dns] "
dig @$dns _acme-challenge.orneksite.com TXT +short
done
DNS-01 challenge’ında sık karşılaşılan sorun, TXT kaydının henüz propagasyon tamamlanmadan doğrulama denemesi yapılması. Bu script ile hangi DNS sunucularında kaydın göründüğünü kontrol edebilirsin.
Senaryo 3: CDN Arkasındaki Sunucuya Ulaşmak
Cloudflare veya benzeri bir CDN kullanıyorsun ve orijinal sunucu IP’sini bulmak istiyorsun:
# Cloudflare arkasındaki alan adının farklı kayıtlarını kontrol et
dig orneksite.com A
dig orneksite.com AAAA
# Subdomain'lerin farklı kayıtlara işaret edip etmediğini kontrol et
dig direct.orneksite.com A
dig origin.orneksite.com A
# Sertifika bilgisinden subdomain bulmaya çalış
dig www.orneksite.com A
Senaryo 4: Zone Transfer Testi (Güvenlik Açığı Kontrolü)
Yetkisiz zone transfer, ciddi bir güvenlik açığıdır. DNS sunucunun buna izin verip vermediğini test etmek için:
# Önce NS kayıtlarını bul
dig orneksite.com NS +short
# Sonra her nameserver'a zone transfer denemesi yap
dig @ns1.orneksite.com orneksite.com AXFR
# Eğer cevap geliyorsa DNS sunucun yanlış yapılandırılmış demektir!
# Düzgün yapılandırılmış sunucu "Transfer failed" hatası verir
Zone transfer sadece yetkili secondary nameserver’lara izin verilmeli, halka açık olmamalı.
Senaryo 5: Yeni DNS Kayıtlarının Yayılmasını İzlemek
Nameserver değiştirdin veya yeni kayıt ekledin, propagasyonu takip etmek istiyorsun:
#!/bin/bash
# dns_check.sh - DNS propagasyon izleme scripti
DOMAIN=$1
RECORD_TYPE=${2:-A}
EXPECTED_VALUE=$3
DNS_SERVERS=(
"8.8.8.8:Google"
"1.1.1.1:Cloudflare"
"9.9.9.9:Quad9"
"208.67.222.222:OpenDNS"
"64.6.64.6:Verisign"
)
echo "Domain: $DOMAIN | Tip: $RECORD_TYPE | Beklenen: $EXPECTED_VALUE"
echo "=================================================="
PROPAGATED=0
TOTAL=${#DNS_SERVERS[@]}
for entry in "${DNS_SERVERS[@]}"; do
dns_ip="${entry%%:*}"
dns_name="${entry##*:}"
result=$(dig @$dns_ip $DOMAIN $RECORD_TYPE +short 2>/dev/null)
if [ "$result" = "$EXPECTED_VALUE" ]; then
echo "✓ [$dns_name - $dns_ip]: $result"
((PROPAGATED++))
else
echo "✗ [$dns_name - $dns_ip]: ${result:-Kayit bulunamadi}"
fi
done
echo "--------------------------------------------------"
echo "Propagasyon: $PROPAGATED/$TOTAL DNS sunucuda tamamlandi"
Bu scripti şöyle çalıştırabilirsin:
chmod +x dns_check.sh
./dns_check.sh orneksite.com A 203.0.113.10
Pratik dig Parametreleri
dig’in en işe yarayan parametrelerini bilmek zamanını ciddi ölçüde kısaltır:
- +short: Sadece cevabı göster, ekstra bilgi yok
- +noall +answer: Sadece ANSWER bölümünü göster
- +trace: Kök nameserver’dan başlayarak tüm çözümleme zincirini göster
- +dnssec: DNSSEC bilgilerini dahil et
- +tcp: UDP yerine TCP kullan (büyük cevaplar için)
- +time=5: Timeout süresini ayarla (saniye)
- +retry=3: Kaç kez tekrar deneyeceğini ayarla
- -4: Sadece IPv4 kullan
- -6: Sadece IPv6 kullan
- +multiline: Uzun kayıtları daha okunabilir formatta göster
- +stats: Sorgu istatistiklerini göster (varsayılan açık)
- +nostats: İstatistikleri gizle
# Sadece cevap bölümü, hiçbir ekstra bilgi olmadan
dig orneksite.com A +noall +answer
# TCP üzerinden büyük TXT kaydı sorgulamak
dig orneksite.com TXT +tcp
# IPv4 üzerinden sorgu yapmak
dig -4 @8.8.8.8 orneksite.com A
DNS Sorun Giderme Akışı
Herhangi bir DNS sorununla karşılaştığında izlemen gereken sistematik yaklaşım şu şekilde olmalı:
İlk olarak yerel DNS cache’ini temizle ve yerel çözümlemeyi kontrol et. Linux’ta systemd-resolve --flush-caches veya nscd -i hosts komutlarını kullanabilirsin.
Sonra yetkili nameserver’ları bul:
# Alan adının yetkili nameserver'larını bul
dig orneksite.com NS +short
# Doğrudan yetkili NS'e sorgu at (cache'siz cevap için)
dig @ns1.orneksite.com orneksite.com A +norec
+norec parametresi recursion istemez, yani nameserver sadece kendi zone’u için bilgi verir. Bu şekilde cache’lenmiş veri değil, gerçek kayıt değerini görürsün.
TTL değerlerini kontrol et. Eğer eski değer cache’deyse, TTL süresi dolana kadar beklemen gerekebilir:
# Farklı sunucuların TTL değerlerini karşılaştır
dig @8.8.8.8 orneksite.com A | grep -A 5 "ANSWER SECTION"
dig @1.1.1.1 orneksite.com A | grep -A 5 "ANSWER SECTION"
Otomasyon ve Monitoring İçin dig
DNS izleme scriptlerine dig çok iyi entegre oluyor. Basit bir uptime check scripti:
#!/bin/bash
# Kritik DNS kayıtlarını periyodik kontrol et
check_dns() {
local domain=$1
local type=$2
local expected=$3
result=$(dig @8.8.8.8 $domain $type +short 2>/dev/null | head -1)
if [ "$result" != "$expected" ]; then
echo "ALARM: $domain $type kaydı beklenen degeri döndürmedi!"
echo "Beklenen: $expected | Alinan: $result"
# Buraya alerting mekanizmanı ekleyebilirsin (Slack, mail vb.)
else
echo "OK: $domain $type -> $result"
fi
}
# Kritik kayıtları kontrol et
check_dns "orneksite.com" "A" "203.0.113.10"
check_dns "mail.orneksite.com" "A" "203.0.113.20"
check_dns "orneksite.com" "MX" "10 mail.orneksite.com."
Bu scripti cron’a ekleyip her 5 dakikada bir çalıştırabilirsin. DNS kayıtlarınızda beklenmedik bir değişiklik olduğunda anında haberdar olursunuz.
Windows Ortamında DNS Sorgulamak
Windows sysadminleri için nslookup hala birincil araç ama PowerShell’in Resolve-DnsName komutu çok daha güçlü:
# A kaydı sorgula
Resolve-DnsName orneksite.com -Type A
# Belirli DNS sunucusunu kullan
Resolve-DnsName orneksite.com -Server 8.8.8.8 -Type MX
# TXT kaydı
Resolve-DnsName orneksite.com -Type TXT
# Reverse lookup
Resolve-DnsName 8.8.8.8 -Type PTR
WSL2 kuruluysa Linux dig’i de kullanabilirsin, ki bu genellikle daha temiz çıktı verir.
Sonuç
dig ve nslookup, her sysadminin araç kutusunda olması gereken temel araçlar. Özellikle dig, DNS sorunlarını çözmede gerçekten güçlü bir araç. TTL değerlerini takip etmek, propagasyonu izlemek, zone transfer testleri yapmak, mail sorunlarını teşhis etmek… Bunların hepsinde dig seni hiç yüzüstü bırakmaz.
Pratikte en çok işime yarayan kombinasyonlar: dig @8.8.8.8 domain.com MX +short ile hızlı MX kontrolü, dig +trace domain.com ile DNS çözümleme zincirini takip etme ve propagasyon scriptleri ile otomatik izleme.
DNS sorunları çoğu zaman görünmez kalır, servisleri sessiz sedasız bozar. Bu araçları düzenli kullanmayı alışkanlık haline getirirsen, sorunları patlama olmadan tespit etme şansın çok artar. Bir sonraki DNS krizi geldiğinde paniklemek yerine dig’i açıp sistematik şekilde ilerleyebilirsin, bu da seni ekibinde “DNS’i bilen adam” yapacaktır.