|
||
| 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. 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 boyle 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. |
||
|
||
| Bu dokumanin en guncel hali; http://www.enderunix.org/documents/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 yuzden 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 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 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: |
||
| Ö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.Internal 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.Simdi 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 olarak 127.0.0.1kullanılır} #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 Ş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 yuzden 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: Sıra tinydnse 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 anlası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 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.}
Bu arada istenirse daemontools ile gelen svstat ile tinydns
çalışıyormu çalışmıyormu kontrol edilebilir. #dnsq a yildiz.edu.tr 193.140.1.1 |
||
| Zone Transferleri | ||
| 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
|
||
| axfrdns-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: Burada eğer axfrdns-get ana çeşitli queryleri yaparak domain için primary serverı
bulacak ve eğer ana serverda zone transferi için axfrdns-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. NOT: axfrdns-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
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. dnsq : tinydns gibi authoritive
namserverları sorgulamak için kullanılır. dnstrace : Tıpkı traceroute komutu gibidir.Debugging amaçlı
kullanılabilir. |
||
| 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? 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 ile
bu sorunu çözebilirsiniz. |
||
| Kaynaklar: | ||
| DJBDNS SOURCE: http://cr.yp.to/djbdns.html DJBDNS HOMEPAGE:
|