resolvectl ile systemd-resolved DNS Sorgularını İzleme, Önbelleği Temizleme ve Sorun Giderme
Bir Ubuntu 22.04 sunucusunda “neden bu domain çözümlenmiyor?” sorusunu saatlerce araştırdıktan sonra şunu fark ettim: sorun çoğu zaman DNS’in kendisinde değil, DNS’i nasıl izlediğimizde yatıyor. systemd-resolved modern Linux dağıtımlarının vazgeçilmezi haline geldi, ama çoğu sysadmin hâlâ eski alışkanlıklarla nslookup veya /etc/resolv.conf‘a bakıyor. Oysa resolvectl bu işin gerçek aracı.
systemd-resolved ve resolvectl Ne İşe Yarar?
systemd-resolved, systemd ekosisteminin DNS çözümleme servisidir. Önbellek yönetimi, DNSSEC doğrulama, DNS-over-TLS ve çoklu DNS sunucu desteği gibi özellikleri tek çatı altında toplar. resolvectl ise bu servisin komut satırı arayüzüdür.
Neden önemli? Çünkü modern Ubuntu, Debian, Fedora ve RHEL sistemlerinde /etc/resolv.conf artık doğrudan düzenlenmez. Bu dosya genellikle /run/systemd/resolve/stub-resolv.conf‘a sembolik link olarak işaret eder ve 127.0.0.53 adresini gösterir. Bu IP, systemd-resolved’ın dinlediği stub resolver adresidir.
ls -la /etc/resolv.conf
# lrwxrwxrwx 1 root root 39 ... /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
cat /etc/resolv.conf
# nameserver 127.0.0.53
# options edns0 trust-ad
Bu yapıyı anlamadan DNS sorunlarını çözmeye çalışmak, motorun kaputunu açmadan araba tamir etmeye benziyor.
resolvectl status: Sistemin DNS Durumunu Okumak
Her şeyin başlangıç noktası resolvectl status komutu. Bu komut hem global DNS ayarlarını hem de her ağ arayüzü için özel ayarları gösterir.
resolvectl status
Çıktı şuna benzer bir yapıda gelir:
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
DNS Servers: 8.8.8.8 8.8.4.4
DNS Domain: ~.
Link 2 (eth0)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.1.1
DNS Servers: 192.168.1.1
DNS Domain: office.local
Burada dikkat edilmesi gereken birkaç nokta var:
- Protocols satırındaki DNSSEC=no/unsupported: Eğer DNSSEC doğrulama yapılmıyorsa ve bunu bekliyor idiysek, burada görürüz.
- resolv.conf mode: stub: Sistemin stub resolver modunda çalıştığını gösterir. Bu beklenen durum.
- DNS Domain: office.local: Bu arayüzün hangi domain için varsayılan olduğunu söyler. Search domain mantığıyla çalışır.
- Current DNS Server: O anda aktif kullanılan sunucu. Birden fazla sunucu tanımlıysa hangisinin kullanıldığını buradan görürüz.
Belirli bir arayüzün durumunu görmek için:
resolvectl status eth0
DNS Sorgularını Gerçek Zamanlı İzlemek
İşte burada resolvectl gerçek gücünü gösteriyor. resolvectl monitor komutu, sistemde gerçekleşen tüm DNS sorgularını canlı olarak izlememizi sağlar.
resolvectl monitor
Bu komutu çalıştırdıktan sonra başka bir terminalde bir şeyler deneyin:
curl https://github.com
ping google.com
Monitor ekranında şunu görürsünüz:
TIMESTAMP IN/OUT PROTOCOL TYPE SERVER NAME RCODE
2024-01-15 14:23:11 UTC OUT DNS A 192.168.1.1 github.com SUCCESS
2024-01-15 14:23:11 UTC OUT DNS AAAA 192.168.1.1 github.com SUCCESS
2024-01-15 14:23:15 UTC OUT DNS A 192.168.1.1 google.com SUCCESS
Bu çıktı bir production ortamında inanılmaz değerli. Özellikle şu senaryolarda:
- Bir uygulama beklenmedik DNS sorguları yapıyor mu?
- DNS yanıt süreleri neden yavaş?
- Hangi DNS sunucusu kullanılıyor?
Gerçek hayatta yaşadığım bir örnek: Bir microservice uygulaması rastgele bağlantı hataları veriyordu. resolvectl monitor ile izlediğimde, uygulamanın her 30 saniyede bir aynı servis adını sorguladığını ve zaman zaman NXDOMAIN aldığını gördüm. Sorun uygulamanın kendisinde değil, Kubernetes DNS politikasında bir tutarsızlıktı.
resolvectl query: Manuel DNS Sorguları Yapmak
nslookup veya dig yerine resolvectl query kullanmak, sistemin gerçekte nasıl bir DNS deneyimi yaşadığını görmenizi sağlar. Çünkü bu komut, aynen sistem uygulamalarının kullandığı aynı resolver stack’ini kullanır.
resolvectl query github.com
Çıktı:
github.com: 140.82.121.4
-- Information acquired via protocol DNS in 45.3ms.
-- Data is authenticated: no; Data was acquired via local or encrypted transport: no
-- Data from: network
Buradaki “Data from: network” ifadesi önemli. Eğer önbellekten geliyorsa “Data from: cache” yazar. Sorgunun önbellekten mi ağdan mı geldiğini bu şekilde ayırt edebilirsiniz.
Belirli bir kayıt türünü sorgulamak için:
resolvectl query --type=MX gmail.com
resolvectl query --type=TXT _dmarc.example.com
resolvectl query --type=AAAA ipv6.google.com
resolvectl query --type=SRV _http._tcp.example.com
Belirli bir DNS sunucusuna karşı sorgu yapmak:
resolvectl query --dns-server=1.1.1.1 example.com
Bu parametre özellikle şu senaryoda işe yarıyor: “Local DNS sunucusu farklı cevap mı veriyor, yoksa upstream’den mi geliyor?” sorusunu yanıtlamak için.
Önbellek Yönetimi: Flush ve İstatistikler
DNS önbelleği bazen sorunların kaynağı olur. Bir domain’in IP’si değişti ama sistem hâlâ eski IP’ye gidiyor olabilir. TTL süresi dolmadan bu durumu çözmek için önbelleği temizleriz.
sudo resolvectl flush-caches
Bu komut tüm arayüzlerdeki DNS önbelleğini temizler. Komut sonrasında herhangi bir çıktı vermez, sessizce çalışır. Başarılı olup olmadığını kontrol etmek için istatistiklere bakabiliriz.
resolvectl statistics
Çıktı:
Transactions: 1482
Cache: 54/512 currently cached entries
DNSSEC Verdicts: secure=0 insecure=0 bogus=0 indeterminate=54
- Transactions: Toplam DNS işlem sayısı. Yüksek bir değer, sistemin yoğun DNS aktivitesi yaptığını gösterir.
- Cache: Şu an önbellekte kaç kayıt var, maksimum kapasite ne.
- DNSSEC Verdicts: DNSSEC doğrulama sonuçları.
bogus=0olması iyi; eğer bogus değeri yüksekse bir şeyler yanlış gidiyor demektir.
Flush sonrası istatistikleri tekrar kontrol ettiğinizde cache değerinin sıfırlandığını göreceksiniz. Bu, temizleme işleminin çalıştığını doğrular.
Gerçek Dünya Senaryosu: Şirket İçi DNS Sorununu Çözmek
Kurumsal ortamlarda sık karşılaşılan senaryo: VPN bağlandıktan sonra iç domainler çözümlenmiyor. Mesela app.internal.company.com adresine ulaşılamıyor ama internet çalışıyor.
Önce mevcut durumu kontrol edelim:
resolvectl status
Burada VPN arayüzünün (genellikle tun0 veya wg0) DNS ayarlarına bakıyoruz. Eğer VPN arayüzünde company.com domain’i için özel bir DNS tanımlanmamışsa, sistem bu sorguyu yanlış sunucuya gönderiyor olabilir.
Durumu doğrulamak için:
resolvectl query app.internal.company.com
# Hata alıyorsak:
resolvectl query --type=A app.internal.company.com
Sonra hangi DNS sunucusunun kullanıldığına bakalım:
resolvectl status tun0
Eğer VPN arayüzünde doğru DNS sunucusu atanmamışsa, NetworkManager veya VPN istemci konfigürasyonunu kontrol etmek gerekir. Geçici olarak bir arayüze DNS sunucusu atayabiliriz:
sudo resolvectl dns tun0 10.0.0.1
sudo resolvectl domain tun0 internal.company.com
Bu komutlar tun0 arayüzüne 10.0.0.1‘i DNS sunucusu olarak atar ve internal.company.com domain’ini bu arayüze bağlar. Artık internal.company.com ile biten sorgular 10.0.0.1‘e gönderilir.
Değişikliği doğrulayın:
resolvectl status tun0
resolvectl query app.internal.company.com
Bu yapılandırma geçicidir, sistem yeniden başladığında sıfırlanır. Kalıcı ayar için NetworkManager veya /etc/systemd/resolved.conf dosyasını düzenlemek gerekir.
systemd-resolved Konfigürasyonu
/etc/systemd/resolved.conf dosyası global DNS ayarlarını yönetir. Aşağıda yaygın bir kurumsal konfigürasyon örneği:
cat /etc/systemd/resolved.conf
[Resolve]
DNS=192.168.1.10 192.168.1.11
FallbackDNS=8.8.8.8 1.1.1.1
Domains=company.com internal.company.com
DNSSEC=allow-downgrade
DNSOverTLS=opportunistic
Cache=yes
CacheFromLocalhost=no
Önemli parametreler:
- DNS: Birincil DNS sunucuları. Boşlukla ayrılmış birden fazla sunucu yazılabilir.
- FallbackDNS: Birincil sunucular yanıt vermediğinde kullanılacak yedek sunucular.
- Domains: Bu sunucuların yetkili olduğu domain’ler.
~.yazılırsa tüm domainler için kullanılır. - DNSSEC:
yes,noveyaallow-downgrade. Üretimdeallow-downgradegenellikle en güvenli pratik seçenek. - DNSOverTLS:
yes,noveyaopportunistic.opportunisticmümkün olduğunda TLS kullanır, başaramazsa düz DNS’e düşer. - Cache: Önbelleği etkinleştirir veya devre dışı bırakır. Neredeyse her zaman
yesbırakın.
Konfigürasyonu değiştirdikten sonra servisi yeniden başlatın:
sudo systemctl restart systemd-resolved
Log’ları İncelemek: journalctl ile Derinlemesine Analiz
resolvectl monitor yeterince detay vermediğinde veya geçmişteki bir sorunu araştırıyorsanız, journalctl devreye girer.
sudo journalctl -u systemd-resolved -f
-f parametresi canlı takip sağlar. Daha ayrıntılı log için resolved’ın log seviyesini artırmak gerekebilir:
sudo resolvectl log-level debug
Bu komut sonrasında journalctl çıktısı çok daha verbose hale gelir. Her DNS sorgusunun ayrıntılarını görürsünüz. Sorunu bulduktan sonra log seviyesini normale döndürmeyi unutmayın:
sudo resolvectl log-level info
Belirli bir domain ile ilgili log satırlarını filtrelemek:
sudo journalctl -u systemd-resolved --since "1 hour ago" | grep "github.com"
Zaman aralığı belirterek geçmiş olayları incelemek:
sudo journalctl -u systemd-resolved --since "2024-01-15 10:00:00" --until "2024-01-15 11:00:00"
LLMNR ve mDNS: Kapatmak mı, Açmak mı?
resolvectl status çıktısında LLMNR ve mDNS protokollerini görürsünüz. Bunlar yerel ağda isim çözümleme için kullanılan protokollerdir. Ancak kurumsal ortamlarda güvenlik açısından riskli olabilirler.
LLMNR (Link-Local Multicast Name Resolution) özellikle Windows ortamlarında NBNS zehirleme saldırılarına açık kapı bırakabilir. Gerekli değilse kapatın:
# /etc/systemd/resolved.conf içine ekleyin:
# LLMNR=no
# MulticastDNS=no
sudo nano /etc/systemd/resolved.conf
[Resolve]
LLMNR=no
MulticastDNS=no
sudo systemctl restart systemd-resolved
resolvectl status | grep -E "LLMNR|mDNS"
Kapatıldığında status çıktısında -LLMNR -mDNS şeklinde görünür.
DNS-over-TLS Yapılandırması ve Doğrulama
Gizlilik odaklı ortamlarda DNS sorgularını şifrelemek isteyebilirsiniz. DNS-over-TLS (DoT) bunun için kullanılır.
sudo nano /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.1#cloudflare-dns.com 8.8.8.8#dns.google
DNSOverTLS=yes
Burada # sonrasındaki kısım, TLS sertifikasını doğrulamak için kullanılan SNI (Server Name Indication) adıdır. Bu sayede sadece IP eşleşmesi değil, sertifika doğrulaması da yapılır.
Değişikliği uygulayın ve test edin:
sudo systemctl restart systemd-resolved
resolvectl status | grep -i TLS
resolvectl query example.com
Sorgu çıktısında “Data was acquired via local or encrypted transport: yes” görüyorsanız DoT çalışıyor demektir.
Pratik Sorun Giderme Akışı
Bir DNS sorunu geldiğinde izlediğim adım sırası şu:
# 1. Servisin çalışıp çalışmadığını kontrol et
systemctl status systemd-resolved
# 2. Genel durumu gözden geçir
resolvectl status
# 3. Problematik domain'i sorgula
resolvectl query problematic-domain.com
# 4. Önbelleği temizle ve tekrar dene
sudo resolvectl flush-caches
resolvectl query problematic-domain.com
# 5. Farklı DNS sunucusuyla karşılaştır
resolvectl query --dns-server=8.8.8.8 problematic-domain.com
# 6. İstatistiklere bak
resolvectl statistics
# 7. Gerekirse canlı izlemeye geç
resolvectl monitor
Bu akış, sorunun önbellekten mi kaynaklandığını, DNS sunucusundan mı yoksa başka bir şeyden mi olduğunu sistematik olarak ortaya koyar.
Bir başka yaygın sorun: /etc/resolv.conf‘un yanlış yapılandırılması. Eğer bu dosya stub resolver’a işaret etmiyorsa, systemd-resolved‘ı bypass ederek doğrudan DNS sorgularına gidilir ve resolvectl çıktılarıyla gözlemlediğiniz ayarlar geçersiz kalır.
# Doğru bağlantıyı kontrol et
ls -la /etc/resolv.conf
# Eğer symlink değilse:
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
resolvectl’in Göz Ardı Edilen Parametreleri
Sık kullanılmayan ama bazen kritik öneme sahip birkaç parametre daha:
- resolvectl reset-statistics: İstatistik sayaçlarını sıfırlar. Belirli bir zaman dilimini ölçmek istediğinizde işe yarar.
- resolvectl dns: Bir arayüze DNS sunucusu atar (yukarıda gösterdik).
- resolvectl domain: Bir arayüze search domain atar.
- resolvectl default-route: Bir arayüzün varsayılan rota olup olmayacağını belirler.
resolvectl default-route eth0 yesgibi kullanılır. - resolvectl revert: Bir arayüzün tüm DNS ayarlarını sıfırlar, varsayılana döner.
# eth0'ın DNS ayarlarını sıfırla
sudo resolvectl revert eth0
Bu komut özellikle geçici testler yaptıktan sonra sistemi temiz bırakmak için kullanışlıdır.
Sonuç
resolvectl, modern Linux sistemlerinde DNS sorunlarını çözmek için neredeyse her şeyi sağlıyor: gerçek zamanlı izleme, önbellek yönetimi, arayüz bazlı konfigürasyon ve detaylı istatistikler. Ancak bu aracın değerini tam anlamıyla kullanabilmek için systemd-resolved‘ın mimarisini ve stub resolver konseptini anlamak şart.
Çoğu DNS sorunu aslında üç kategoriden birine giriyor: yanlış DNS sunucusu atanmış, önbellekte eski kayıt kalmış veya arayüz bazlı yönlendirme eksik. resolvectl bu üç durumu da hızla tespit ettiriyor. Eski alışkanlıklarla nslookup veya /etc/resolv.conf düzenlemesiyle vakit kaybetmek yerine, resolvectl status ile başlayıp resolvectl monitor ile devam etmek çok daha verimli bir yaklaşım.
Production’da bir DNS sorunu geldiğinde paniğe gerek yok. Yukarıdaki adım sırasını takip edin, istatistikleri okuyun ve monitörü açın. Sorunun kaynağı büyük olasılıkla birkaç dakika içinde netleşecek.
