EnderUnix Software Development Team

 

 

 

Versiyon: 2 

                             

 
Giriş: 

                             

02 Ağustos 2001
 

BIND, the Buggy Internet Name Daemon is like Microsoft Windows. The damn thing doesn't work. Every version has been brimming with bugs.                                
                                                                          --D.J.Bernstein ( http://cr.yp.to/djbdns/ad/unbind.html )

 

Bu dökumanda şu an Unix dünyasında bulunan en güvenli dns sunucusu olan djbDNS ve kurulumu anlatılacaktır.DjbDNS D.J.Bernstein tarafından yazılmıştır.  Kendisi aynı zamanda qmail,tcpserver,publicfile,daemontools gibi çeşitli sistem yazılımları yazmıştır. Sanırım üssteki ifadeye katılmamak mümkün değil.DjbDNS gerek üniversite gerekse ticari şirketler tarafından rahatça kullanılabilir. Bind tek başına SPOI (Single Point of InSecuritness ) lakabını yeterince hakketmektedir. Ayrıca djbdns dns sistemi için yeni client libraryleride sunmaktadır. http://cr.yp.to/djbdns/ad/library.html adresinden gerekli bilgiler edinebilir.

OpenBSD üzerine kurulacak basit bir makinada djbdns 2-3 sene kesintisiz hizmet verebilir. OpenBSD'yi merak ediyorsanız http://www.enderunix.org/docs/openbsd_installation.html adresinde TÜRKÇE kurulum klavuzundan yaralanarak bu işletim sistemine bir giriş yapabilirsiniz.

 

Bilindiği üzere şu anda dünya üzerinde en çok kullanılan dns server yazılımı olan Bind paketinde bir çok vulnerability bulunmaktadır. Bunların ortaya çıkması sadece zaman meselesidir. Nitekim şu an kullanılan bind sürümünde bile birkaç vulnerability'nin var olduğu ve bunun internette trade yapıldığı konuşulmaktadır. Söylenti bile olsa bind'i kullanmak zorunda olan sistem yöneticileri ne demek istediğimi anlayacaklardır. Securityfocus.com adresinde de djbdns kurulumu anlatılmaktadır. Zaten djbdns ile biz böyle tanıştık. Sendmailden Qmail'e çekilen zorlukları bind'tan djbdns'e geçerken yaşamayacaksınız. Bu yazının sonunda bind ve djbdns karşılaştırmasının adresi de verilecektir.

Genel Notlar
Bu dokumanin en guncel hali; http://www.enderunix.org/docs/djbdns_installation.html adresindedir.

Aksi belirtilmedigi takdirde bu kabil dokumanlarin hakları  yazan yazarlarda saklidir. Bu dokuman da, parca parca ya da tamamen herhangi bir sekilde, yazarinin izni dahilinde dagitilabilir.

Yazar, bu dokumani okuyanlarin ugrayacaklari herhangi bir zarardan oturu sorumluluk kabul etmez. Use-at- your-own-risk!

Eger, herhangi bir konuda yardima ihtiyaciniz olursa, roots@enderunix.org  adresine mail atabilirsiniz.!

 

DNS Nedir?
Domain Name System [DNS] dagıtık yapıda bir databasedir. Bu sistem hostnameleri IPv4(yada ipv6) yada IPv4 adresleri hostnamelere çevirmeye yarar. Ayrıca bir domain için gerekli mail sunucusunun adreslerini yada domain name serverlarının hangi IP'de bulunduğunu daha teknik bir ifade ile RR(Resource Records)'ları tutar.DNS yapısı gereği hızlı olmalıdır. Bu yüzden yapılan sorgulamalar eğer 512 byte'tan küçük ise yada master dns server ile slave dns server arası zone transferi değlise UDP üzerinden yapılacaktır. DNS sisteminin yazaları dns için gerekli  bilgileri diğer internet araçlarında olduğu gibi RFC'lerde tanımlamışlardır. 
(RFC 1034 ve 1035) Bu dökumanlara bakarsanız içinde birkaç kod ve zone file'larının nasıl yazılacağını bulursunuz.

 

BIND (Berkeley Internet Name Daemon)da yazılırken bu kriterler dikkate alınmıştır. Fakat bu sistemde gereksiz karmaşıklıkta code'lar ve bunun getirdiği güvenlik problemleri vardır. Fakat djbdns bu karmaşadan uzak ve güvenli bir yazılımdır. Bunun sonucu olarakta two-thumbs-up bir daemon olmayı bizce hak kazanmıştır. Hatta bizce bind 9.1.X ve ileriki surumlerinde kullanılan Dns-sec sistemi bile  bind için bir çözüm olmaktan çok uzaktır. Sonuçta temel yani daemon internetin ilk zamanlarından kalmıştır. Şu an ipv4'te yaşanılan güvenlik sorunlarda aynı sebepten oluşmaktadır. 

Bu yüzden köklü bir değişim olması gerekliliği savunulmuş ve ipv6 ortaya atılmıştır. Bind içinde benzer model söz konusu olmadıkçca djbdns popüleritesini sürdürecektir. (Haklı bir popülerite !!!).

 

Genel olarak dns yazılımlarının yaptığı iki vazife vardır. Bind kullananlar eğer çok profesyenel değillerse yada bu konu ile alakalı kitap okunmamışsa bu iki olguyu karıştırabilmektedirler. Bunlar:

1)  Resolving: Aranılan bir kaydı bulma işlemi.Mesela http://www.yildiz.edu.tr/ adresine karşılık gelen ipv4 adresinin 193.140.1.1 olmasının bulunması. Resolving yapan yazılımlar iki çeşit resolving yaparlar; recursive resolving yada non-recursive resolving. Querylerde gönderilen RD (recursion required) bitlerine göre querynin tipi belirlenir. Non-recursive querylere cevap veren serverlar cevap olarak recursive name servları verirler.

Sonuç olarak yapılan bir query recursive ise http://www.yildiz.edu.tr/ için direk 193.140.1.1 IP'si yada host bulunamadı cevabı verilebilir. Fakat non-recursive bir query'de cevabı bulmak için başka bir name server ip'si verebilir. Non-recursive query'ler aynı anda iterative query'ler olarakta bilinirler.

2)  Authoritive Nameserving: Bir domain hakkında bilgi bulunduran daemondur. Mesela yildiz.edu.tr domainin MX,NS,A (Bunlar Resource Record olarak bilinir) recordlarının yada kayıtlarının tutulduğu name serverdır.

 

 

CANLI BIR ÖRNEK:
Bir query nasıl yapılır. Mesela http://www.yildiz.edu.tr/ adresinin ipv4 karşılığı nedir? Bunun için resolver yada sizin bilgisayarınız internette birkaç authoritive name serveları gezmek zorundadır. İlk başta " . " serverlarından  tr. TLD'si için authoritive name server IP'si bulunur. Bunun IP'si (ki bu ip'nin hostname'i ülkemiz için ns1.metu.edu.tr yada ns2.metu.edu.tr'dir) alındıktan sonra bu authoritive nameserver'a "edu.tr." i barındıran authoritive nameserver ip'si sorulacak ve bu işlem böylece devam edecektir ve sonuç olarak 193.140.1.1 adresini sizin makinanız yada /etc/resolv.conf'unuzda bulunan resolver'ınız yildiz.edu.tr'in authoritive nameserver'ından aldığı bilgilere göre cache'inde belli bir müddet tutacaktır. Bu süreye TTL (time to live) süresi denir. Bu süre boyunca resolver gerekli bilgileri hafızasında cacheleyecektir. DjbDNS için aksi belirtilmezse bu süre 42 dakikadır. Implemente edilecek sisteme göre bu sure 5 saniyede yapılabilir. (Nitekim birden fazla www serverımız var ve bunlar arasında round-robin kullanarak load balancing yapmak istersek bu  saniye değeri kullanılacaktır).




Önceden Kurulması Gerekli Yazılımlar
DjbDNS'i kullanmak için önceden kurulması gereken birkaç yazılım vardır. Bunlar yine D.J. Bernstein tarafından yazılmışlardır. Bunlar kullanılması istenen sisteme göre değişir. Genel olarak sistem eğer sadece master server olacaksa daemontools kurulması yeterli olacaktır. Daemontools sisteminizde çalışan daemonları yada servisleri gözetleyen bir yazılımdır. Fakat sadece gözetlemekle kalmaz eğer konfigurasyon dizininde bulunan daemaon çalışmıyor ise bunları tekrar başlatır. Bu yazılım ile benzer vazifeleri yapan birkaç yazılım daha vardır. Mesela "mon" örnek verilebilir.

Kurulumu:
$ wget daemontools-0.70.tar.gz
$ tar zxvf daemontools-0.70.tar.gz
$ cd daemontools-0.70
# make setup check
# mkdir /service
#svscan /service &

Bundan sonra asıl yazılımımız olan djbdns sisteme kurulur.
$ wget djbdns-1.05.tar.gz
$ tar zxvf djbdns-1.05.tar.gz
$ cd djbdns-1.05
# make setup check

Eğer kurulacak olan sistemde ikinci bir slave server olacaksa zone transferi gerekecektir. Bunun için gerekli olan yazılımlar. Ucspi (tcpserver ) ve axfrdns olacaktır. Bu yazılımlarda üstte anlatıldığı şekilde kurulabilir.

Dnscache Programının Kurulması
Dnscache yukarıda anlatılan yazılımlardan resolver kısmına girmektedir. Yani /etc/resolv.conf'a yazılacak IP şimdi kuracağımız yazılımın koştuğu bir bir server'a ait olmalıdır. Burada kuracağımız dnscache aslında dnscache'in kurulması olası iki çeşidinden birisi olacaktır. Bunlar "external dnscache" ve "internal dnscache" olarak adlandırılır. Biz burada internette yada ağımızda bulunan başka bir bilgisayarın querylerini işleyecek yetisine sahip olan external dnscache kuracağız. Eğer evinizden dial-up bağlanan bir kullanıcı iseniz sisteminizde internal bir dnscache kuracabilir ve /etc/resolv.conf'a 127.0.0.1 ip'sini yazabilirsiniz. İnternal denmesinin sebebi 127.0.0.1 interface'ine kurulması ve dnscache'in kendini o ip'nin 53. portuna bind etmesidir. Externalda ise fark sadece dnscache'in 127.0.0.1 den farklı ve diğer bilgisayarların ulaşabileceği bir IP olmasıdır.

Ek olarak dnscache kurulmadan önce hangi user olarak koşacağı ve hangi user olarak logların tutulacağı belirtilmelidir. Genel olarak sisteminize login olması ihtimali olmayan (shelli /non-existant olan) iki kullanıcı ekleyin. Bunlardan biri "dnscache" diğeride logları tutacak account olan "dnslog" olabilir. Birde programımızın koşacağı dizinde belirlenmelidir. Genel olarak   /etc/dnscachex (x = external) kullanılmaktadır. Şimdi yazılımı kurabiliriz.


External dnscache:


#dnscache-conf dnscache dnslog /etc/dnscachex 192.168.1.1             { dnscache-conf user loguser dizin ip}
#ln -s /etc/dnscachex /service                {bu işlem ile daemontools yazılımımızı  saniye içinde başlatacaktır}
# echo "192.168.1.1" > /etc/resolv.conf

Internal dnscache:


#dnscache-conf dnscache dnslog /etc/dnscache        {Dikkat ederseniz IP belirtmedik.Default 127.0.0.1'dir }
#ln -s /etc/dnscache /service
#echo "127.0.0.1" > /etc/resolv.conf
# touch /etc/dnscachex/root/ip/193.140.1              {***Default olarak dnscache bütün queryleri deny eder.Bu 193.140.1 dosyası ile ağ içine dnsquery yapması için izin verelim.}

Cache'imizin çalışıp çalışmadığını sorgulamak için "dnsqr " komutu kullanılabilir. Yapılan querylerde önemli olan satır  "answer"  satırıdır.
 

# dnsqr a yildiz.edu.tr
1 yildiz.edu.tr:
166 bytes, 1+1+3+3 records, response, noerror
query: 1 yildiz.edu.tr
answer: yildiz.edu.tr 30218 A 193.140.1.1      {answer ile başlayan kısım bizim aradığımız cevaptır.}
authority: yildiz.edu.tr 86391 NS ana.cc.yildiz.edu.tr
authority: yildiz.edu.tr 86391 NS ns.ulak.net.tr
authority: yildiz.edu.tr 86391 NS vm4381.ce.yildiz.edu.tr
additional: ana.cc.yildiz.edu.tr 86391 A 193.140.1.1
additional: ns.ulak.net.tr 62760 A 193.140.83.251
additional: vm4381.ce.yildiz.edu.tr 86391 A 193.140.2.1



    

Artık elimizde çalışan bir resolver var. Ek olarak istersek CACHE büyüklüğünü 100mb ram harcayacak şekilde ayarlayabiliriz. Bunun için:
#echo 100000000 > /etc/dnscachex/env/CACHESIZE
#echo 104857600 > /etc/dnscachex/env/DATALIMIT yapılması gerekir. Tabi bundan sonra "svc -t /service/dnscache "  ile programımızı yeniden başlatmak gerekecektir.

Şimdi sıra domanimiz için authoritive nameserver olacak olan  " tiny-dns " programını kurmaya geldi.

Tiny-dns Kurulumu
Tiny-dns yukarıda da anlatıldığı üzere bizim domanimiz için authoritive nameserverimiz olacak. (aynı zamanda authoritive reverse name servermiz olacak ipv4-->hostname.. )
Önce sistemimize tiny-dns user'ını(tinydns) ekleyelim ayrıca sistem logları için dnslog da eğer daha önce dnscache kurulmadıysa eklenmelidir.
ÖNEMLI NOT : Dikkat edilmesi gereken bir nokta olarak dnscache ile tinydns aynı ip'yi dinleyemez. Bu yüzden tiny-dns'i 192.168.1.2'nin 53. portuna bind edeceğiz.(IP-ALIASING artık bütün *NIX'lerde vardır). Eğer elinizde sadece bir real ip varsa bu gerçek ip'yi tiny-dns için kullanın ve 192.168.1.1 ip'sinide dnscache için kullanın.

Tiny-dns:
#tinydns-conf tinydns dnslog /etc/tinydns 192.168.1.2              {yada gerçek bir IP }
#ln -s /etc/tinydns /service                                                      { 5 saniye sonra daemon up olacak }

Sıra tinydns'e hostname ve reverse kayıtlarının girilmesine girilimesinde. Bu aşamada iki seçeneğiniz var.Ya "data" dosyasını manuel olarak düzenleyeceksiniz ya da /etc/tinydns/root dizini altında bulunan add* scriptlerini kullanacaksiniz. Burada bizim tavsiyemiz data dosyasına girdilerin add* scriptleri ile girilmesi yönünde olacaktir. Böylece her ne kadar data dosyasının konfigurasyonu bind'a göre son derece kolay ve anlaşılır olsada ufak hatalar yapılabilme olasılığının olmasıdır. Fakat add* scriptleri ile bu baş ağrıtıcı hataların oluşturduğu problemlerden kurtulmuş olursunuz.

Sırasıyla yildiz.edu.tr için dns kayıtlarını girelim ve authoritive name servermizi kuralım.

#cd /etc/tinydns/root
#./add-ns yildiz.edu.tr 193.140.1.1                  { *.yildiz.edu.tr için authoritive nameserver 193.140.1.1 olacak; SOA}
#./add-ns 1.140.193.in-addr-arpa 193.140.1.1  {reverse authoritive nameserver 193.140.1.1 olacak}
#./add-host ogis.yildiz.edu.tr 193.140.1.3        { Sanırım baya zor anlasılacak birsey :) }
#./add-alias www2.yildiz.edu.tr 193.140.1.3     {DAHA ÖNCEDEN TANIMLANMIŞ bir ip'ye hostname alias ekliyoruz}
#./add-mx yildiz.edu.tr 193.140.1.1                 {bir numaralı mx olarak 193.140..1.1 ekleniyor}
#./add-mx yildiz.edu.tr 193.140.1.5                 {ikinci sırada gelen yildiz.edu.tr mx serveri}
#./add-childdns ece.yildiz.edu.tr 193.140.1.15  { subdomainler için namserver }
# make                                                        {tindns-data komutu çalıştırılır }



     Bu noktada önemli birşey var. add-ns ve add-mx scriptlerini kullanırken dikkat ederseniz ns serverların hostname'ini vermedik. Bu iki script default olarak a.ns ... b.ns hostnamlerini atarlar. Eğer internic'te yada daha doğru ifadesiyle registrar'ınızda nameserver hostname'i olarak farklı bir isim olabilir. İşte bu noktada iki hostname'de aynı olmalıdır. add-ns ve add-mx yine aynı dizinde ( /etc/tinydns/root/) dizini altinda bulunan "data" dosyasını düzenler. Burada favori editörünüzle bu dosyayı açıp gerekli değişiklikleri yapmalısınız. Örnek olarak ulak.net.tr'de yildiz.edu.tr nameserverinin hostname'i ana.cc.yildiz.edu.tr olarak tanımlıdır. "data" dosyasında bu değişiklik yapılmalıdır.
  
    Sıra geldi data dosyasındaki bilgileri data.cdb olarak yani tinydns'in konfigurasyon dosyası olarak kaydetmeye. Yine ayni dizinde dikkat ederseniz bir Makefile vardir. Yapılması gereken tekşey bu dizinde "make" komutunu çalıştırmaktır. Make komutunun yazılması ile birlikte tiny-dns hizmet vermeye hazir olacaktır. Make komutu Makefile dosyasındanda anlaşılacağı üzere "tinydns-data" programını kullanarak data.cdb'yi oluşturur. Kısacası tinydns-data data dosyasını okur ve tinydnsin hızlı bir şekilde ulaşabileceği data.cdb dosyasını yaratır. Ayrıca tinydns-data otamatik olarak data.cdb'yi günceller. Böylece data dosyasında yapılan bir değişiklik tinydns'i bir daha başlatmadan direk data.cdb dosyasını günceller. Eğer bu data.cdb update edilirken sistem çökse bile sistem yeniden başladığında sistem data.cdb dosyasında bir problem yaşamaz. Tam bir all-or-nothing mantığıyla yada transaction mantığı ile çalışır.

    Aşağıda data file'ın içeriği verilmiştir. Bu dosyayı üstte add-* scriptleri ile yapabileceğiniz gibi manuel olarakta yapabilirsiniz.
 

.yildiz.edu.tr:193.140.1.1:a:259200                  {yildiz.edu.tr için  authoritive nameserver notka ile başlıyor.}
.1.140.193.in-addr.arpa:193.140.1.1:a:259200
=www.yildiz.edu.tr:193.140.1.1:86400             {www.yildiz.edu.tr için host kaydı}
.1.140.193.in-addr.arpa:193.140.1.1:a:259200  {*.1.140.193 için authoritive nameserver }
=ogis.yildiz.edu.tr:193.140.1.3:86400              {ogis.yildiz.edu.tr için host kaydı }
+www2.yildiz.edu.tr:193.140.1.3:86400           { Bir alias kaydı.Alias kayıtları + ile başlar}
@yildiz.edu.tr:193.140.1.3:a::86400                { yildiz.edu.tr için mx kaydı.Prioritysi harflerle ifade ediliyor. }
@yildiz.edu.tr:193.140.1.5:b::86400                { yildiz.edu.tr için ikinci mx kaydı. @ ile başlıyor. }
&ece.yildiz.edu.tr:193.140.1.15:86400             {ece.yildiz.edu.tr için gelen queryleri 193.140.1.15 ip'sine yönlendir} 

 

   Bu arada istenirse daemontools ile gelen svstat ile tinydns çalışıyormu çalışmıyormu kontrol edilebilir.
#svstat /service/tinydns.
   Yada log filelara bakabiliriz.
#tail -f /service/tinydns/log/current ile gerçek zamanlı olarak işlemler gözlenebilir.

Birde tinydns'in datasını kontrol edelim. Bunun için dnscache'i için kullandığımız komuta benzer bir komut olan "dnsq" komutunu kullanacağız.

#dnsq a yildiz.edu.tr 193.140.1.1
1 yildiz.edu.tr:
127 bytes, 1+1+2+2 records, response, authoritative, weird ra, noerror
query: 1 yildiz.edu.tr
answer: yildiz.edu.tr 86400 A 193.140.1.1               {Önemli olan kısım burası }
authority: yildiz.edu.tr 86400 NS smurf.cc.yildiz.edu.tr
authority: yildiz.edu.tr 86400 NS bigblue.ce.yildiz.edu.tr
additional: smurf.cc.yildiz.edu.tr 86400 A 193.140.1.1
additional: bigblue.ce.yildiz.edu.tr 86400 A 193.140.2.1


NOT: Tinydns'i sorgulamak için dnsq dnscache'i sorgulamak için dnsqr kullanılır.

 

/service/tinydns/root/data dosyası formatı:
  Yukarıda da belirtildiği gibi "data" dosyasından tinydns'in okuyabileceği formata (data.cdb) dönüştürülür.Peki "data" dosyasının formatı ne şekildedir:

.fqdn:ip:x:ttl:timestamp:lo

Teker teker yukarıdaki ifadenin ne anlamalara geldiğini açıklayayım.
1) .fqdn kısmı sizin entry'nizi simgeler. Bu entry authoritive bir nameserver'in başlangıçı (SOA = Start Of Authority) si olabilir. Nitekim data dosyasinda "." ile başlayanlar SOA kaydini belirtir. Üstteki örneğimize bakarsak en üst iki satir "." ile başlamaktadir. Bunlar SOA'ları oluşturur. "." dan başka karakterler vardır:

      a) . ile başlayanlar SOA'yı belirtir.Mutlaka olmalıdır.
       b
) @ ile başlayan satır bunun bir mx entry'si olduğunu gösterir.
      c) = ifadesi A record'lar için kullanilir. Ayni zamanda tinydns-data reverse record kayitlarindan olan PTR entry'sini   girer.
      d) + ifadesi add-alias script'i ile oluşturulur. Yine bu işaret tinydns-data'ya A record yaratmasını soyler fakat PTR kaydi girilmez. Eğer aynı IP için iki tane = kullanırsanız hata alırsınız ( data dosyasini elle değiştirerek yada add-host ile ).
      e) & simgesi ile başlayan satırlar child-dns girmek icindir. Mesela elek.yildiz.edu.tr 'nin kendi dns server'ının olmasını istiyorsunuz. Bunun için add-childdns komutunu kullanırız.


2) ip kısımı girdisi yapılacak fqdn'nin resolve edilecegi ip'yi belirler.Mesela:
&ece.yildiz.edu.tr:193.140.1.15:86400  ifadesindeki ikinci sekmen  ip dir ve kendisinden önce gelen ifadenin   (&ece.yildiz.edu.tr)  ip'sini belirler.

3) x kısmı mx ve ns kayıtlarında işe yaramaktadır. Bu önceliği belirlemek için kullanılır ve query'lere  buna göre verilir. Şöyleki eğer buraya "a" yada "b" girerseniz dnsq ile size dönecek cevap eğer ns kaydi sözkonusu ise a.ns.yildiz.edu.tr olur.Eğer girilen değer b ise bu ikincil nameserver'ı (authoritive)  gösterir ve b.ns.yildiz.edu.tr olarak gösterilir. Yine mx kayıtları içinde a.mx.yildiz.edu.tr ve b.mx.yildiz.edu.tr kullanılır. Eğer bu tarz gösterim yapmak istemiyorsanız. Bu kısma direk "dns1.yildiz.edu.tr" yada "dns2.yildiz.edu.tr" girebilirsiniz. Ya da aynı şekilde "mx1.yildiz.edu.tr" ve de  "mx2.yildiz.edu.tr".

**Aklınıza şu soru gelebilir. Eğer bu kısma ben kendi hostname'lerimi girersem öncelik sırası ne olacak. Burada first-come-first-served ilkesi esas alinir. Yani dosyada hangisi üstte ise o öncelliğe sahiptir.

4)ttl kısmı ise kurduğumuz authoritive nameserver'ı sorgulayan cache'lerin cache'lerinde bu entry'i kaç saniye(**) tutacağını belirler. ns  ve mx server lar için burada default deger 3 gün (259200 saniye) iken diğer entry'ler için 1 gündür (86400 saniye).

5)timestamp Adındanda anlaşılacağı üzere dosyanın ne zaman değiştirildiğini gösterir. " add-* " scriptleri bu kısma dokunmazlar.

6) lo Bu kısım aşağıda da anlatıldığı üzere "Değişik istemcileri değişik cluster'lara nasıl yönlendirebilirim? " sorusunun cevabı olmaktadır.

EK: 3 kısımda anlatılanları somutlaştırmak için  örnek bir data dosyasından alıntı yapayım:

.yildiz.edu.tr:193.140.1.1:dns1.yildiz.edu.tr:259200    

Böyle bir entry'de tinydns-data komutu iki şey yapar. Ilk başta dns1.yildiz.edu.tr için 193.140.1.1 'i gösteren A record yaratılır. Daha sonra  bunun SOA olduğunu belirtilen kısım data.cdb'ye yazılır

@yildiz.edu.tr:193.140.1.3:mx1.yildiz.edu.tr::86400 

Bu örnekte ise ilk başta A record sonrada mx kaydi yaratılır.


 

 

Zone Transferi:
Zone Transferi Nedir?

Master yada primary dns serverınızda yaptığınız değişiklikleri secondary yada slave serverlara kopyalamanız gerekmektedir. Aslında bunun için bir çok değişik araçlar mevcuttur. Bunun için default shelli ssh olan rsync bile kullanılabilir. Böylece dosyanının tamamının kopyalanması yerine artan dosyaların sondaki ekleri kopyalanabilir. Yada isterseniz direk data.cdb dosyasını manuel kopyalayabilirsiniz.

Fakat bu iş için en aklı başında çözüm axfrdns kullanılabilir. Bunun için öncellikle:

1)DNS server account name'i: "axfrdns". Diğer bütün djbdns programlarında olduğu gibi program kendini bu account name adı altında belirtilen dizine chroot eder. İşte bu djbdns programını güvenli kılan en önemli etkenlerden biridir
2)DNS log accountu: dnslog.
3)axfrdns'in çalışacağı dizin /etc/axfrdns
4)tinydns dizini: /etc/tinydns

Sonra sırasıyla:

#axfrdns-conf axfrdns dnslog /etc/axfrdns /etc/tinydns 193.140.1.1                                 {Bu ip tinydns ip'si ile aynı olabilir.Çünkü axfrdns zone transferi için 512 bytetan büyük dosyları transfer eder bu yüzden tcp kullanılır fakat tinydns udp kullanır.}

#cd /etc/axfrdns
#echo "193.140.1.:allow,AXFR="yildiz.edu.tr/1.140.193.in-addr.arpa" > /etc/axfrdns/tcp     {193.140.1'deki makinalara reverse ve normal zone'larının transferine izin ver }
#make
#ln -s /etc/axfrnds /service                                                                                         {axfrdns'i çalıştıralım}

 

 

 

axfr-get {zone xfer istemcisi }
Eğer master olarak bir BIND server kullanacaksanız ve slave (ya da secondary) name server olarak axfr-get programını kullanmalısınız. Ya da diğer bir master tinydns serverdan zone transferinde bulunmak için kullanılabilir. Eğer iki serverda (master ve slave) tinydns ise scp yada rsync ile direk ana servardan data.cdb'yi slave server'ın /etc/tinydns/root/ dizinine kopyalayabilirsiniz. Eğer rsync hususunda bir bilgi almak isterseniz http://www.freebsddiary.org/ adresini size tavsiye edebilirim.

 

Axfrdns-get kısaca şöyle çalışır:
#tcpclient authoritive_name_server_ipsi 53 axfr-get yildiz.edu.tr fn fn.tmp

Burada eğer axfr-get ana çeşitli queryleri yaparak domain için primary serverı bulacak ve eğer ana serverda zone transferi için axfr-get komutunun çalıştığı servera izin verilmişse ana serverdan (master) çektiği yildiz.edu.tr hakkındaki bilgileri fn.tmp olarak yazacaktır. Eğer zone transfer işlemi başarı ile tamamlanırsa dosya adı otamatik olarak fn olarak değiştirilecektir.Bu fn dosyası da   tinydns-data formatında olacaktır. Yani daha önce gördüğümüz data dosyası ile aynı formatta olacaktır.
Genel olarak axfr-get programının getirdiği dosyalarda aynı kayıda ait birden fazla girdi olacaktır. Dosyayı "sort -u" komutu ile dosyayı filtreleyebilirsiniz.

 

NOT: axfr-get için daha önceden tcpclient programını kurmuş olmanız gerekmektedir. Zaten sisteminiz tcpserver  kurulu ise tcpclient otamatik gelecektir.

DjbDns komutları
Şu an kadar anlatılanlar neyin nasıl yapılacağı hususunda genel bir bilgi vermek içindi. Bu bölümde anlatılacak olanlar djbdns ile gelen programların (hepsinin) teker teker kısaca bir açıklaması olacak. DjbDns ile gelen bir çok komut var. Bunların aklınızda biraz daha kolay yer etmesi ve bu dökumanın bir referans kabul alınması için bu tarz bir uygulama yapıyorum.

 

dnscache : Kısaca resolver olarak kullanılmaktadır.Çözülen her istekleri aynı zamanda cacheleyerek cevap verme süresinin azalmasını sağlar.Ağ ortamından gelen isteklere cevap verecek şekilde ayarlanabileceği gibi local resolver olarakta kullanılabilir.

tinydns :  Authoritive bir nameserver'dır.UDP altında çalışır.Örnek vermek gerekirse yildiz.edu.tr domaini için gelebilecek tüm querylere cevap verecek şekilde ayarlanabilir.512 byte ve üzeri isteklere cevap vermez.Bunun sebebi sadece udp altında çalışması ve dns implementationun bu şekilde olmasıdır.

walldns : WallDNS reverse bir dns walldır.Yani sisteminiz gerisindeki real ip'ye sahip hostların isimlerini saklamakta kullanılabilir.Firewall mantığı ile örtüşür.Bazı ftp serverlar kendine gelen requestleri kabul etmek için mutlaka reverse kaydının o host için tanımlı olmasını isterler.Bu durumlar için walldns kullanılabilir.

dnsq     :  tinydns gibi authoritive namserverları sorgulamak için kullanılır.
#dnsq type FQDN server
#dnsq MX yildiz.edu.tr 193.140.1.1
193.140.1.1 serverına yildiz.edu.tr için kayıtlı mx kayıdını sorar.

dnsqr   : Bu komut dnsq'ya benzer fakat authoritive nameserver sorgulaması yerine dnscache gibi cacheleri sorgulamaya yarar.
#dnqr ns http://www.yildiz.edu.tr/
Cache'e yildiz.edu.tr nin ns kaydını sorar.

dnsfilter : Bu komut dnsname gibidir fakat aynı anda çoklu query yapabilir.dnsname sadece bulduğu ilk entry'i listeler.
#dnsfilter
193.140.1.1                                     {Bizim girdimiz }
193.140.1.1=smurf.cc.yildiz.edu.tr
193.140.1.3                                      {Bizim girdimiz }
193.140.1.3=ogis.cc.yildiz.edu.tr


axfrdns : Zone transferi için kullanılır.Çeşitli  slave nameserverlar için zone transfer server olarak vazife yapar.Tinydns'in çalıştığı IP'de çalışabilir.TCP kullanır.

dnstrace : Belirtilen root nameserver'dan başlayarak ( r ) bir domain altinda ( fqdn )  istenenen tipte ( t ) queryleri bulur ve ilişki kurduğu bütün serverları stdout'a yazar.Fakat karmaşık bir formatta.
1) #dnstrace t fqdn r
2)
#dnstrace any www.yildiz.edu.tr  a.root-servers.net > yildiz &

dnstracesort : dnstrace komutunun ciktisini okuyabilieceğimiz şekilde listeler
# dnstracesort < yildiz | less

**Yada direk: dnstrace any www.yildiz.edu.tr  a.root-servers.net | dnstracesort | less

axfr-get : Slave servlarda kullanılmak üzere tasarlanmıştır.Master serverdan zone transferinde kullanılmak için kullanılır.



Ayrıca birkaç scripting amaçlı komutlar(dnsmx,dnsip,dnsname)

 

Yardımcı Bilgiler
Bu bölümde  sahsımın ilgisini çeken birkaç noktayı anlatacağım:

1) Aynı data'yı içeren 5 web server için Load Balancing nasıl yaparım?


Aslında dns tabanlı load-balancing'e tam manasıyla sıcak bakmasamda djbdns ile load balancing yapılabiliyor. Eğer Linux altında gerçek bir Load Balancing ya da High Availability arıyorsanız http://www.linux-vs.org/ yada http://www.linux-ha.org/ adresine bakın derim. Neyse biz konumuza dönelim.Amacımıza ulaşmak için TTL ile oynayacağız.Her bir www serverimizin entrysi için 5 saniye bir TTL tanımlayacağız. Böylece karşı tarafta cachelenen querylerinin yaşam süresi 5 saniye olacak. Gelen her bir request için djbdns'te round-robin yaparak bu 5 server arasında tercihini yaparak karşı taraftaki resolvera bildirecektir.  /etc/tinydns/root/data dosyasına

+www.yildiz.edu.tr:193.140.1.1:5
+www.yildiz.edu.tr:193.140.1.2:5
+www.yildiz.edu.tr:193.140.1.1:5
......
yazılır. /etc/tinydns/root/ dizininde "make" komutu çalıştırarak tinydns-data komutunun data dosyasındaki bilgileri data.cdb gibi cdb formatında saklaması sağlanır.



2)Değişik istemcileri değişik cluster'lara nasıl yönlendirebilirim?


Diyelimki üniversiteniz yada şirketiniz içinden gelen querylere yani intranet'inizden gelen querylere http://www.yildiz.edu.tr/ için 193.140.1.1 internetten gelen http://www.yildiz.edu.tr/ queryleri için 192.193.140.1.2...5 arası cevapların verilmesini istiyorsunuz. Bunun için /etc/tinydns/root/data dosyasına farklı iki location tanımlarız. IN ve EX gibi 1 yada 2 byte uzunluğunda (maximum  2 byte uzunluğunda) tanımlamalar yaparız. Şöyleki:

%IN:193.140.1
%EX
+www.yildiz.edu.tr:193.140.1.1:5::IN
+www.yildiz.edu.tr:193.140.1.2:5::EX
+www.yildiz.edu.tr:193.140.1.3:5::EX
...

3)Diğer bir problem ise aynı ağda bulunun bir dnscache'in o ağ için tanımlı authoritive nameserveri nasıl bulacağıdır. Normalde aşağıdaki bir düzenleme yapılmazsa local olarak bulunabilecek bir cevap için bütün interneti gezmesi gerekecektir. Bu durumu önlemek için:

#cd /etc/dnscachex/root/servers
#echo "193.140.1.1" > yildiz.edu.tr
# echo "193.140.1.1" > 1.140.193.in-addr.arpa

ile bu sorunu çözebilirsiniz.

 

4)Bu kısım çok önemli (!!!). Diyelimki djbdns'i kurdunuz ve herşeyin tam olarak çalışıp çalışmadığından emin olmak için sisteminizi yeniden başlattınız. Fakat o ne.Djbdns çalışmadı ve şu şekil bir hata veriyor :

svscan: warning: unable to start supervise dnscache: file does not exist

Burada bulunamayan ve svscanin dnscache'i çalışmamasını sağlayan /usr/local/bin altındaki daemontools komutlarının bulunmaması. Buradaki çözüm: /usr/local/etc/rc.d/djbdns.sh gibi bir dosya yaratıp, chmod 755 djbdns.sh ile çalıştırılabilir hale getirip şu satırları djbdns.sh'a eklemektir.

 

---------------burdan başlıyor------------
#!/bin/sh
export PATH="$PATH:/usr/local/bin"
svscan /service &
------------
burada bitiyor--------------



Kaynaklar:
DJBDNS SOURCE:
http://cr.yp.to/

DJBDNS HOMEPAGE:
http://www.djbdns.org/
http://djbdns.enderunix.org/ (Official Olarak djbdns.org'un mirrorunu tutmaktayız.)

Ayrıca bu sayfalarda djbdns için yapılmış birkac patch bulabilirsiniz. Örnek olarak bir cache'in dnscache ile birden çok ip'ye bind edilmesi verilebilir.

DJBDNS FAQ:
http://cr.yp.to/djbdns/faq/

DjbDNS ve BIND Implemantation Comparison:
http://cr.yp.to/djbdns/ad/easeofuse.html

Bu dokümana official djb sitesi vasıtasıylada ulaşabilirsiniz
http://www.djbdns.org

DjbDNS'in tinydns paketini webten yönetmek için python ile yazılmış bir araç:
http://www.linuxis.net/twa

Gerrit Pape'in yazdığı djbdns manuel sayfaları: (Djbdns ile manual page gelmemektedir)
ftp://ftp.innominate.org/gpa/djb/

dnscache için round-robin yamasi:  (Bu patch dnscache içindir.tinydns icin round-robin desteği paketle gelmektedir)
http://www.legend.co.uk/djb/dns/round-robin.patch