Web sunucunuza gelen trafiği izlemeye başladığınızda, gerçek kullanıcılardan çok daha fazla bot, tarayıcı ve kötü niyetli istek gördüğünüzü fark edersiniz. OpenLiteSpeed bu konuda oldukça güçlü araçlar sunuyor ancak doğru yapılandırılmadığında bu araçlar ya çok sıkı çalışarak gerçek ziyaretçileri engelliyor ya da çok gevşek kalarak sizi koruyamıyor. Bu yazıda OpenLiteSpeed üzerinde DDoS koruması ve anti-bot filtrelemeyi nasıl doğru şekilde yapılandıracağınızı, gerçek dünya senaryolarıyla birlikte ele alacağız.
OpenLiteSpeed’in Güvenlik Mimarisi
OpenLiteSpeed, LiteSpeed Enterprise’ın açık kaynak versiyonu olarak güvenlik konusunda pek çok yerleşik özellik sunar. Ancak Enterprise sürümün bazı gelişmiş özellikleri (örneğin reCAPTCHA entegrasyonu) OLS’de bulunmaz, bu yüzden bazı çözümleri manuel olarak yapılandırmak gerekir.
OLS’de güvenlik katmanları şu şekilde sıralanır:
- Bağlantı düzeyi koruması: IP bazlı rate limiting, bağlantı sayısı sınırları
- İstek düzeyi koruması: ModSecurity entegrasyonu, custom rewrite kuralları
- Uygulama düzeyi koruması: WordPress gibi CMS’lere özel kurallar
- Ağ düzeyi koruması: iptables/nftables ile entegrasyon
Gerçek bir DDoS saldırısında tek bir katmana güvenmek yeterli olmaz. Katmanlı savunma yaklaşımı burada da geçerlidir.
Temel Rate Limiting Yapılandırması
İlk adım olarak OLS admin paneli üzerinden temel bağlantı limitlerini ayarlamak gerekir. Admin paneline https://sunucuip:7080 adresinden erişebilirsiniz.
Ancak config dosyasını doğrudan düzenlemek daha hızlı ve tekrarlanabilir bir yaklaşımdır. Ana yapılandırma dosyası genellikle /usr/local/lsws/conf/httpd_config.conf konumundadır.
# OLS config dosyasını yedekle
cp /usr/local/lsws/conf/httpd_config.conf /usr/local/lsws/conf/httpd_config.conf.bak
# Mevcut bağlantı ayarlarını görüntüle
grep -n "maxConnections|perClientConnLimit|throttleRate" /usr/local/lsws/conf/httpd_config.conf
Virtual host yapılandırma dosyanıza aşağıdaki rate limiting direktiflerini ekleyin:
# /usr/local/lsws/conf/vhosts/siteniz.com/vhconf.conf dosyasini duzenle
nano /usr/local/lsws/conf/vhosts/siteniz.com/vhconf.conf
Dosyaya eklenecek temel güvenlik parametreleri:
vhssl {
renegProtection 1
}
rewrite {
enable 1
autoLoadHtaccess 1
}
# Bağlantı limitleri
perClientConnLimit {
staticReqPerSec 20
dynReqPerSec 10
outBandwidth 0
inBandwidth 0
softLimit 15
hardLimit 30
gracePeriod 15
banPeriod 300
}
Bu ayarlar şu anlama gelir:
- staticReqPerSec: Statik dosyalar için saniyede maksimum 20 istek
- dynReqPerSec: Dinamik içerik için saniyede maksimum 10 istek
- softLimit: 15 bağlantıya ulaşınca yavaşlatma başlar
- hardLimit: 30 bağlantıda kesin engelleme
- gracePeriod: 15 saniye tolerans süresi
- banPeriod: 300 saniye (5 dakika) ban süresi
ModSecurity Entegrasyonu ve OWASP Kuralları
ModSecurity, OLS ile mükemmel çalışır ve bot filtreleme için güçlü bir araçtır. Kurulum ve yapılandırma:
# Ubuntu/Debian için ModSecurity kurulumu
apt-get update
apt-get install -y libmodsecurity3 libmodsecurity-dev
# OWASP CRS kurallarını indir
cd /usr/local/lsws/
git clone https://github.com/coreruleset/coreruleset.git modsec-crs
cd modsec-crs
cp crs-setup.conf.example crs-setup.conf
# ModSecurity ana config dosyasını oluştur
mkdir -p /usr/local/lsws/conf/modsec
cp /usr/local/lsws/modsec-crs/crs-setup.conf /usr/local/lsws/conf/modsec/
ModSecurity yapılandırma dosyası:
cat > /usr/local/lsws/conf/modsec/modsecurity.conf << 'EOF'
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess Off
SecResponseBodyMimeType text/plain text/html text/xml
SecDataDir /tmp/modsec-data
SecTmpDir /tmp/modsec-tmp
SecAuditEngine RelevantOnly
SecAuditLog /usr/local/lsws/logs/modsec_audit.log
SecAuditLogParts ABIJDEFHZ
SecAuditLogType Serial
# Bot ve scraper engelleme kuralları
SecRule REQUEST_HEADERS:User-Agent "@rx (sqlmap|nikto|nessus|masscan|zgrab|gobuster|dirbuster)"
"id:1001,phase:1,deny,status:403,log,msg:'Malicious Scanner Detected'"
# Boş User-Agent engelleme
SecRule REQUEST_HEADERS:User-Agent "@rx ^$"
"id:1002,phase:1,deny,status:403,log,msg:'Empty User-Agent'"
# Aggressive crawler engelleme
SecRule REQUEST_HEADERS:User-Agent "@rx (AhrefsBot|SemrushBot|DotBot|MJ12bot)"
"id:1003,phase:1,deny,status:429,log,msg:'Aggressive Crawler Blocked'"
Include /usr/local/lsws/modsec-crs/crs-setup.conf
Include /usr/local/lsws/modsec-crs/rules/*.conf
EOF
Gerçek Dünya Senaryosu: WordPress Sitesine Yönelik Bot Saldırısı
Bir e-ticaret müşterisinin sitesinde yaşanan gerçek bir senaryoyu ele alalım. Gece 2’de sunucu yükü aniden %80’e çıktı, wp-login.php ve xmlrpc.php dosyalarına saniyede yüzlerce istek gelmeye başladı.
İlk adım: Saldırının boyutunu anlamak.
# Gerçek zamanlı erişim loglarını izle
tail -f /usr/local/lsws/logs/access.log | grep -E "wp-login|xmlrpc"
# En çok istek atan IP'leri bul
awk '{print $1}' /usr/local/lsws/logs/access.log | sort | uniq -c | sort -rn | head -20
# Son 5 dakikadaki istek sayısını hesapla
awk -v d1="$(date --date='5 minutes ago' '+%d/%b/%Y:%H:%M')"
'$4 > "["d1 {print $1}' /usr/local/lsws/logs/access.log |
sort | uniq -c | sort -rn | head -20
Bu komutların çıktısı yüzlerce farklı IP’den geldiğini gösterdi, yani dağıtık bir saldırıydı. Tek tek IP engelleme işe yaramaz. Bu durumda sanal host yapılandırmasına özel kurallar eklemek gerekiyor:
# Virtual host .htaccess veya rewrite kurallarına ekle
cat >> /usr/local/lsws/conf/vhosts/siteniz.com/vhconf.conf << 'EOF'
context /wp-login.php {
location /wp-login.php
allowBrowse 1
rewrite {
rules <<<END_RULES
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{HTTP:X-Forwarded-For} !^$
RewriteRule ^ - [F,L]
END_RULES
}
}
EOF
Daha da etkili bir yöntem olarak .htaccess tabanlı bot engelleme:
cat > /var/www/html/siteniz.com/.htaccess << 'EOF'
# WordPress xmlrpc.php koruması
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
# wp-login.php rate limiting ve IP kısıtlama
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 192.168.1.0/24
Allow from senin.ofis.ip.adresin
</Files>
# Kötü botları engelle
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (;|<|>|'|"|)|(|%0A|%0D|%22|%27|%28|%3C|%3E|%00).*(libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader) [NC]
RewriteRule .* - [F,L]
EOF
iptables ile Ağ Düzeyi DDoS Koruması
OLS seviyesinde yapılan korumanın yanı sıra ağ katmanında da önlem almak kritik önem taşır. Özellikle SYN flood ve UDP flood saldırılarında iptables kuralları sunucuyu korur:
#!/bin/bash
# /usr/local/bin/ddos-protection.sh
# Mevcut kuralları temizle
iptables -F
iptables -X
iptables -Z
# Varsayılan politikaları ayarla
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Localhost trafiğine izin ver
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Kurulu bağlantılara izin ver
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH erişimi (portunu değiştirdiyseniz güncelleyin)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP/HTTPS için rate limiting
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 --connlimit-mask 32 -j DROP
iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 50 --connlimit-mask 32 -j DROP
# SYN flood koruması
iptables -A INPUT -p tcp --syn -m limit --limit 30/s --limit-burst 60 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# ICMP flood koruması
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp -j DROP
# HTTP ve HTTPS trafiğine izin ver
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# OLS admin paneli (sadece güvenilir IP'den)
iptables -A INPUT -p tcp --dport 7080 -s senin.guvenilir.ip.adresin -j ACCEPT
iptables -A INPUT -p tcp --dport 7080 -j DROP
# Kuralları kaydet
iptables-save > /etc/iptables/rules.v4
echo "DDoS koruma kuralları uygulandı."
Bu scripti çalıştırılabilir yapın ve sistem başlangıcında otomatik yüklenecek şekilde ayarlayın:
chmod +x /usr/local/bin/ddos-protection.sh
bash /usr/local/bin/ddos-protection.sh
# Systemd service olarak kaydet
cat > /etc/systemd/system/ddos-protection.service << 'EOF'
[Unit]
Description=DDoS Protection Rules
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/ddos-protection.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl enable ddos-protection
systemctl start ddos-protection
Fail2Ban ile Dinamik IP Engelleme
Statik iptables kurallarının ötesinde, Fail2Ban OLS loglarını izleyerek otomatik olarak kötü niyetli IP’leri engelleyebilir:
# Fail2Ban kurulumu
apt-get install -y fail2ban
# OLS için özel jail yapılandırması
cat > /etc/fail2ban/jail.d/openlitespeed.conf << 'EOF'
[openlitespeed-auth]
enabled = true
port = http,https
filter = openlitespeed-auth
logpath = /usr/local/lsws/logs/access.log
maxretry = 5
findtime = 300
bantime = 3600
[openlitespeed-badbots]
enabled = true
port = http,https
filter = openlitespeed-badbots
logpath = /usr/local/lsws/logs/access.log
maxretry = 2
findtime = 60
bantime = 86400
[openlitespeed-ddos]
enabled = true
port = http,https
filter = openlitespeed-ddos
logpath = /usr/local/lsws/logs/access.log
maxretry = 100
findtime = 10
bantime = 7200
EOF
# OLS bad bot filtresi
cat > /etc/fail2ban/filter.d/openlitespeed-badbots.conf << 'EOF'
[Definition]
failregex = ^<HOST> .* "(GET|POST|HEAD).*HTTP.*" (403|404|429) .*$
^<HOST> .* ".*sqlmap.*" .*$
^<HOST> .* ".*nikto.*" .*$
^<HOST> .* ".*masscan.*" .*$
ignoreregex = ^<HOST> .* "GET /(favicon.ico|robots.txt) HTTP.*" 404 .*$
EOF
# OLS DDoS filtresi
cat > /etc/fail2ban/filter.d/openlitespeed-ddos.conf << 'EOF'
[Definition]
failregex = ^<HOST> .*$
ignoreregex =
EOF
systemctl restart fail2ban
systemctl enable fail2ban
# Fail2ban durumunu kontrol et
fail2ban-client status
fail2ban-client status openlitespeed-badbots
GeoIP ile Ülke Bazlı Engelleme
Eğer siteniz yalnızca belirli ülkelere hizmet veriyorsa, diğer ülkelerden gelen trafiği tamamen engellemek DDoS saldırılarının büyük bölümünü bertaraf eder:
# MaxMind GeoLite2 veritabanını indir (ücretsiz kayıt gerekli)
apt-get install -y libmaxminddb0 libmaxminddb-dev mmdb-bin
# GeoIP veritabanını güncelle scripti
cat > /usr/local/bin/update-geoip.sh << 'EOF'
#!/bin/bash
GEOIP_DIR="/usr/local/lsws/conf/geoip"
mkdir -p $GEOIP_DIR
# MaxMind lisans anahtarınızı buraya girin
LICENSE_KEY="YOUR_LICENSE_KEY"
wget -O /tmp/GeoLite2-Country.tar.gz
"https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=${LICENSE_KEY}&suffix=tar.gz"
tar -xzf /tmp/GeoLite2-Country.tar.gz -C /tmp/
cp /tmp/GeoLite2-Country_*/GeoLite2-Country.mmdb $GEOIP_DIR/
rm -rf /tmp/GeoLite2-Country*
echo "GeoIP veritabanı güncellendi: $(date)"
EOF
chmod +x /usr/local/bin/update-geoip.sh
OLS rewrite kurallarıyla GeoIP entegrasyonu:
# Virtual host rewrite kurallarına ekle
cat >> /var/www/html/siteniz.com/.htaccess << 'EOF'
# GeoIP bazlı engelleme (sadece TR ve US'e izin ver örneği)
RewriteEngine On
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(TR|US|DE|GB)$
RewriteRule ^(.*)$ - [F,L]
EOF
Gerçek Zamanlı İzleme ve Alarm Scripti
Saldırıları erken tespit etmek için basit ama etkili bir monitoring scripti:
cat > /usr/local/bin/ols-monitor.sh << 'EOF'
#!/bin/bash
LOG_FILE="/usr/local/lsws/logs/access.log"
THRESHOLD_RPS=500
THRESHOLD_4XX=100
ALERT_EMAIL="[email protected]"
ALERT_LOG="/var/log/ols-security-alerts.log"
# Son 60 saniyedeki istek sayısını hesapla
CURRENT_RPS=$(awk -v d1="$(date --date='1 minutes ago' '+%d/%b/%Y:%H:%M')"
'$4 > "["d1 {count++} END {print count}' $LOG_FILE)
# 4xx hata sayısını hesapla
ERROR_COUNT=$(awk -v d1="$(date --date='1 minutes ago' '+%d/%b/%Y:%H:%M')"
'$4 > "["d1 && $9 ~ /^4/ {count++} END {print count}' $LOG_FILE)
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# RPS eşiğini aştıysa alarm ver
if [ "$CURRENT_RPS" -gt "$THRESHOLD_RPS" ]; then
MESSAGE="[ALARM] $TIMESTAMP - Yüksek RPS tespit edildi: $CURRENT_RPS istek/dk"
echo "$MESSAGE" >> $ALERT_LOG
echo "$MESSAGE" | mail -s "OLS DDoS Alarmı" $ALERT_EMAIL
# En çok istek atan 5 IP'yi logla
echo "Top 5 IP:" >> $ALERT_LOG
awk -v d1="$(date --date='1 minutes ago' '+%d/%b/%Y:%H:%M')"
'$4 > "["d1 {print $1}' $LOG_FILE |
sort | uniq -c | sort -rn | head -5 >> $ALERT_LOG
fi
# 4xx eşiğini aştıysa alarm ver
if [ "$ERROR_COUNT" -gt "$THRESHOLD_4XX" ]; then
MESSAGE="[UYARI] $TIMESTAMP - Yüksek 4xx hata oranı: $ERROR_COUNT hata/dk"
echo "$MESSAGE" >> $ALERT_LOG
fi
echo "$TIMESTAMP - RPS: $CURRENT_RPS, 4xx: $ERROR_COUNT" >> /var/log/ols-stats.log
EOF
chmod +x /usr/local/bin/ols-monitor.sh
# Cron'a ekle, her dakika çalışsın
echo "* * * * * root /usr/local/bin/ols-monitor.sh" >> /etc/crontab
Anti-Bot için Honeypot Tekniği
Botları gerçek kullanıcılardan ayırt etmenin en etkili yöntemlerinden biri honeypot tekniğidir. Gerçek kullanıcılar tarayıcıları CSS’i işlediği için göremez ve tıklamaz, botlar ise HTML’i doğrudan parse ettiği için bu tuzağa düşer:
# WordPress için honeypot ekleyen .htaccess kuralı
cat >> /var/www/html/siteniz.com/.htaccess << 'EOF'
# Honeypot URL'ye erişenleri engelle
RewriteEngine On
RewriteRule ^bot-trap-url-buraya$ - [R=403,L]
# Bu URL'ye erişen IP'leri geçici olarak ban'la
RewriteCond %{REQUEST_URI} ^/gizli-sayfa-botu-yakala$
RewriteRule ^ - [F]
EOF
HTML tarafında honeypot form alanı eklemek için WordPress functions.php’ye veya tema dosyalarınıza şunu ekleyebilirsiniz. Ancak CSS ile gizlenmiş bir input alanı, gerçek kullanıcılar tarafından görülmez:
# Nginx tarzı honeypot loglama için OLS'de özel log formatı
# httpd_config.conf'a ekle
accessLog /usr/local/lsws/logs/bot-access.log {
logFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i""
logHeaders 0
rollingSize 100M
compressArchive 1
}
Güvenlik Duvarı Kurallarını Test Etme
Yaptığınız değişikliklerin gerçekten çalışıp çalışmadığını test etmek kritik önem taşır. Asla production ortamında test etmeyin, önce staging kullanın:
# Rate limiting testini yapmak için
# Dikkat: Bunu sadece kendi sunucunuzda test edin
for i in {1..50}; do
curl -s -o /dev/null -w "%{http_code}n" https://siteniz.com/
sleep 0.1
done
# ModSecurity kurallarını test et
curl -A "sqlmap/1.0" https://siteniz.com/ -v 2>&1 | grep "HTTP/"
# Boş User-Agent testi
curl -A "" https://siteniz.com/ -v 2>&1 | grep "HTTP/"
# Fail2ban'ın çalışıp çalışmadığını kontrol et
fail2ban-client status openlitespeed-badbots
# Engellenen IP'leri listele
fail2ban-client banned
# Yanlışlıkla engellenmiş IP'yi serbest bırak
fail2ban-client set openlitespeed-badbots unbanip 1.2.3.4
Yapılandırma Sonrası Kontrol Listesi
Tüm adımları uyguladıktan sonra şunları mutlaka kontrol edin:
- OLS log dosyaları:
/usr/local/lsws/logs/dizininde hata var mı kontrol edin - ModSecurity audit log: Yanlış pozitifleri izlemek için
tail -f /usr/local/lsws/logs/modsec_audit.logçalıştırın - Fail2Ban durumu:
fail2ban-client statusile tüm jail’lerin aktif olduğunu doğrulayın - iptables kuralları:
iptables -L -n -vile kuralların yüklendiğini kontrol edin - Gerçek kullanıcı testi: Sitenizi farklı konumlardan, farklı cihazlardan test edin
- Google bot izin kontrolü: Google Search Console’da crawl hatası var mı bakın
- Performans etkisi: ModSecurity kuralları sunucu yükünü artırabilir,
topile CPU kullanımını izleyin - Backup doğrulama: Yapılandırma yedeklerinin alındığını kontrol edin
- Alarm sistemi: Test e-postası göndererek alarm sisteminin çalıştığını doğrulayın
Sonuç
OpenLiteSpeed üzerinde etkili bir DDoS koruması ve bot filtreleme sistemi kurmak, tek bir aracı yapılandırmaktan çok farklıdır. Ağ katmanından uygulama katmanına kadar uzanan savunma hattı oluşturmak gerekir. Bu yazıda ele aldığımız yaklaşımda OLS’nin yerleşik rate limiting özelliklerini, ModSecurity kurallarını, iptables tabanlı ağ korumasını, Fail2Ban ile dinamik engellemeyi ve GeoIP filtrelemeyi bir arada kullandık.
Pratikte en önemli nokta şu: Kurallarınız ne kadar katı olursa yanlış pozitif riski o kadar artar. Özellikle ModSecurity kurallarını ilk devreye alırken SecRuleEngine DetectionOnly modunda başlayın, logları inceleyin ve gerçek kullanıcıları etkileyecek kuralları tespit edip düzelttikten sonra On moduna geçin. Fail2Ban banTime değerlerini de kademeli artırmak iyi bir yaklaşımdır.
Son olarak, hiçbir yapılandırma %100 güvenlik sağlamaz. Büyük ölçekli DDoS saldırılarına karşı Cloudflare veya benzeri bir CDN/DDoS koruma servisi kullanmak, sunucu düzeyindeki korumayı tamamlayan en mantıklı stratejidir. Sunucu tarafı koruma ile CDN tabanlı korumayı birlikte kullandığınızda hem maliyet açısından hem de etkinlik açısından en iyi sonucu elde edersiniz.