# Apache HTTP Sunucusu 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ı sanal konakları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>

httpd’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 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 httpd’nin bir ters DNS sorgusu yapması gerekecektir. Eğer bu sorgu başarısız olursa kısmi bir yapılandırmaya gidilir. 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 (örneğin, bir Redirect varlığında olduğu gibi) 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

Şö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

İsme dayalı sanal konak desteği, httpd’nin çalıştığı makinenin IP adres(ler)ini de bilmesini gerektirir. 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, httpd’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.