$ Python ile Detaylı DNS Sorgulama: Bir Alan Adının Sırlarını Çözmek
Bir alan adının arkasında hangi IP adreslerinin olduğunu, e-postalarını hangi sunucuların yönettiğini veya hangi isim sunucularını kullandığını merak ettiniz mi? Tüm bu bilgiler, DNS (Domain Name System) kayıtlarında saklıdır. Bu makalede, Python'un güçlü dnspython kütüphanesini kullanarak bu kayıtları nasıl programatik olarak sorgulayacağımızı ve bir alan adının teknik sırlarını nasıl ortaya çıkaracağımızı göreceğiz.
Neden DNS Sorgulamalıyız?
DNS sorguları, ağ yöneticileri, siber güvenlik uzmanları ve geliştiriciler için temel bir araçtır. Bir web sitesinin altyapısını anlamak, e-posta teslim sorunlarını gidermek veya bir alan adının yapılandırmasını doğrulamak gibi birçok senaryoda kullanılır.
Gerekli Kütüphane: dnspython
Bu işlem için Python'un standart kütüphanesinde bulunmayan, ancak bu iş için en popüler ve kapsamlı araç olan dnspython kütüphanesini kullanacağız. Kurulumu oldukça basittir:
pip install dnspython
Temel DNS Kayıt Türleri ve Sorgulama
Aşağıdaki Python betiği, belirtilen bir alan adı için en yaygın DNS kayıt türlerini sorgular ve sonuçları düzenli bir şekilde ekrana basar.
- A Kaydı: Alan adını bir IPv4 adresine eşler.
- AAAA Kaydı: Alan adını bir IPv6 adresine eşler.
- MX Kaydı (Mail Exchange): Alan adına gönderilen e-postaları kabul eden posta sunucularını belirtir.
- NS Kaydı (Name Server): Alan adının DNS kayıtlarını barındıran yetkili isim sunucularını listeler.
- TXT Kaydı: Genellikle SPF, DKIM gibi e-posta doğrulama mekanizmaları veya site sahipliği doğrulaması için kullanılan metin tabanlı bilgiler içerir.
Örnek Python Kodu
Aşağıdaki betik, `virtualscrap.com` alan adı için tüm bu sorguları gerçekleştirir.
import dns.resolver
def get_dns_records(domain):
"""
Belirtilen alan adı için temel DNS kayıtlarını sorgular ve yazdırır.
"""
record_types = ['A', 'AAAA', 'MX', 'NS', 'TXT']
print(f"--- {domain} için DNS Kayıtları ---")
for record_type in record_types:
try:
answers = dns.resolver.resolve(domain, record_type)
print(f"\n[+] {record_type} Kayıtları:")
for rdata in answers:
print(f" - {rdata.to_text()}")
except dns.resolver.NoAnswer:
print(f"\n[!] {record_type} kaydı bulunamadı.")
except dns.resolver.NXDOMAIN:
print(f"\n[X] Alan adı ({domain}) mevcut değil.")
return
except Exception as e:
print(f"\n[X] {record_type} sorgusunda bir hata oluştu: {e}")
if __name__ == '__main__':
target_domain = "virtualscrap.com"
get_dns_records(target_domain)