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.
