Apache'de Mod_RemoteIP ile Gerçek Kullanıcı IP Adresini Yakalama Rehberi 
Selam sistemciler!
Bugün, özellikle bir yük dengeleyici (load balancer), CDN (Cloudflare, CloudFront vb.) veya reverse proxy (Nginx, HAProxy) arkasında çalışan Apache sunucularında yaşanan can sıkıcı bir sorunu çözeceğiz: Tüm loglarınızın ve uygulamalarınızın, trafiği size ileten ara sunucunun (proxy) IP adresini görmesi!
Bu durumda, erişim loglarınızda sadece 172.x, 10.x gibi dahili IP'ler veya CDN'in IP'leri görünür. Gerçek kullanıcılarınızın nereden geldiğini, saldırı kaynağını veya coğrafi dağılımı analiz edemezsiniz. İşte mod_remoteip modülü tam da burada devreye giriyor. Gelin bu modülü nasıl aktif edeceğimizi ve yapılandıracağımızı adım adım inceleyelim.
Mod_RemoteIP Nedir ve Ne İşe Yarar?
mod_remoteip, Apache HTTP Sunucusu için bir modüldür. Temel görevi, bir reverse proxy veya yük dengeleyici zincirinden gelen isteklerde, X-Forwarded-For, X-Real-IP gibi standart HTTP başlıklarını okuyarak, Apache'nin bağlantıyı kabul ettiği uzak IP adresi bilgisini (yani proxy'nin IP'sini) bu başlıklarda taşınan gerçek istemci IP adresi ile değiştirmektir.
Bu sayede:
Adım 1: Modülü Etkinleştirme (Ubuntu/Debian)
Öncelikle, modülün yüklü olup olmadığını kontrol edelim ve etkinleştirelim.
Eğer modül yüklü değilse (nadir), önce kurmanız gerekebilir:
Modülü etkinleştirdikten sonra Apache'yi yeniden başlatmayı unutmayın.
Adım 2: Ana Apache Yapılandırmasını Düzenleme
Şimdi, modülün hangi IP'lerden gelen "X-Forwarded-For" başlıklarına güveneceğini ve hangi başlıkları okuyacağını tanımlamamız gerekiyor. Bunun için ana yapılandırma dosyalarından birini (örneğin `remoteip.conf`) düzenleyeceğiz.
Bu dosyanın içine, kendi ortamınıza uygun aşağıdaki yapılandırmayı ekleyin:
ÖNEMLİ UYARI: RemoteIPTrustedProxy direktifine sadece güvendiğiniz sunucuların IP'lerini ekleyin. Aksi takdirde, bir saldırgan kendi "X-Forwarded-For: 8.8.8.8" başlığını gönderip IP'sini değiştirebilir!
Yapılandırmayı kaydettikten sonra, bu konfigürasyonu da etkinleştirelim:
Adım 3: Sanal Host (Vhost) Yapılandırmasını Güncelleme
Artık, gerçek IP adresini kullanacak olan sanal host'unuzun yapılandırma dosyasında, log dosyaları için doğru formatı kullandığından emin olmalı ve gerekirse `RemoteIPHeader` ayarını bu seviyede de belirtebilirsiniz.
Örnek bir sanal host yapılandırmasının ilgili kısmı:
Adım 4: Apache'yi Yeniden Başlatma ve Test Etme
Tüm değişiklikleri uygulamak için Apache servisini yeniden başlatalım:
Şimdi test zamanı!
Sunucunuza bir istek gönderin (doğrudan veya proxy üzerinden). Ardından erişim loglarını kontrol edin:
Artık log satırlarının başında, proxy'nizin değil, gerçek istemcinin IP adresini görmelisiniz.
Ayrıca, basit bir PHP test dosyası oluşturarak uygulama tarafında da kontrol edebilirsiniz (`/var/www/html/testip.php`):
Bu dosyayı tarayıcıdan açtığınızda, `REMOTE_ADDR` alanının artık gerçek IP'nizi göstermesi gerekiyor.
Karşılaşılabilecek Sorunlar ve Çözümleri
Umarım bu rehber, loglarınızdaki o "hayalet" IP'ler sorununu çözmenize yardımcı olur. Doğru loglama, güvenlik ve analiz için bu ayar gerçekten kritik öneme sahip.
Peki siz hangi yük dengeleyici veya CDN çözümünü kullanıyorsunuz? `mod_remoteip` kurulumunda başka hangi zorluklarla karşılaştınız? Deneyimlerinizi yorumlarda paylaşın, birlikte çözüm bulalım!
Selam sistemciler!
Bu durumda, erişim loglarınızda sadece 172.x, 10.x gibi dahili IP'ler veya CDN'in IP'leri görünür. Gerçek kullanıcılarınızın nereden geldiğini, saldırı kaynağını veya coğrafi dağılımı analiz edemezsiniz. İşte mod_remoteip modülü tam da burada devreye giriyor. Gelin bu modülü nasıl aktif edeceğimizi ve yapılandıracağımızı adım adım inceleyelim.
Mod_RemoteIP Nedir ve Ne İşe Yarar?
mod_remoteip, Apache HTTP Sunucusu için bir modüldür. Temel görevi, bir reverse proxy veya yük dengeleyici zincirinden gelen isteklerde, X-Forwarded-For, X-Real-IP gibi standart HTTP başlıklarını okuyarak, Apache'nin bağlantıyı kabul ettiği uzak IP adresi bilgisini (yani proxy'nin IP'sini) bu başlıklarda taşınan gerçek istemci IP adresi ile değiştirmektir.
Bu sayede:
- Erişim loglarınız (access_log) artık gerçek kullanıcı IP'lerini gösterir.
- PHP, Perl, Python gibi uygulamalarınız $_SERVER['REMOTE_ADDR'] değişkeninden doğru IP'yi alır.
- IP bazlı erişim kontrolleri (Require ip) ve güvenlik önlemleri doğru şekilde çalışır.
- Fail2ban gibi araçlar doğrudan saldırganın IP'sini engelleyebilir.
Adım 1: Modülü Etkinleştirme (Ubuntu/Debian)
Öncelikle, modülün yüklü olup olmadığını kontrol edelim ve etkinleştirelim.
Bash:
# Modülün mevcut olup olmadığını kontrol et
sudo apache2ctl -M | grep remoteip
# Eğer çıktı vermezse, modül yüklü ama etkin değil veya yüklü değil demektir.
# Modülü etkinleştirelim:
sudo a2enmod remoteip
Eğer modül yüklü değilse (nadir), önce kurmanız gerekebilir:
Bash:
sudo apt update
sudo apt install apache2
# Apache kurulumu ile birlikte genelde modül de gelir.
Modülü etkinleştirdikten sonra Apache'yi yeniden başlatmayı unutmayın.
Adım 2: Ana Apache Yapılandırmasını Düzenleme
Şimdi, modülün hangi IP'lerden gelen "X-Forwarded-For" başlıklarına güveneceğini ve hangi başlıkları okuyacağını tanımlamamız gerekiyor. Bunun için ana yapılandırma dosyalarından birini (örneğin `remoteip.conf`) düzenleyeceğiz.
Bash:
sudo nano /etc/apache2/conf-available/remoteip.conf
Bu dosyanın içine, kendi ortamınıza uygun aşağıdaki yapılandırmayı ekleyin:
Kod:
# RemoteIP modülünü yükle
LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so
# Hangi IP adreslerinden gelen X-Forwarded-For başlıklarına GÜVENİLECEK?
# Buraya yük dengeleyicinizin, CDN'inizin veya reverse proxy'nizin IP adres(ler)ini yazın.
# LOCALHOST ve dahili ağınız için örnekler:
RemoteIPTrustedProxy 127.0.0.1
RemoteIPTrustedProxy 192.168.1.100
RemoteIPTrustedProxy 10.0.0.0/8
# Eğer Cloudflare kullanıyorsanız, IP listesini sürekli güncellemeniz gerekir.
# Cloudflare IP listesi için: https://www.cloudflare.com/ips/
# Gerçek IP adresinin hangi başlıkta saklandığını belirtin (genellikle X-Forwarded-For).
RemoteIPHeader X-Forwarded-For
# İsteğin geçtiği tüm proxy'lerin IP'sini tutmak isteyebilirsiniz (opsiyonel).
# Bu, X-Forwarded-For başlığında bir IP zinciri oluşturur.
RemoteIPInternalProxy 192.168.1.100 10.0.0.0/8
# Apache'nin log formatında %a yerine gerçek IP'yi yazmasını sağlamak için log formatını değiştiriyoruz.
LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %O" common
ÖNEMLİ UYARI: RemoteIPTrustedProxy direktifine sadece güvendiğiniz sunucuların IP'lerini ekleyin. Aksi takdirde, bir saldırgan kendi "X-Forwarded-For: 8.8.8.8" başlığını gönderip IP'sini değiştirebilir!
Yapılandırmayı kaydettikten sonra, bu konfigürasyonu da etkinleştirelim:
Bash:
sudo a2enconf remoteip
Adım 3: Sanal Host (Vhost) Yapılandırmasını Güncelleme
Artık, gerçek IP adresini kullanacak olan sanal host'unuzun yapılandırma dosyasında, log dosyaları için doğru formatı kullandığından emin olmalı ve gerekirse `RemoteIPHeader` ayarını bu seviyede de belirtebilirsiniz.
Örnek bir sanal host yapılandırmasının ilgili kısmı:
Kod:
<VirtualHost *:80>
ServerName sitem.com
DocumentRoot /var/www/html
# Erişim loglarını, combined formatında (ki bu artık gerçek IP'yi %a ile gösteriyor) tanımla
CustomLog ${APACHE_LOG_DIR}/sitem-access.log combined
ErrorLog ${APACHE_LOG_DIR}/sitem-error.log
# Eğer ana konfigürasyonda tanımlanmadıysa, bu seviyede de header'ı belirtebilirsiniz.
# RemoteIPHeader X-Forwarded-For
</VirtualHost>
Adım 4: Apache'yi Yeniden Başlatma ve Test Etme
Tüm değişiklikleri uygulamak için Apache servisini yeniden başlatalım:
Bash:
sudo systemctl restart apache2
# veya
sudo service apache2 restart
Şimdi test zamanı!
Bash:
sudo tail -f /var/log/apache2/sitem-access.log
Artık log satırlarının başında, proxy'nizin değil, gerçek istemcinin IP adresini görmelisiniz.
Ayrıca, basit bir PHP test dosyası oluşturarak uygulama tarafında da kontrol edebilirsiniz (`/var/www/html/testip.php`):
PHP:
<?php
echo "REMOTE_ADDR: " . $_SERVER['REMOTE_ADDR'] . "<br>";
echo "HTTP_X_FORWARDED_FOR: " . ($_SERVER['HTTP_X_FORWARDED_FOR'] ?? 'Bulunamadı') . "<br>";
?>
Bu dosyayı tarayıcıdan açtığınızda, `REMOTE_ADDR` alanının artık gerçek IP'nizi göstermesi gerekiyor.
Karşılaşılabilecek Sorunlar ve Çözümleri
- Loglar Hala Proxy IP'sini Gösteriyor: `RemoteIPTrustedProxy` listesine proxy IP'nizi eklediğinizden ve doğru log formatını (`combined`) kullandığınızdan emin olun. Apache'yi yeniden başlattınız mı?
- PHP veya Diğer Uygulamalar Hala Yanlış IP'yi Görüyor: PHP-FPM kullanıyorsanız, `mod_remoteip`'in çalışması için Apache'nin PHP'yi mod_php olarak değil, FastCGI (`mod_proxy_fcgi`) üzerinden çalıştırıyor olması gerekebilir. Ayrıca, bazı PHP framework'leri IP'yi farklı bir süper global değişkende (`$_SERVER['HTTP_X_FORWARDED_FOR']`) saklayabilir, uygulama kodunuzu buna göre güncellemelisiniz.
- Cloudflare veya Diğer CDN'ler ile Kullanım: CDN'lerin IP listesi değişebilir. Cloudflare için IP listesini düzenli olarak çekip yapılandırmanızı güncelleyen betikler yazmanız önerilir.
Umarım bu rehber, loglarınızdaki o "hayalet" IP'ler sorununu çözmenize yardımcı olur. Doğru loglama, güvenlik ve analiz için bu ayar gerçekten kritik öneme sahip.
Peki siz hangi yük dengeleyici veya CDN çözümünü kullanıyorsunuz? `mod_remoteip` kurulumunda başka hangi zorluklarla karşılaştınız? Deneyimlerinizi yorumlarda paylaşın, birlikte çözüm bulalım!