İstemci IP adresleri

Bugün pek çok web uygulaması birden fazla sunucu üzerinde hizmet vermektedir. Bu sunucular arasında yük dağılımı ise çeşitli şekillerde yapılabilmektedir:

  • DNS round-robin
  • Windows Network load balance servisi
  • Yük dağıtım cihazları (hardware load balancer)
  • Applicatıon Request Routing (ARR) modülü (bununla ilgili bir yazı yazmayı planlıyorum)

Yük dağıtım cihazları ve ARR'nin ortak bir sorunu var: We sunuculara yönlendirdikleri isteklerde istemci IP adresi yerine kendi IP'lerini gönderirler. Elbette yapacağımız ayarlarla bunu kapatabiliriz. Ancak kapatırsak bu cihazların/madülün sağlayacağı pek çok hizmetten ve özellikten de mahrum kalıyoruz.

Sunucu loglarında istemci IP adreslerinin bulunması çoğu zaman zaruridir. Bun göre istatistiki veriler çıkarabileceğimiz gibi, geçmişe dönük güvenlik taramaları da yapabiliriz. Veya belirli bir kullanıcının yaşadığı sorunların nedenini araştırırken de bu bilgiye ihtiyacımız olacaktır. Yük dağıtım cihazları da, yukarıdaki soruna çözüm için, istemci IP adresini sunucuya bir "header" ile gönderebilmektedirler. Hatta genel kabul görmüş "header" adı olarak da "X-Forwarded-For" kullanılır.

Burada bir sonraki sorun, "X-Forwarded-For" "header"ı ile gelen bu bilgiyi IIS loglarına kaydetmektir. IIS 6.0 ve öncesinde bu iş için yük dağıtıcı cihaz firmalarının sağladığı veya Internet'te örnek kodlarını bulabileceğiniz "ISAPI filter"lar kullanılıyordu. Ancak IIS 7.0'dan itibaren mimari değiştiği için bunları kullanma şansımız kalmadı. İşte bu noktada "Advanced Logging" modülü devreye giriyor. Daha önceki bir yazımda kısaca bahsettiğim bu modülü kullanarak istediğiniz hemen her şeyin IIS loglarına kaydedilmesini sağlayabilirsiniz. Elbette buna istek "header"ları da dahildir. Bunun için izlemeniz gereken adımlar aşağıdaki gibidir:

  1. "Advanced Logging" modülünü indirip kurun.
  2. IIS Manager arayüzünde bunu tanımlamak istediğiniz web sitesini sol taraftan seçip, orta bölümde "Advanced Logging" ikonuna çift tıklayın:
    AL_1
  3. "%COMPUTERNAME%*Server"ı seçip sağ taraftan "Clone Log Definition."a tıklayın:
    AL_2
  4. Daha sonra yeni yaratılan log tanımını seçip sağ taraftan "Edit Logging Fields."a tıklayın:
    AL_3
  5. Açılan pencerede "Add Field." butonuna tıklayarak şu bilgilerle bir tanım yaratın:
    Field ID: OrigClient-IP
    Category: Default
    Source type: Request Header
    Source name: X-Forwarded-For
    AL_4
  6. Bu yarattığımız tanımı aktif hale getirmek için "Advanced Logging" arayüzünde yine yeni yaratılan tanımı seçip sağ taraftan "Edit Log Definition."a tıklayın:
    AL_5
  7. Bu ekranda "Select Fields" butonuna tıklayarak loglanmasını istediğiniz tüm alanları seçebilirsiniz. Buradaki listede yeni eklediğimiz "OrgClient-IP" isimli alanı da görebilirsiniz:
    AL_6

Tüm bu tanımlardan sonra, IIS'in kendi loglarının yanısıra bu loglar da tutulmaya başlayacaktır. İhtiyaçlarınıza bağlı olarak IIS'in loglarını kapatabilir, ya da her ikisinin de tutulmasını sağlayabilirsiniz.

Advanced Logging, IIS loglarının aksine kernel modda yazılmadığı için, direkt "kernel cache"ten yanıtlanan veya kernel seviyesinden bloklanan istekler bu loglarda bulunmayacaktır.

Son olarak şunu da belirtmek lazım: Bu şekilde tutacağınız loglar da W3C formatında olacağından Log Parser ile inceleme şansınız olacaktır.

NOT: Yukarıda bahsettiklerim, "Advanced Logging" modülü ile gelen özelliklerden sadece biri ("Custom logging"). Diğer ilginç ve faydalı olabilecek özellikleri "Request Filtering", "Real-time logging" ve "Client logging"dir. Bunlarla ilgili detaylı bilgileri aşağıdaki linklerden bulabilirsiniz:

Advanced Logging
https://technet.microsoft.com/en-us/library/ee791852(WS.10).aspx

Advanced Logging
https://www.iis.net/download/AdvancedLogging

CENK ISCAN