Apache ve DNS ile ilgili Konular
Bu sayfanın konusu şöyle özetlenebilirdi: Yapılandırma dosyalarınızda
DNS sorguları yapılmasını gerektirecek ayarlamalardan kaçınınız. Eğer
yapılandırma dosyalarınızda DNS sorgusu yapılarak çözümlenebilecek
adresler bulunursa sunucunuz beklenmedik davranışlar (hiç
başlamayabilir) gösterebileceği gibi hizmet reddi veya hizmet
hırsızlığı (bazı kullanıcıların diğerlerine giden sayfaları çalma
olasılığı dahil) saldırılarına açık hale gelebilir.
Basit Bir Örnek
# Bu yetersiz bir yapılandırma örneğidir, sunucunuzda kullanmayın.
<VirtualHost falan.fesmekan.dom>
ServerAdmin filanca@fesmekan.dom
DocumentRoot /siteler/fesmekan
</VirtualHost>
Apache’nin beklendiği gibi işlemesi için her sanal konak için iki
veriye mutlaka ihtiyacı vardır: ServerName ve sunucunun bağlantı kabul edip hizmet
sunacağı en az bir IP adresi. Yukarıdaki örnekte IP adresi
bulunmamaktadır, dolayısıyla Apache, falan.fesmekan.dom
adresi için bir DNS sorgusu yapmak zorundadır. Eğer sunucu,
yapılandırma dosyasını çözümlediği sırada bir sebeple DNS sunucusuna
erişemezse bu sanal konak yapılandırılmayacak (hApache 1.2
öncesinde sunucu hiç başlatılmazdı) ve bu sanal konağa yapılan
isteklere yanıt verilemeyecektir.
falan.fesmekan.dom
’un 192.168.2.1 IP adresine sahip
olduğunu varsayarsak yapılandırma şöyle olurdu:
# Bu yetersiz bir yapılandırma örneğidir, sunucunuzda kullanmayın.
<VirtualHost 192.168.2.1>
ServerAdmin filanca@fesmekan.dom
DocumentRoot /siteler/fesmekan
</VirtualHost>
Ancak, bu sefer de bu sanal konağın sunucu ismini öğrenmek için
Apache’nin bir ters DNS sorgusu yapması gerekecektir. Eğer bu sorgu
başarısız olursa kısmi bir yapılandırmaya gidilir (Apache 1.2 öncesinde
sunucu hiç başlatılmazdı). Eğer sanal konak isme dayalı ise sanal konak
kısmen bile yapılandırılmaz. IP’ye dayalı sanal konaklar büyük oranda
çalışır, fakat sunucu ismini içeren tam bir adres üretilmesini
gerektiren bir durumda, sunucu geçerli bir adres üretemez.
Her iki sorunu da çözen yapılandırma şöyle olurdu:
<VirtualHost 192.168.2.1>
ServerName falan.fesmekan.dom
ServerAdmin filanca@fesmekan.dom
DocumentRoot /siteler/fesmekan
</VirtualHost>
Hizmet Reddi
Hizmet reddinin meydana gelebilecek (en az) iki türü vardır.
Apache’nin 1.2 öncesi bir sürümünü kullanıyorsanız sanal
konaklarınızdan herhangi biri için yukarıdaki iki sorgudan biri
başarısız olursa sunucunuzu asla başlatamazsınız. Bazı durumlarda, DNS
sorgularından alınacak yanıtlar sizin denetiminizde olmayabilir;
örneğin fesmekan.dom
müşterilerinizden birine aitse ve
kendi DNS sunucuları varsa falan.fesmekan.dom
kaydını
silerek sunucunuzun hiç başlatılamamasına (1.2 öncesi) sebep
olabilirler.
Diğer türü biraz daha sinsidir. Şöyle bir yapılandırmanız olsun:
<VirtualHost falan.fesmekan.dom>
ServerAdmin filanca@fesmekan.dom
DocumentRoot /siteler/fesmekan
</VirtualHost>
<VirtualHost misal.mesela.dom>
ServerAdmin falanca@mesela.dom
DocumentRoot /siteler/mesela
</VirtualHost>
falan.fesmekan.dom
’a 192.168.2.1,
misal.mesela.dom
’a 192.168.2.2 atadığınızı fakat,
mesela.dom
’un DNS kaydının sizin denetiminizde olmadığını
varsayalım. Bu yapılandırmayla, mesela.dom
’u
fesmekan.dom
’a giden tüm trafiği çalabilecek duruma
getirirsiniz. Bunu gerçekleştirmek için DNS kaydında
misal.mesela.dom
’a 192.168.2.1 adresinin atanması
yeterlidir. Kendi DNS’lerine sahip olduklarından dolayı
misal.mesela.dom
’a istedikleri IP adresini atamaktan
onları alıkoyamazsınız.
192.168.2.1’e gelen isteklerin hepsine
(http://falan.fesmekan.dom/biryer
şeklinde yazılan
adresler dahil) mesela.dom
sanal konağınca hizmet
sunulacaktır. Apache’nin gelen istekleri sunduğu sanal konaklarla nasıl
eşleştirdiğini bilirseniz bunun sebebini kolayca anlarsınız. Bunu
kabataslak açıklayan bir belgemiz
mevcuttur.
"Ana Sunucu" Adresi
Apache 1.1’de isme dayalı sanal konak
desteğine ek olarak, Apache’nin, httpd’nin
çalıştığı makinenin IP adres(ler)ini de bilmeye ihtiyacı vardır. Bu
adresi elde etmek için sunucu, ya sunucu genelinde geçerli ServerName yönergesine bakar ya da bir C
işlevi olan gethostname
’i kullanır (işlev, komut
isteminden hostname
komutuna dönen yanıtın aynısını
döndürür) ve ardından bu adresle ilgili olarak bir DNS sorgusu yapar.
Bu sorgudan kaçınmanın henüz bir yolu yoktur.
Eğer bu sorgunun (DNS sunucusunun çökmüş olması gibi bir nedenle)
başarısız olabileceğinden korkuyorsanız, makine ismini ve IP adresini
/etc/hosts
dosyanıza yazabilirsiniz (Makinenizin düzgün
olarak açılabilmesi için zaten bu kaydı yapmış olmanız gerekir).
Kullandığınız işletim sistemine bağlı olarak bu kaydın
/etc/resolv.conf
veya /etc/nsswitch.conf
dosyasında bulunması gerekebilir.
Herhangi bir nedenle sunucunuz bir DNS sorgusu yapmıyorsa veya
yapmamalıysa, Apache’yi HOSTRESORDER
ortam değişkenine
"local
" değerini atadıktan sonra çalıştırabilirsiniz. Bu
tamamen işletim sistemine ve kullandığınız çözümleyici kütüphanelere
bağlıdır. Ayrıca, ortamı denetlemek için mod_env
kullanmıyorsanız, CGI’ler de bundan etkilenir. En iyisi işletim
sisteminizin SSS belgelerini ve kılavuz sayfalarını okumaktır.
Bu Sorunlardan Kaçınmak için İpuçları
- VirtualHost yönergelerinizde
IP adresleri kullanınız.
- Listen yönergelerinizde
IP adresleri kullanınız.
- Tüm sanal konakların ayrı birer ServerName yönergesi olsun.
- Hiçbir sayfa sunulmayan bir
<VirtualHost
_default_:*>
sanal konağınız olsun.
Ek: Ufuk Turu
DNS ile ilgili durum hiç de arzu edildiği gibi değildir. Apache 1.2
için, DNS sorguları başarısız olsa bile sunucunun başlatılabilmesini
sağlamaya çalıştık, fakat belki yapabildiğimizden daha da iyisi
mümkündür. Günümüz Genel Ağ’ında IP adresleri sık sık değiştiğinden
yapılandırma dosyasına doğrudan IP adresini yazma gerekliliği asla arzu
edilen davranış değildir.
Yukarıda nasıl yapıldığı açıklanan hizmet hırsızlığı saldırısına karşı
önlem olarak, normal sorgudan dönen IP adresine bir ters DNS sorgusu
yapıp bu iki sonucu karşılaştırmak ve eşleşmeme durumunda sanal konağı
iptal etmek bir çözüm olabilir. Fakat bunun mümkün olabilmesi için
uygun bir ters DNS kaydına ihtiyaç vardır. (FTP sunucuları ve TCP
sarmalayıcılar tarafından yapılan çifte ters DNS sorgusu kullanımından
dolayı çoğu ağ yöneticisi bu konuda zaten bilgi sahibidir.)
Her halükarda, IP adreslerinin kullanılmaması nedeniyle yapılan DNS
sorgularının başarısız olması durumunda sanal konaklı bir sunucuyu
düzgün bir şekilde başlatmak olası görünmektedir. Yapılandırmayı kısmen
iptal etmek gibi kısmi çözümler, sunucudan beklentinizin ne olduğuna
bağlı olarak sunucuyu hiç başlatmamaktan daha iyi olabilir.
HTTP/1.1’de belirtildiği gibi Host
başlığını göndererek
işlem yapabilen tarayıcılar ve vekiller IP’ye dayalı sanal konak
kullanımını tamamen ortadan kaldırmanın mümkün olabileceğini
göstermektedir. Bu durumda yapılandırmanın çözümlenmesi aşamasında DNS
sorgusu yapma gereği kalmayacaktır. Fakat 1997 Mart’ından beri önemli
sunucular üzerinde bunların yeterince geniş bir uygulama alanı
bulmadığı görülmektedir.