DNS 3: DNS Çözümleme Nasıl Çalışır?

Süleyman Düzdaban
Turk Telekom Bulut Teknolojileri
9 min readJan 4, 2023

İsim Çözümleme (Name Resolution)

Bir web tarayıcının adres çubuğuna “bilkent.edu.tr” yazarak Enter’a bastığımızı farz edelim.
Web tarayıcı, adres çubuğundaki ifade bir URL’ye dönüşmüş olsa dahi URL içerisinden yalnızca alan adını yani “bilkent.edu.tr” ifadesini ayıklayarak bu alan adının işaret ettiği IP adresini öğrenmek için isim çözümleme sürecini başlatacaktır.

Web tarayıcılar, her DNS cevap mesajını belirli bir süreyle önbellekte tutarlar. Böylece, tutma süresi içerisinde gerçekleştirmeleri gereken diğer isim çözümleme işlemleri için DNS’e başvurmadan önbellekteki kayıtları kullanırlar. İsim çözümleme süreci başladığında web tarayıcılar ilk olarak kendi önbelleklerine başvururlar.

DNS standartları gereği bir DNS kaydına ait cevap mesajının TTL değeri süresince önbellekte tutulması gerekirken tarayıcılar genellikle bu kurala uymazlar. Örneğin Google Chrome TTL değerine bakmaksızın her kaydı 60 saniye boyunca; Mozilla Firefox ise TTL 60 saniyeden düşük bir değere işaret ediyorsa 60 saniye boyunca, 60 saniyeden büyük bir değere işaret ediyorsa TTL süresi boyunca kayıtları önbellekte tutar.

Google Chrome’da DNS cache’i temizlemek için adres çubuğuna şu ifadeyi girip Enter’a basın:

chrome://net-internals/#dns
Clear host cache butonuyla önbelleği temizleyebilirsiniz.

Mozilla Firefox’ta ise adres çubuğuna şu ifadeyi girip Enter’a basın:

about:networking#dns
Clear DNS Cache butonuyla önbelleği temizleyebilirsiniz.

Web tarayıcılar kendi önbelleklerinde bulamadıkları kayıtlar için isim çözümleme işlemine 2 farklı şekilde devam edebilirler:

  1. Tarayıcıda gömülü DNS resolver aracını kullanarak işletim sisteminde kayıtlı olan DNS resolver sunucuların ya da tarayıcı ayarlarında kullanıcı tarafından belirlenen kamuya açık DNS resolver sunucuların 53/UDP port’una veya “DNS over HTTPS” protokolü ile 443/TCP port’una direkt DNS sorgusu gönderir ve bu sunuculardan direkt yanıt alırlar (Bu yönteme başvurmadan önce kaydın işletim sistemindeki “hosts” dosyasında da aranması için işletim sistemiyle iletişime geçerler).
  2. İsim çözümleme işlemini gömülü DNS resolver aracılığıyla tarayıcı kendisi gerçekleştirmez; bunun yerine bir işletim sistemi API çağrısı aracılığıyla süreci işletim sistemine devrederek yine işletim sisteminden yanıt alırlar.

Birinci yöntemde isim çözümleme işlemi tarayıcı uygulamasına göre değişkenlik gösteren, ikinci yönteme göre daha karmaşık algoritmalar ile belirlenir ve henüz ikinci yöntem kadar yaygın olarak kullanılmamaktadır. Bu yüzden bu yöntemin detaylarına bu yazıda yer verilmemiştir.

İkincisi ise web tarayıcılar dışındaki uygulamaları da kapsayacak şekilde neredeyse tüm isim çözümleme işlemlerinde kullanılan en yaygın yöntemdir.

Bu yöntemde A kayıtları için isim çözümleme işlemini başlatan işletim sistemi bileşeni neredeyse tüm işletim sistemlerinde yer alan “getaddrinfo” kütüphane fonksiyonudur (Bu fonksiyon TTL değerini saklayamaz. Örneğin Google Chrome tarayıcı bu yüzden cache’te tuttuğu kayıtlar için varsayılan bir TTL süresi (60 saniye) kullanır. Mozilla Firefox tarayıcı ise TTL değerini elde etmek için ek DNS sorguları da gerçekleştirir). PTR kayıtları için IP adresi çözümleme işlemi ise “getnameinfo” fonksiyonu aracılığıyla gerçekleştirilir.

Web tarayıcı tarafından, “bilkent.edu.tr” alan adının işaret ettiği IP adresini öğrenmek için “getaddrinfo” fonksiyonuna istek ulaştığında bu alan adına ait kayıt, öncelikle varsa işletim sistemindeki DNS önbelleğinde aranır.
Linux-temelli işletim sistemlerinde genellikle varsayılan olarak işletim sistemi seviyesinde bir cache mekanizması kullanılmamaktadır.
Windows işletim sistemlerinde ise DNS önbelleğinin içeriği komut istemcisinde “ipconfig /displaydns” komutu çalıştırılarak görüntülenebilir.

Eğer işletim sistemi önbelleğinde, IP adresi bulunacak alan adına ait bir kayıt bulunamazsa “getaddrinfo” fonksiyonu isim çözümleme işlemine ilişkin sorgulamaları hangi kaynaklara yönelik olarak gerçekleştirmesi gerektiğini belirler.
Linux-temelli işletim sistemlerinde bu bilgiler genellikle /etc/nsswitch.conf dosyasında yer alır. Bu dosya içerisindeki “host:” ifadesiyle başlayan satırda isim çözümleme için kullanılabilecek kaynakların isimleri sıralanır.

Örnek satır:

hosts: files dns myhostname

Yukarıdaki örnek satır, isim çözümlemeleri için önce “hosts” dosyasının, ardından DNS sunucuların sorgulanması gerektiğini ifade eder.

(nslookup, dig vb. birçok DNS sorgulama aracı “hosts” dosyasına başvurmaz (ping komutu ise başvurur). Ayrıca bazı web tarayıcılarda “hosts” dosyasına başvurma işlemi devre dışı bırakılabilir)

“hosts” dosyasında bulunamayan kayıtlar için DNS sorgulaması gerçekleştirilir.
“getaddrinfo” tarafından, bu defa /etc/resolv.conf dosyasından DNS resolver adresleri alınır ve bu adreslerdeki DNS sunuculardan birine bir DNS sorgusu (A kaydı) gönderilir.
Sorgunun gönderildiği DNS sunucudan alınan cevap mesajı içerisindeki IP adresi (ya da “kayıt bulunamadı” bilgisi) web tarayıcıya iletilir.

DNS Sorgulama (DNS Lookup)

Yalnızca iki tür DNS mesajı vardır: sorgu (query) ve cevap (answer).

DNS sorguları isim ya da IP çözümleme işlemine ihtiyaç duyan istemciler tarafından DNS sunucularına gönderilen mesajlardır.
DNS cevapları ise bir sorguya karşılık olarak DNS sunuculardan sorguyu kendilerine ileten istemcilere gönderilen mesajlardır.

DNS’e başvuran bir uygulama DNS sunucuya bir sorgu mesajı gönderir ve DNS sunucudan cevap olarak yalnızca metinsel ifade içeren bir mesaj alır. DNS sunucuların, sorgulara ilişkin olarak bir metinsel ifade temin etmek dışında bir tasarrufu bulunmamaktadır. Bir DNS cevap mesajı, kullanıcıları bir adresten farklı bir adrese yönlendiremez ve istemcilere DNS mesajını nasıl yorumlamaları gerektiğine ilişkin bir bilgi sağla(ya)mazlar (Hatta DNS sunucular kendilerine ulaşan bir sorguya verdikleri cevabın sorguyu gönderen istemcilere başarıyla iletilip iletilmediğini dahi kontrol etmez/edemezler). Aldıkları cevap içerisindeki metinsel ifadeyi herhangi bir şekilde yorumlamak ya da yorumlamamak yalnızca cevabı alan istemcinin tasarrufundadır.

Örneğin “bilkent.edu.tr” için A kaydı sorgusu yapan bir istemcinin, eğer DNS sunucuda bu kayıt varsa aldığı cevap mesajı içerisinde,

  • sorgulanan alan adının kendisi (“bilkent.edu.tr”),
  • alan adının işaret ettiği IP adresi (“139.179.10.40”),
  • kaydın sınıfı (“IN”),
  • kaydın türü (“A”),
  • kaydın cache’te tutulma süresi [TTL — (time-to-live)] (Bu değer resolver’ın cache’inde zaten varsa resolver’ın cache’indeki değer; yoksa authoritative DNS sunucudaki kaydın içerisinde yer alan değer görüntülenir.)

ifadeleri yer alır (Genellikle DNS’e başvurularak elde edilmesi amaçlanan birincil önceliğe sahip değerler olmadıkları için “DNS sunucu adresi” ve “header flags” gibi metadata sayılabilecek değerler göz ardı edilmiştir). Sorgulanan kayıt DNS sunucuda bulunmuyorsa sunucu tarafından kaydın bulunmadığına ilişkin bir mesaj; sorguyu cevaplama işlemi hatayla sonuçlanırsa hataya ilişkin bir mesaj (sunucuda yapılandırma hatası vb.) gönderilir.

İstemci, var olan bir kayıda ilişkin bu mesaj içerisindeki değerleri,

  • IP adresine HTTP, FTP, SSH, RDP vb. protokolleri kullanarak erişmeyi denemek,
  • alan adı, IP adresi ve TTL bilgisini bir log dosyasında ya da veritabanında saklamak,
  • IP adresine yönelik PTR sorgusu gerçekleştirmek,
  • sadece cevap alabildiğinden emin olmak

gibi çeşitli işlemler için kullanabilir ya da cevap mesajını aldıktan sonra hiçbir şey yapmayabilir.

Bir DNS cevap mesajı içerisindeki ifadeleri görmek için Windows, Linux ve macOS işletim sistemlerinde varsayılan olarak yüklü olan “nslookup” komutunu kullanarak bir sorgu göndermeyi deneyebilirsiniz.

“nslookup” komutunu bir komut istemcide çalıştırabilirsiniz.
Komut istemcisini çalıştırmak için,

Windows’ta:

“Windows (Başlat)” tuşunu basılı tutarak “R” tuşuna basın. Görüntülenecek kutuya “cmd” yazıp Enter’a basın.

macOS’te:

Dock’taki Launchpad simgesini tıklayın ve arama kutusuna “Terminal” yazıp “Terminal” uygulamasını tıklayın.

Linux’ta:

Zaten biliyorsunuz.

Komut istemcide aşağıdaki komutu çalıştırın.

nslookup -debug -type=a bilkent.edu.tr.

Komutun çıktısından, cevap mesajının da yer aldığı bir kesit:

Bir alan adı kullanılarak yapılan sorgulamalar (A, CNAME, MX, TXT vb. yani PTR dışındaki tüm kayıt tipleri için yapılanlar) “DNS forward lookup” olarak isimlendirilir.
Bir IP adresi kullanılarak, yani PTR kaydı için yapılan sorgulamalar ise “DNS reverse lookup” olarak isimlendirilir.

DNS Çözümleme (DNS Resolution)

Bir DNS resolver’a gönderilen sorguyla birlikte DNS çözümleme işlemi başlar.

“bilkent.edu.tr” için A kaydı sorgusunun Google DNS resolver’lardan biri olan 8.8.8.8 adresli sunucuya gönderildiğini farz edelim.
8.8.8.8 adresli DNS resolver üzerindeki DNS server uygulaması öncelikle kendi DNS önbelleğinde bu kaydı arar ve kaydı bulması halinde bir DNS cevap mesajı ile bu kayda ait bilgileri kendisine sorguyu ileten istemciye gönderir.

DNS resolver, kaydı kendi önbelleğinde bulamazsa varsa sahip olduğu zone’lar içerisinde kaydı arar. Kaydı bulamaması halinde diğer DNS sunuculara sorgu göndererek kaydı bulmaya çalışır (Diğer DNS sunuculara sorgu gönderebilmesi için üzerindeki DNS server uygulamasında “recursion” özelliğinin etkinleştirilmiş olması gerekir). DNS server uygulaması, sorgulanan alan adına ilişkin istekleri belirli bir DNS sunucuya yönlendiren bir yapılandırmaya (DNS forwarding) sahipse resolver tarafından, bu yapılandırma ile belirlenmiş olan DNS sunucu adreslerine bir sorgu gönderilir ve yanıt beklenir.

Eğer resolver, forwarding yöntemine başvuracak şekilde yapılandırılmamışsa bu durumda “iteration” yöntemine başvurarak tekrar eden birkaç sorgu ile kaydı elde etmeye çalışır.

Iterative sorgulama en büyük/kapsayıcı zone’dan yani alan adının en sağından başlar. Alan adının en sağında, genellikle görünür olmayan bir adet nokta (“.”) karakteriyle “Kök Alan Adı (Root Domain/Zone) temsil edildiğinden ilk sorgu “Kök DNS Sunucular (Root DNS Servers)” olarak bilinen sunuculara gönderilir. Bu sunucuların IP adresleri tüm DNS resolver uygulamalarında yerleşik olarak bulunmaktadır. Bu yüzden bu sunuculara DNS sorgusuna ihtiyaç duymadan direkt erişebilirler.

“bilkent.edu.tr”ye ilişkin A kaydı sorgusu root DNS sunuculardan birine gönderilir. Root DNS sunucular yalnızca üst seviye alan adlarına ait DNS kayıtlarını barındırdıklarından alan adının en sağındaki görünmeyen nokta karakterinden sonra gelen “tr” üst seviye alan adından sorumlu olan DNS sunucuların adreslerini içeren aşağıdaki gibi bir cevap gönderirler (Aşağıdaki ifadeler gerçek sorgulamalara ait cevap mesajlarından alınmış kesitlerdir. Değerler zaman içerisinde değişiklik gösterebilir).

“ANSWER SECTION” bölümünde, “tr” uzantılı alan adlarına ait kayıtların tutulduğu DNS sunucuların adresleri yer alır.
“ADDITIONAL SECTION” bölümünde ise bu DNS sunucuların IP adresleri yer alır.

Resolver tarafından root DNS sunuculara bir “A” kaydı sorgusu gönderildiği halde cevap olarak bir “A” kaydı gönderilmemiştir. Çünkü root DNS sunucularda “bilkent.edu.tr” alan adına ait DNS kayıtları tutulmamaktadır. Bunun yerine bu kayıtları tutan yetkili DNS sunuculara ulaşmak için yol gösterici bazı bilgiler, yani üst seviye alan adları için yetkili olan DNS sunucuların adresleri tutulmaktadır. Bu tür cevap mesajları “DNS başvuru mesajı (DNS referral)” olarak da adlandırılır.

(Bu DNS sunucuların IP adreslerini belirlemek için tekrar DNS sorgusuna başvurulması gerekecek olursa bitmeyen bir döngü meydana geleceğinden yetkili DNS sunucuların alan adları ile birlikte IP adresleri de cevap içerisinde yer alır. NS sorgularına verilen cevap mesajları içerisinde yer alan DNS sunucularına ait bu A kayıtlarına “Glue Records” da denir.)

8.8.8.8 adresli DNS resolver ANSWER bölümündeki bu 7 DNS sunucudan birini (genellikle sıralamada en üstte olanı) seçer ve bu defa sorguyu bu sunuculardan birine gönderir. Ardından aşağıdaki ifadeleri içeren bir cevap alır.

Bu cevap mesajı içerisinde “edu.tr” alan adından sorumlu DNS sunucuların adresleri yer alır. DNS resolver bu defa ANSWER bölümündeki 6 DNS sunucudan birini seçer ve sorguyu bu sunucuya gönderip aşağıdaki gibi bir cevap alır.

Bu cevap mesajı içerisinde ise “bilkent.edu.tr” alan adından sorumlu DNS sunucuların adresleri yer alır. DNS resolver ANSWER bölümündeki sunuculardan birini seçer ve “bilkent.edu.tr” için bir A kaydı sorgusu gönderir.
İlgili DNS sunucu, resolver’a aşağıdaki ifadeleri içeren bir cevap mesajı gönderir.

Bu son sorgu ve cevap mesajı ile birlikte iteration işlemi tamamlanmış olur.

Son olarak, 8.8.8.8 adresli DNS resolver elde ettiği cevap mesajını sorguyu kendisine ulaştıran istemciye teslim eder.
Böylece DNS çözümleme işlemi tamamlanmış olur.

Ters DNS Çözümleme (Reverse DNS Resolution)

“bilkent.edu.tr” alan adının işaret ettiği IP adresi olan 139.179.10.40 için PTR sorgusu gerçekleştirdiğimizi varsayalım.

(Web tarayıcılar tarafından genellikle PTR sorgulamalarına ihtiyaç duyulmaz.)

IP adres blokları için yetkili DNS sunucu adreslerini tespit etmek üzere resolver’lar tarafından ilk olarak “arpa” isimli üst seviye zone’a başvurulur.

IPv4 adresler için “in-addr” alt zone’una, IPv6 adreslere ait olanlar içinse “ip6” alt zone’una başvurulur.

Ardından IP bloklarından sorumlu olan alt seviye zone’lara başvurularak kayda ulaşılır.

A, B ve C sınıfı IP blokları için yetkili DNS sunucular, ICANN bağlı kuruluşları (RIR — Regional Internet Registries) tarafından yönetilir. IP adresleri, bu kurumlar ya da bu kurumların yetkili kıldığı aracı kurumlar aracılığıyla kullanıcılara tahsis edilir.

Alan adlarının tersine, IP adreslerinin en soldaki octet’leri daha kapsayıcı olduğundan PTR sorgulamaları IP adreslerinin en soldaki octet’inin içerisinde yer aldığı zone’dan başlayarak çözümlenir.

139.179.10.40 için PTR sorgusu bir DNS resolver’a ulaştığında, resolver tarafından bu adres “40.10.179.139.in-addr.arpa” ifadesine dönüştürülüp yine root DNS sunuculardan başlayarak iterative sorgular gerçekleştirilir.

Root DNS sunuculardan gelen “arpa” alan adı için yetkili DNS sunucu adreslerini içeren cevap mesajından bir kesit.
“in-addr.arpa” alan adı için yetkili DNS sunucu adreslerini barındıran DNS sunucular.
“139.in-addr.arpa” alan adı için yetkili DNS sunucu adreslerini barındıran DNS sunucular.
“179.139.in-addr.arpa” alan adı için yetkili DNS sunucu adreslerini barındıran DNS sunucular.
“10.179.139.in-addr.arpa” alan adı için yetkili DNS sunucu adreslerini barındıran DNS sunucular.
“10.179.139.in-addr.arpa” alan adı için yetkili DNS sunucu tarafından gönderilen 139.179.10.40 adresine ait PTR kaydı.

--

--