OpenLiteSpeed ile Rate Limiting ve Bağlantı Sayısı Sınırlandırma

Web sunucunuzun güvenliğini sağlamanın en kritik adımlarından biri, gelen istekleri kontrol altında tutmaktır. DDoS saldırıları, brute force denemeleri veya kötü niyetli botların aşırı yüklemesi karşısında OpenLiteSpeed’in sunduğu rate limiting ve bağlantı sınırlandırma özellikleri gerçek bir can simidi görevi görür. Bu yazıda, OpenLiteSpeed üzerinde bu mekanizmaları nasıl yapılandıracağınızı, hangi senaryolarda nasıl kullanacağınızı ve production ortamlarında işe yarayan gerçek örnekleri inceleyeceğiz.

OpenLiteSpeed’de Rate Limiting Nasıl Çalışır

OpenLiteSpeed, rate limiting için iki temel katmanda çalışır. Bunlardan ilki bağlantı düzeyindeki sınırlamalar, ikincisi ise istek düzeyindeki kontroller. Bağlantı sınırlaması, aynı IP’den kaç eş zamanlı bağlantı gelebileceğini belirlerken, istek sınırlaması belirli bir zaman diliminde kaç istek kabul edileceğini kontrol eder.

OpenLiteSpeed bu işlemleri kendi yapılandırma dosyaları üzerinden ya da web arayüzü (WebAdmin) üzerinden yönetmenize izin verir. Ben her iki yöntemi de göstereceğim, ancak asıl kontrolün doğrudan konfigurasyon dosyalarından yapılmasını öneririm çünkü CI/CD pipeline’larına entegre etmek, versiyon kontrolüne almak ve hızlıca geri almak çok daha kolay olur.

Yapılandırma Dosyalarının Konumu

OpenLiteSpeed’in ana yapılandırma dosyası genellikle şu konumlarda bulunur:

# Ana yapılandırma dosyası
/usr/local/lsws/conf/httpd_config.conf

# Virtual host yapılandırmaları
/usr/local/lsws/conf/vhosts/<site-adı>/vhconf.conf

# WebAdmin arayüzü için
http://sunucu-ip:7080

Yapılandırmaya geçmeden önce mevcut durumu bir kontrol edelim:

# OpenLiteSpeed servis durumunu kontrol et
systemctl status lsws

# Mevcut bağlantıları listele
ss -tn | grep :80 | wc -l
ss -tn | grep :443 | wc -l

# Anlık bağlantı sayısını IP'ye göre grupla
ss -tn state established '( dport = :80 or dport = :443 )' | 
  awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20

Temel Rate Limiting Yapılandırması

OpenLiteSpeed’de rate limiting için önce bir throttle veya connection limit kuralı oluşturmanız gerekir. Ana yapılandırma dosyasına erişelim:

# Yapılandırma dosyasını yedekle
cp /usr/local/lsws/conf/httpd_config.conf /usr/local/lsws/conf/httpd_config.conf.bak.$(date +%Y%m%d)

# Dosyayı düzenle
nano /usr/local/lsws/conf/httpd_config.conf

Ana yapılandırma dosyasına eklenecek temel bağlantı sınırları:

# httpd_config.conf içinde Connection Settings bölümü
connTimeout              300
maxKeepAliveReq         1000
smartKeepAlive           0
keepAliveTimeout         5
maxConnections           2000
maxSSLConnections        1000

# IP başına bağlantı limiti
perClientConnLimit       20

# Bant genişliği sınırlaması (bytes/saniye, 0 = sınırsız)
outBandwidth             0
inBandwidth              0

Bu değerlerin ne anlama geldiğini açıklayayım:

  • connTimeout: Bir bağlantının zaman aşımına uğraması için bekleme süresi (saniye)
  • maxKeepAliveReq: Tek bir keep-alive bağlantısında izin verilen maksimum istek sayısı
  • maxConnections: Sunucunun toplam kabul edeceği maksimum eş zamanlı bağlantı
  • maxSSLConnections: SSL/TLS bağlantıları için ayrı maksimum limit
  • perClientConnLimit: Tek bir IP’den gelebilecek maksimum eş zamanlı bağlantı sayısı

Virtual Host Düzeyinde Rate Limiting

Genel sunucu ayarları bazen yeterli olmaz. Farklı siteler için farklı kurallar uygulamak isteyebilirsiniz. Bir e-ticaret sitesi ile bir blog sitesi aynı sınırları paylaşmamalı.

# Virtual host yapılandırmasına git
nano /usr/local/lsws/conf/vhosts/eticaret-sitesi/vhconf.conf

Virtual host içine eklenecek rate limiting kuralları:

# Virtual Host Rate Limiting Yapılandırması
vhDomain                 eticaret.example.com
vhAliases                www.eticaret.example.com
vhRoot                   /var/www/eticaret/
maxKeepAliveReq          500
smartKeepAlive           1

# Throttle (istek hızı sınırlaması)
# statReqPerSec: Statik dosyalar için saniyedeki maksimum istek
# dynReqPerSec: Dinamik içerik için saniyedeki maksimum istek
# outBandwidth: Giden bant genişliği (KB/saniye)
throttle                 1
staticReqPerSec          100
dynReqPerSec             25
outBandwidth             10240
inBandwidth              0

Rewrite Kuralları ile Gelişmiş Rate Limiting

OpenLiteSpeed, Apache uyumlu .htaccess ve rewrite kurallarını destekler. Bu özelliği kullanarak daha granüler kurallar yazabilirsiniz:

# Site kök dizinine .htaccess dosyası oluştur
nano /var/www/eticaret/.htaccess
# Belirli endpoint'lere rate limiting uygula
# Login sayfasına saldırı koruması
<IfModule mod_rewrite.c>
RewriteEngine On

# Bot ve tarayıcı olmayan user-agent'ları engelle
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget|python|libwww|lwp|nikto|sqlmap) [NC]
RewriteRule .* - [F,L]

# wp-login.php veya admin paneli koruması
RewriteCond %{REQUEST_URI} ^/wp-login.php$ [OR]
RewriteCond %{REQUEST_URI} ^/admin/login$
RewriteCond %{HTTP:X-Forwarded-For} !^$
RewriteRule .* - [F,L]
</IfModule>

ModSecurity ile Entegre Rate Limiting

OpenLiteSpeed, ModSecurity’yi destekler ve bu ikisini birleştirince çok daha güçlü bir koruma katmanı elde edersiniz. ModSecurity’nin rate limiting kurallarını nasıl yazacağınıza bakalım:

# ModSecurity yapılandırma dosyası
nano /usr/local/lsws/conf/modsec.conf
# ModSecurity Rate Limiting Kuralları

# Aynı IP'den saniyede 30'dan fazla istek gelirse engelle
SecRule IP:REQUEST_COUNTER "@gt 30" 
    "id:1001,
    phase:1,
    deny,
    status:429,
    msg:'Rate limit exceeded - Too many requests',
    logdata:'IP: %{REMOTE_ADDR} - Counter: %{IP.REQUEST_COUNTER}',
    setenv:RATE_LIMIT_HIT=1"

# Sayacı her istek için artır
SecAction 
    "id:1002,
    phase:1,
    nolog,
    pass,
    initcol:ip=%{REMOTE_ADDR},
    setvar:ip.request_counter=+1,
    expirevar:ip.request_counter=60"

# Brute force koruması - login endpoint'i için özel kural
SecRule REQUEST_URI "@endsWith /login" 
    "id:1003,
    phase:1,
    chain,
    deny,
    status:429,
    msg:'Brute force attempt detected'"
    SecRule IP:LOGIN_ATTEMPTS "@gt 10" ""

Gerçek Dünya Senaryosu: E-Ticaret Sitesi Koruması

Diyelim ki bir e-ticaret siteniz var ve ürün sayfalarınız ani trafik artışlarından etkileniyor, ödeme sayfanız ise brute force saldırılarına maruz kalıyor. İşte bu senaryo için eksiksiz bir yapılandırma:

# /usr/local/lsws/conf/vhosts/eticaret/vhconf.conf

# Genel site ayarları
vhDomain                 eticaret.example.com
vhRoot                   /var/www/eticaret/

# Statik dosyalar için yüksek limit (ürün görselleri vb.)
staticReqPerSec          200

# PHP/dinamik içerik için düşük limit
dynReqPerSec             30

# Ödeme sayfası ve API için ayrı context tanımla
context /checkout/ {
    # Checkout için daha sıkı sınırlar
    maxObjSize           0
    dynReqPerSec         10
    allowBrowse          0
}

context /api/ {
    # API endpoint'leri için token bazlı kontrol
    dynReqPerSec         50
    accessControl        1
}

context /wp-admin/ {
    # Admin paneli sadece belirli IP'lerden
    accessControl        1
    allow                192.168.1.0/24, 10.0.0.1
    deny                 ALL
}

Ayrıca bu yapılandırmayı desteklemek için bir access control listesi oluşturun:

# Whitelist oluştur
nano /usr/local/lsws/conf/acl/trusted_ips.conf

# Güvenilir IP'ler (CDN, ofis, VPN)
allow   103.21.244.0/22
allow   103.22.200.0/22
allow   192.168.1.0/24
deny    ALL

Bağlantı Limitlerini İzleme ve Alarm Üretme

Kuralları koyduktan sonra işin bitmediğini biliyorsunuz. İzleme olmadan kör bir koruma kurmuş olursunuz. İşte basit ama etkili bir izleme scripti:

#!/bin/bash
# /usr/local/bin/ols_connection_monitor.sh

LOG_FILE="/var/log/ols_connection_monitor.log"
ALERT_THRESHOLD=50
ADMIN_EMAIL="[email protected]"
OLS_LOG="/usr/local/lsws/logs/error.log"

timestamp() {
    date '+%Y-%m-%d %H:%M:%S'
}

check_connections() {
    echo "=== Bağlantı Raporu - $(timestamp) ===" >> $LOG_FILE
    
    # IP başına bağlantı sayısını al
    HIGH_CONN_IPS=$(ss -tn state established '( dport = :80 or dport = :443 )' | 
        awk '{print $5}' | 
        grep -v Address | 
        cut -d: -f1 | 
        sort | uniq -c | sort -rn | 
        awk -v threshold=$ALERT_THRESHOLD '$1 > threshold {print $0}')
    
    if [ -n "$HIGH_CONN_IPS" ]; then
        echo "UYARI: Yüksek bağlantı sayısı tespit edildi!" >> $LOG_FILE
        echo "$HIGH_CONN_IPS" >> $LOG_FILE
        
        # Mail gönder (mailutils kurulu olmalı)
        echo -e "Yüksek bağlantı uyarısı:n$HIGH_CONN_IPS" | 
            mail -s "OLS Rate Limit Uyarısı - $(hostname)" $ADMIN_EMAIL
    fi
    
    # Toplam bağlantı sayısı
    TOTAL=$(ss -tn state established '( dport = :80 or dport = :443 )' | wc -l)
    echo "Toplam bağlantı: $TOTAL" >> $LOG_FILE
    
    # 429 hatalarını say (rate limit tetiklemeleri)
    RATE_LIMITED=$(grep "429" $OLS_LOG | grep "$(date '+%Y-%m-%d')" | wc -l)
    echo "Bugün rate limit tetiklenme sayısı: $RATE_LIMITED" >> $LOG_FILE
}

# Rate limit hit'leri logdan analiz et
analyze_rate_limits() {
    echo "--- Rate Limit Analizi ---" >> $LOG_FILE
    grep "429|rate limit|throttle" $OLS_LOG | 
        awk '{print $1}' | sort | uniq -c | sort -rn | head -10 >> $LOG_FILE
}

check_connections
analyze_rate_limits

Bu scripti cron ile çalıştırın:

# Crontab'a ekle - her 5 dakikada bir çalışsın
crontab -e

# Şu satırı ekle:
*/5 * * * * /usr/local/bin/ols_connection_monitor.sh

Fail2Ban ile OpenLiteSpeed Entegrasyonu

Rate limiting’i bir adım öteye taşımak için Fail2Ban ile OpenLiteSpeed’i birleştirmek harika bir strateji. Çok sayıda 429 üretip sınırı aşan IP’leri otomatik olarak firewall düzeyinde engelleyebilirsiniz:

# Fail2Ban için OpenLiteSpeed filtresi oluştur
nano /etc/fail2ban/filter.d/openlitespeed.conf
[Definition]
# OpenLiteSpeed log formatına göre uyarla
failregex = ^.*[.*] [client <HOST>:.*] .*rate limit.*$
            ^.*<HOST>.*429.*$
            ^.*<HOST>.*Too Many Requests.*$

ignoreregex =

# Log dosyası yolu
# OpenLiteSpeed access log genellikle burada
# /usr/local/lsws/logs/access.log
# Jail yapılandırması
nano /etc/fail2ban/jail.d/openlitespeed.conf
[openlitespeed-rate-limit]
enabled  = true
port     = http,https
filter   = openlitespeed
logpath  = /usr/local/lsws/logs/access.log
           /usr/local/lsws/logs/error.log
maxretry = 20
findtime = 60
bantime  = 3600
action   = iptables-multiport[name=OLS-RateLimit, port="80,443"]
           sendmail-whois[name=OLS-RateLimit, [email protected]]

[openlitespeed-brute-force]
enabled  = true
port     = http,https
filter   = openlitespeed
logpath  = /usr/local/lsws/logs/access.log
maxretry = 5
findtime = 300
bantime  = 86400

Fail2Ban’ı yeniden başlatın ve durumu kontrol edin:

# Fail2Ban'ı yeniden başlat
systemctl restart fail2ban

# Jail durumunu kontrol et
fail2ban-client status openlitespeed-rate-limit

# Engellenen IP'leri listele
fail2ban-client status openlitespeed-rate-limit | grep "Banned IP"

# Manuel olarak IP engelle (test için)
fail2ban-client set openlitespeed-rate-limit banip 1.2.3.4

# IP engelini kaldır
fail2ban-client set openlitespeed-rate-limit unbanip 1.2.3.4

OpenLiteSpeed’i Graceful Reload ile Uygulama

Yapılandırma değişikliklerini aktif bağlantıları kesmeden uygulamak için graceful reload kullanın:

# Yapılandırmayı doğrula (syntax kontrolü)
/usr/local/lsws/bin/lswsctrl configtest

# Graceful reload - aktif bağlantıları kesmez
/usr/local/lsws/bin/lswsctrl restart

# Ya da systemctl ile
systemctl reload lsws

# Tam yeniden başlatma (son çare)
systemctl restart lsws

# Log dosyalarını anlık izle
tail -f /usr/local/lsws/logs/error.log | grep -E "throttle|rate|429|limit"

Performans Etkisini Ölçme

Rate limiting kurallarının performansı etkileyip etkilemediğini ölçmek kritik. Bu scripti kullanabilirsiniz:

# ab (Apache Benchmark) ile rate limit testini yap
# Rate limit olmadan benchmark
ab -n 1000 -c 50 https://eticaret.example.com/ 2>&1 | grep -E "Requests per second|Failed"

# Rate limit devredeyken aynı testi yap
ab -n 1000 -c 50 -l https://eticaret.example.com/ 2>&1 | 
    grep -E "Requests per second|Non-2xx|Failed requests"

# Daha gerçekçi test için wrk kullanın
wrk -t12 -c400 -d30s --latency https://eticaret.example.com/

# Rate limit loglarını analiz et
awk '/429/{count[$1]++} END{for(ip in count) print count[ip], ip}' 
    /usr/local/lsws/logs/access.log | sort -rn | head -20

Yaygın Sorunlar ve Çözümleri

Saha deneyimimden bazı sık karşılaşılan sorunları paylaşayım:

Sorun 1: Meşru kullanıcılar da engelleniyor

CDN veya reverse proxy arkasındayken gerçek IP’yi göremeyebilirsiniz. Bu durumda X-Forwarded-For başlığını kullanın:

# httpd_config.conf içinde
useIpInProxyHeader   2

# Güvenilir proxy IP'lerini tanımla
trustedProxy         103.21.244.0/22, 103.22.200.0/22

Sorun 2: API istemcileri rate limit’e takılıyor

API anahtarına göre muafiyet tanımlayın:

# .htaccess veya vhconf içinde
# Belirli header taşıyan istekleri muaf tut
SetEnvIfNoCase X-API-Key "^geçerli-api-anahtarı$" NO_THROTTLE
SetEnvIf NO_THROTTLE 1 !REDIRECT_NO_THROTTLE

Sorun 3: Rate limit değerlerini dinamik olarak güncelleme

Trafik desenlerinizi analiz edip değerleri otomatik ayarlayan basit bir script:

#!/bin/bash
# Trafik yoğunluğuna göre dinamik rate limit ayarı
CURRENT_HOUR=$(date +%H)
VHOST_CONF="/usr/local/lsws/conf/vhosts/eticaret/vhconf.conf"

# Mesai saatlerinde (09:00-18:00) daha yüksek limit
if [ "$CURRENT_HOUR" -ge 9 ] && [ "$CURRENT_HOUR" -lt 18 ]; then
    DYN_LIMIT=50
    STATIC_LIMIT=300
else
    # Gece saatlerinde daha düşük limit
    DYN_LIMIT=20
    STATIC_LIMIT=100
fi

sed -i "s/dynReqPerSec.*/dynReqPerSec             $DYN_LIMIT/" $VHOST_CONF
sed -i "s/staticReqPerSec.*/staticReqPerSec          $STATIC_LIMIT/" $VHOST_CONF

# Graceful reload
/usr/local/lsws/bin/lswsctrl restart
echo "$(date): Rate limit güncellendi - Dyn: $DYN_LIMIT, Static: $STATIC_LIMIT" 
    >> /var/log/ols_rate_limit_updates.log

Sonuç

OpenLiteSpeed’in rate limiting ve bağlantı sınırlandırma özellikleri, doğru yapılandırıldığında sunucunuzu DDoS, brute force ve kaba kuvvet saldırılarına karşı ciddi ölçüde korur. Burada anlattığım katmanlı yaklaşım, yani sunucu geneli bağlantı limitleri, virtual host bazlı throttling, ModSecurity entegrasyonu ve Fail2Ban kombinasyonu, production ortamlarda gerçekten sonuç veren bir strateji.

Önemli nokta şu: Bu değerleri kopyalayıp yapıştırmak yerine kendi trafik örüntülerinizi analiz ederek başlayın. Her sitenin ihtiyacı farklı. Bir WordPress blogu için 20 eş zamanlı bağlantı yeterken, yüksek trafikli bir e-ticaret sitesi 200’e ihtiyaç duyabilir. İzleme scriptleri ve logları düzenli takip edin, alarm eşiklerini gerçek verilerle kalibre edin. Rate limiting bir kez kurup unutulan bir şey değil, sürekli izleme ve ince ayar gerektiren bir süreç.

Son olarak, herhangi bir değişikliği production’a almadan önce staging ortamında test edin. Yanlış yapılandırılmış bir rate limit, saldırganları değil meşru kullanıcıları engelleyebilir. Bu hem teknik hem de iş açısından maliyetli olur.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir