|

|
|
|
|
|
|
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. |
|
|
| 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
|