Şikayet
Müşteri sunucusunda ping 8.8.8.8 ve ping 1.1.1.1
sorunsuz çalışıyor — yani IP seviyesinde internet erişimi tam. Ama
ping google.com ya da apt update çalıştırıldığında
hata alınıyor. /etc/resolv.conf kontrol edilmiş,
nameserver 8.8.8.8 satırı doğru, dosya izinleri sorunsuz.
Klasik "önce resolv.conf'a bak" tavsiyesi burada işe yaramıyor.
Doğrulama
SSH ile bağlanıp şikayeti doğruladım: domain tabanlı her istek başarısız
oluyor, IP tabanlı her istek çalışıyor. /etc/resolv.conf ve arayüz
durumunu (ifconfig down/up) kontrol ettim — hepsi normal
görünüyordu.
strace ile Kök Neden Analizi
Sorun dosyalarda görünmediği için, ping komutunun çalışırken
hangi dosyalara dokunduğunu görmek için strace kullandım:
strace -e trace=open,openat ping google.com
Çıktıda ilgili satırlar sırasıyla /etc/nsswitch.conf,
/etc/host.conf, /etc/resolv.conf ve
/etc/hosts dosyalarına uğruyordu — ve hemen ardından şu hata
tekrar tekrar geliyordu:
openat(AT_FDCWD, ".../libnss_mdsn4_minimal.so.2", O_RDONLY|O_CLOEXEC)
= -1 ENOENT (No such file or directory)
İlk uğranılan dosya nsswitch.conf olduğu için önce onun
içeriğine baktım.
Bulgu: Tek Harflik Yazım Hatası
nsswitch.conf'ta hosts satırında, olması gereken
dns yerine dsn yazılmıştı:
hosts: files dsn # olması gereken: dns
Bunu düzeltip tekrar denediğimde ping google.com ve
apt update sorunsuz çalıştı.
Neden Bu Hatayı Veriyordu?
Linux'ta bir uygulama bir alan adını çözmek istediğinde doğrudan
resolv.conf'a gitmez — önce NSS (Name Service
Switch) katmanı, nsswitch.conf'a bakarak "hosts" için
hangi modülün kullanılacağını sorar. Sistem dns yerine yazım
hatasıyla dsn gördüğü için, gerçek modül olan
libnss_mdns4_minimal.so.2 yerine var olmayan
libnss_mdsn4_minimal.so.2'yi aramaya çalışıyor ve
bulamadığı için domain çözümlemesi tamamen devre dışı kalıyordu — ama IP
tabanlı trafiği bu katman hiç etkilemediği için ping IP ile çalışmaya devam
ediyordu.
Öğrendiklerim
- Bir uygulama alan adı çözerken doğrudan
resolv.conf'a gitmez — öncensswitch.confüzerinden NSS katmanına uğrar. digvenslookupgibi araçlarnsswitch.conf'u bypass edebiliyor — yani bu araçlarla test etmek, asıl sorunu maskeleyebilir.
Hızlı teşhis kuralı: dig çalışıyor ama ping/uygulama
çözemiyorsa, sorun DNS sunucusunda değil — doğrudan
nsswitch.conf'a bak.