Apache mod_qos ile Bant Genişliği ve Kaynak Sınırlama

Web sunucunuza gelen trafik kontrol altında olmadığında ne olur? Bir DDoS saldırısı, kötü yazılmış bir bot veya ani bir viral içerik patlaması sunucunuzu kolayca çökertebilir. İşte tam bu noktada Apache’nin mod_qos modülü devreye giriyor. QoS, yani “Quality of Service” (Hizmet Kalitesi), ağ dünyasından web sunucusuna taşınan bir kavram. Bu modül sayesinde istek sayısını, bant genişliğini ve bağlantı limitlerini granüler bir şekilde kontrol edebiliyorsunuz. Bugün bu modülü gerçek dünya senaryolarıyla birlikte ele alacağız.

mod_qos Nedir ve Neden Kullanmalısınız?

mod_qos, Apache HTTP Server için geliştirilmiş bir trafik kontrol modülüdür. Temel olarak şu sorunlara çözüm sunar:

  • Aşırı yük koruması: Sunucuya gelen eş zamanlı bağlantı sayısını sınırlandırır
  • Bant genişliği yönetimi: Belirli lokasyonlar veya istemciler için indirme/yükleme hızını kısıtlar
  • Slowloris koruması: Yavaş istek saldırılarına karşı koruma sağlar
  • IP bazlı kısıtlama: Tek bir IP’den gelebilecek maksimum istek sayısını belirler
  • Öncelik sıralaması: Kritik trafiğe daha fazla kaynak tahsis eder

Mod_security güvenlik odaklıyken mod_qos performans ve kaynak yönetimi odaklıdır. İkisi birbirini tamamlar.

Kurulum

Çoğu dağıtımda mod_qos paket depolarında mevcuttur.

Debian/Ubuntu üzerinde kurulum:

sudo apt-get update
sudo apt-get install libapache2-mod-qos
sudo a2enmod qos
sudo systemctl restart apache2

CentOS/RHEL/Rocky Linux üzerinde kurulum:

sudo dnf install epel-release
sudo dnf install mod_qos
sudo systemctl restart httpd

Kaynak koddan derleme (en güncel sürüm için):

# Bağımlılıkları kur
sudo apt-get install apache2-dev libpcre3-dev

# Kaynak kodu indir
wget https://sourceforge.net/projects/mod-qos/files/latest/download -O mod_qos.tar.gz
tar xzf mod_qos.tar.gz
cd mod_qos-*/apache2/

# Derle ve kur
sudo apxs -i -c mod_qos.c -lpcre

Modülün yüklendiğini doğrulamak için:

apache2ctl -M | grep qos
# veya
httpd -M | grep qos

Çıktıda qos_module (shared) görüyorsanız modül aktif demektir.

Temel Konfigürasyon Direktifleri

Direktifleri anlamak, doğru yapılandırma için kritik öneme sahip. İşte en sık kullanılan parametreler:

QS_SrvMaxConn: Sunucuya gelebilecek maksimum eş zamanlı bağlantı sayısı QS_SrvMaxConnClose: Bu eşik aşıldığında keep-alive bağlantıları kapatılır QS_SrvMaxConnPerIP: Tek bir IP’den maksimum eş zamanlı bağlantı sayısı QS_LocRequestLimit: Belirli bir lokasyon için saniyedeki maksimum istek sayısı QS_LocRequestLimitMatch: Regex ile eşleşen URL’ler için istek limiti QS_LocKBytesPerSecLimit: Lokasyon bazında saniyedeki kilobayt limiti QS_ClientEventBlockCount: İstemci olay sayacı blok eşiği QS_SrvMinDataRate: Minimum veri iletim hızı (Slowloris koruması için) QS_ErrorPage: Limit aşıldığında yönlendirilecek sayfa

Gerçek Dünya Senaryosu 1: Paylaşımlı Hosting Ortamı

Diyelim ki 50 müşterinin bulunduğu bir paylaşımlı hosting sunucusu yönetiyorsunuz. Bir müşterinin sitesi viral oldu ve sunucudaki tüm kaynakları tüketiyor. Bu durumda şu yapılandırmayı kullanabilirsiniz:

# /etc/apache2/conf-available/mod_qos.conf

LoadModule qos_module /usr/lib/apache2/modules/mod_qos.so

# Sunucu genelinde maksimum 1000 eş zamanlı bağlantı
QS_SrvMaxConn 1000

# 800 bağlantıya ulaşıldığında keep-alive'ı kapat
QS_SrvMaxConnClose 800

# Tek IP'den maksimum 50 eş zamanlı bağlantı
QS_SrvMaxConnPerIP 50

# Slowloris ve benzer yavaş saldırılara karşı minimum 250 byte/saniye
QS_SrvMinDataRate 250 1200

# Genel istek zaman aşımı
Timeout 20

<IfModule mod_qos.c>
    # Durum sayfasını sadece localhost'tan erişilebilir yap
    <Location /qos-status>
        SetHandler qos-viewer
        Require ip 127.0.0.1
    </Location>
</IfModule>

Bu yapılandırmayı etkinleştirmek için:

sudo a2enconf mod_qos
sudo apache2ctl configtest
sudo systemctl reload apache2

Gerçek Dünya Senaryosu 2: API Gateway Koruması

Bir REST API sunucusu işletiyorsunuz ve rate limiting uygulamak istiyorsunuz. Özellikle /api/ altındaki endpoint’leri korumak için:

<VirtualHost *:443>
    ServerName api.sirketiniz.com

    <IfModule mod_qos.c>
        # Genel sunucu limitleri
        QS_SrvMaxConn 500
        QS_SrvMaxConnPerIP 20

        # API endpoint için saniyede maksimum 100 istek
        QS_LocRequestLimit /api/ 100

        # Login endpoint'i daha sıkı sınırla (brute force koruması)
        QS_LocRequestLimit /api/auth/login 10
        QS_LocRequestLimit /api/auth/register 5

        # Dosya upload endpoint'i için bant genişliği limiti (500 KB/s)
        QS_LocKBytesPerSecLimit /api/upload 500

        # Arama endpoint'i - hesaplama yoğun, daha az istek
        QS_LocRequestLimitMatch ^/api/search.* 20

        # 429 Too Many Requests sayfası
        QS_ErrorPage /errors/rate-limit.html

        # İstemci olay takibi - 100 olay sonrası 60 saniye engelle
        QS_ClientEventBlockCount 100 60

        # Durum izleme
        <Location /server-qos>
            SetHandler qos-viewer
            Require ip 10.0.0.0/8
        </Location>
    </IfModule>

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/api.crt
    SSLCertificateKeyFile /etc/ssl/private/api.key
</VirtualHost>

Bant Genişliği Sınırlama Detayları

Bant genişliği kontrolü mod_qos’un en güçlü özelliklerinden biri. Özellikle medya dosyası sunan veya büyük indirmeler barındıran sitelerde kritik önem taşıyor.

<VirtualHost *:80>
    ServerName download.sirketiniz.com
    DocumentRoot /var/www/downloads

    <IfModule mod_qos.c>
        # Tüm sunucu için maksimum bant genişliği (10 MB/s)
        QS_SrvMaxConn 200

        # /downloads/ dizini için 1 MB/s limit
        QS_LocKBytesPerSecLimit /downloads/ 1024

        # /premium/ üyeler için 5 MB/s limit
        QS_LocKBytesPerSecLimit /premium/downloads/ 5120

        # Video streaming için özel limit
        QS_LocKBytesPerSecLimit /stream/ 2048

        # Küçük dosyalar için limit koyma
        # (1 MB altı dosyalar bu direktiften etkilenmez)
        QS_LocKBytesPerSecLimitMatch .(css|js|png|jpg|gif|ico)$ 0
    </IfModule>

    <Directory /var/www/downloads>
        Options -Indexes
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

Burada dikkat edilmesi gereken nokta: QS_LocKBytesPerSecLimit saniyedeki kilobayt cinsinden değer alır. 1024 = 1 MB/s demektir.

Slowloris Saldırısına Karşı Koruma

Slowloris, HTTP bağlantılarını yavaş yavaş göndererek sunucu kaynaklarını tüketen klasik bir saldırı türü. mod_qos bu konuda oldukça etkili:

<IfModule mod_qos.c>
    # Minimum 500 byte/saniye veri hızı zorunlu kıl
    # Maksimum tolerans süresi: 10 saniye
    QS_SrvMinDataRate 500 10

    # İstek başlığı için maksimum okuma süresi (saniye)
    # Apache'nin kendi Timeout direktifiyle birlikte çalışır
    QS_SrvRequestTimeout 10

    # Bağlantı başına maksimum istek sayısı (keep-alive)
    # Bu değeri aşan bağlantılar kapatılır
    QS_SrvMaxConnClose 600

    # Anormal header gönderen bağlantıları yakala
    QS_SrvMinDataRateOffEvent /login

</IfModule>

# Apache timeout ayarları ile birlikte kullan
Timeout 30
KeepAliveTimeout 5
MaxKeepAliveRequests 100

Dinamik IP Engelleme ve Olay Takibi

mod_qos’un olay tabanlı engelleme sistemi, saldırganları otomatik olarak tespit edip geçici olarak engellemenizi sağlar:

<VirtualHost *:80>
    ServerName www.sirketiniz.com

    <IfModule mod_qos.c>
        # 404 hatası olayını tanımla
        QS_SetEnvIfStatus 404 QS_Block

        # 401 hatası (başarısız login) olayını tanımla
        QS_SetEnvIfStatus 401 QS_Block

        # Aynı IP'den 30 saniyede 20 blok olayı gelirse engelle
        QS_ClientEventBlockCount 20 30

        # 429 hatası için özel sayfa
        QS_ErrorPage https://www.sirketiniz.com/errors/too-many-requests.html

        # Engellenen IP'leri logla
        QS_ClientEventLimitCount 50 3600

        # IP bazlı istek limiti - saatte 1000 istek
        QS_ClientPrefer 80

    </IfModule>

    # Özel log formatı ile QoS durumunu logla
    LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" QoS: %{mod_qos_cr}e/%{mod_qos_cc}e" combined_qos
    CustomLog /var/log/apache2/access_qos.log combined_qos

</VirtualHost>

Bu yapılandırma ile sisteminize saldıran IP’ler otomatik olarak belirlenen süre boyunca engelleniyor. Log formatına eklediğimiz mod_qos_cr ve mod_qos_cc değişkenleri, anlık istek oranını ve mevcut bağlantı sayısını gösteriyor.

Beyaz Liste ve Öncelik Yönetimi

Her kullanıcıyı aynı şekilde kısıtlamak her zaman doğru yaklaşım değil. Ödeme sistemleri, monitoring araçları veya güvenilir ortaklar için beyaz liste oluşturabilirsiniz:

<IfModule mod_qos.c>
    # Monitoring sunucusunu tüm limitlerden muaf tut
    QS_SrvMaxConnExcludeIP 192.168.1.100

    # Ödeme gateway IP aralığını muaf tut
    QS_SrvMaxConnExcludeIP 185.220.0.0/16

    # Yönetim paneline localhost'tan sınırsız erişim
    <Location /admin>
        QS_LocRequestLimitMatch .* 0
        Require ip 127.0.0.1 10.0.0.0/8
    </Location>

    # Kritik API endpoint'ini yüksek limitli tut
    QS_LocRequestLimit /api/payment/callback 1000

    # Statik dosyalar için limit koyma
    QS_LocRequestLimitMatch .(css|js|png|jpg|gif|woff|woff2|ttf|svg|ico)$ 0

    # Öncelikli trafik işareti - bu header varsa kısıtlama uygulama
    QS_SetEnvIfResBody "X-Priority-Client" QS_Pass

</IfModule>

Performans İzleme ve Durum Sayfası

mod_qos, anlık durumu görüntüleyebileceğiniz dahili bir durum sayfası sunuyor. Bu sayfayı doğru yapılandırmak önemli:

<IfModule mod_qos.c>
    # QoS durum sayfası - sadece iç ağdan erişilebilir
    <Location /qos-status>
        SetHandler qos-viewer
        Require ip 127.0.0.1
        Require ip 10.0.0.0/8
        Require ip 192.168.0.0/16
    </Location>

    # Konsol çıktısı için text formatı
    <Location /qos-console>
        SetHandler qos-console
        Require ip 127.0.0.1
    </Location>

</IfModule>

Durum sayfasına erişmek ve verileri izlemek için:

# Anlık durum bilgisi
curl http://localhost/qos-status

# Düzenli aralıklarla izleme scripti
watch -n 5 'curl -s http://localhost/qos-console | grep -E "connections|requests|blocked"'

# Log analizi - son bir saatteki engellemeler
grep "mod_qos" /var/log/apache2/error.log | tail -100

# Engellenen IP'leri listele
grep "QS_Block" /var/log/apache2/access_qos.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

Yapılandırmayı Test Etme

Yapılandırmanızı canlıya almadan önce test etmek kritik:

# Syntax kontrolü
sudo apache2ctl configtest

# Modülün yüklendiğini doğrula
sudo apache2ctl -M 2>/dev/null | grep qos

# Apache2Buddy ile genel sağlık kontrolü
curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | perl

# ab (Apache Benchmark) ile yük testi
ab -n 1000 -c 100 http://localhost/

# Bağlantı limitini test et - 60 eş zamanlı bağlantı
ab -n 500 -c 60 http://www.sirketiniz.com/

# Rate limiting testi
for i in $(seq 1 50); do
    curl -s -o /dev/null -w "%{http_code}n" http://localhost/api/test &
done
wait

Test sırasında log dosyasını paralel olarak takip edin:

tail -f /var/log/apache2/error.log | grep -i "qos|limit|blocked"

Sık Yapılan Hatalar ve Çözümleri

Çok agresif limitler: Özellikle QS_SrvMinDataRate değerini çok yüksek tutmak meşru kullanıcıları etkileyebilir. 250-500 byte/saniye başlangıç için iyi bir değer.

Keep-alive ayarlarıyla çakışma: QS_SrvMaxConnClose değeri, Apache’nin MaxRequestWorkers değerinin %80’i civarında olmalı. Aksi hâlde performans sorunları çıkabilir.

Log boyutu: QoS logları hızla büyüyebilir. logrotate yapılandırmanızı kontrol edin:

# /etc/logrotate.d/apache2 dosyasına ekle
/var/log/apache2/access_qos.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    postrotate
        /bin/systemctl reload apache2 > /dev/null 2>/dev/null || true
    endscript
}

QS_LocRequestLimit ve QS_LocKBytesPerSecLimit çakışması: Her iki direktif aynı lokasyona uygulandığında, her ikisi de ayrı ayrı çalışır. Hangisi önce tetiklenirse o devreye girer.

Nginx ile Birlikte Kullanım (Reverse Proxy Senaryosu)

Bazı ortamlarda Nginx ön tarafta, Apache arka tarafta çalışır. Bu durumda gerçek IP’yi doğru almak için:

<IfModule mod_remoteip.c>
    RemoteIPHeader X-Forwarded-For
    RemoteIPTrustedProxy 10.0.0.1
    RemoteIPTrustedProxy 10.0.0.2
</IfModule>

<IfModule mod_qos.c>
    # Gerçek IP bazlı limit (mod_remoteip ile birlikte)
    QS_SrvMaxConnPerIP 30

    # Proxy'den gelen tüm trafik tek IP gibi görüneceğinden
    # proxy IP'sini muaf tut, sadece gerçek IP'leri say
    QS_SrvMaxConnExcludeIP 10.0.0.1
    QS_SrvMaxConnExcludeIP 10.0.0.2

</IfModule>

Sonuç

mod_qos, Apache tabanlı web altyapılarında kaynak yönetiminin bel kemiği olabilecek güçlü bir araç. Özellikle şu senaryolarda kesinlikle değerlendirmeye almanızı öneririm:

  • Paylaşımlı hosting ortamlarında “noisy neighbor” sorununu çözmek için
  • API gateway’lerde rate limiting uygulamak için
  • DDoS ve Slowloris gibi saldırılara karşı ilk savunma hattı oluşturmak için
  • Bant genişliği maliyetlerini kontrol altında tutmak için

Başlangıç için muhafazakar değerler seçin, log’ları dikkatlice izleyin ve gerçek trafik verilerinize göre kademeli olarak ayarlayın. QS_SrvMaxConn değerini MaxRequestWorkers direktifinizle uyumlu tutmayı unutmayın. Her ortamın ihtiyacı farklı, bu nedenle yapılandırmaları direkt kopyalamak yerine kendi trafiğinizi analiz edip buna göre özelleştirin.

Son olarak, mod_qos tek başına yeterli değil. mod_security, fail2ban, iyi yapılandırılmış bir güvenlik duvarı ve CDN katmanıyla birlikte kullandığınızda gerçek anlamda sağlam bir savunma hattı oluşturmuş olursunuz.

Yorum yapın