CSF Firewall Performans Optimizasyonu ve Büyük Sunucu Ortamları

Yüksek trafikli bir sunucuda CSF’nin varsayılan ayarlarla çalışması, zamanla ciddi performans sorunlarına yol açabilir. Özellikle günde milyonlarca paket işleyen sunucularda, yanlış yapılandırılmış bir güvenlik duvarı, saldırıları engellemek bir yana, meşru trafiği yavaşlatarak sistemin kendisi için bir darboğaza dönüşebilir. Bu yazıda CSF’yi büyük ölçekli ortamlara nasıl uyarlayacağınızı, performans kaynaklarını nasıl azaltacağınızı ve gerçek dünya senaryolarında hangi optimizasyon tekniklerinin işe yaradığını ele alacağız.

CSF Performansını Etkileyen Temel Faktörler

CSF, arka planda iptables ve ip6tables kurallarını yönetir. Yüzlerce bin kural içeren bir kural setini her güncellediğinizde, iptables’ın tüm kural tablosunu yeniden yüklemesi gerekir. Bu işlem, kural sayısı arttıkça doğrusal değil, üstel bir şekilde yavaşlar.

Performans sorunlarının temel kaynakları şunlardır:

  • DENY_IP_LIMIT: Çok büyük engellenmiş IP listeleri, kural yeniden yükleme sürelerini dakikalara taşıyabilir
  • LF_TRIGGER değerleri: Çok hassas ayarlanmış tetikleyiciler, gereksiz yere sürekli kural yeniden yüklenmesine neden olur
  • Syslog yazma sıklığı: Her olayın diske yazılması, yüksek trafikte I/O darboğazı yaratır
  • ipset kullanımının devre dışı olması: Varsayılan iptables kuralları yerine ipset kullanmak, büyük IP listelerinde çarpıcı hız farkı yaratır
  • Gereksiz aktif modüller: Kullanılmayan LFD modülleri arka planda CPU tüketir

ipset Entegrasyonu ile Dramatik Hız Kazanımı

CSF’nin en önemli optimizasyon noktası ipset entegrasyonudur. Normalde CSF, her engellenen IP için ayrı bir iptables kuralı oluşturur. 10.000 engellenmiş IP için 10.000 ayrı kural demektir ve bir paket geldiğinde bu kuralların tümü sırayla kontrol edilir.

ipset ile bu IP’ler bir hash tablosuna alınır ve paket eşleştirmesi O(1) karmaşıklığıyla, yani sabit sürede gerçekleşir.

Önce ipset’in kurulu olduğunu doğrulayın:

# ipset kurulumu kontrol
which ipset
ipset --version

# Debian/Ubuntu
apt-get install ipset

# CentOS/RHEL
yum install ipset

# ipset kernel modülünü yükle
modprobe ip_set
modprobe ip_set_hash_ip
lsmod | grep ip_set

CSF yapılandırmasında ipset’i etkinleştirin:

# /etc/csf/csf.conf içinde
IPSET = "1"
IPSET_HASHSIZE = "1024"
IPSET_MAXELEM = "65536"

# Büyük IP listeleriniz varsa maxelem değerini artırın
# 100.000+ IP için
IPSET_MAXELEM = "131072"

Değişikliği uyguladıktan sonra CSF’yi yeniden başlatın ve farkı görmek için kural sayısını karşılaştırın:

# ipset öncesi kural sayısı
iptables -L INPUT | wc -l

# CSF yeniden başlat
csf -r

# ipset sonrası - dramatik düşüş göreceksiniz
iptables -L INPUT | wc -l

# ipset listelerini görüntüle
ipset list | head -50
ipset list csf_temp_deny | wc -l

Gerçek bir senaryoda 50.000 engellenmiş IP ile yaptığım testlerde, ipset olmadan kural yeniden yükleme 45 saniye sürerken, ipset ile bu süre 3 saniyenin altına düştü.

DENY_IP_LIMIT ve Geçici Ban Yönetimi

CSF’nin csf.deny dosyası büyüdükçe her şey yavaşlar. Buradaki en yaygın hata, geçici banların kalıcı hale gelmesi ve listenin kontrolsüzce büyümesidir.

# Mevcut deny listesi boyutunu kontrol et
wc -l /etc/csf/csf.deny

# IP başına satır sayısı ve yorum satırlarını filtrele
grep -v "^#" /etc/csf/csf.deny | grep -v "^$" | wc -l

# En çok tekrar eden /24 bloklarını bul
grep -v "^#" /etc/csf/csf.deny | cut -d. -f1-3 | sort | uniq -c | sort -rn | head -20

csf.conf içindeki kritik limitler:

# /etc/csf/csf.conf

# Maksimum kalıcı ban sayısı - bunu makul tutun
DENY_IP_LIMIT = "200"

# Geçici ban süresi (saniye) - 86400 = 24 saat
CT_BLOCK_TIME = "86400"

# Geçici ban maksimum sayısı
DENY_TEMP_IP_LIMIT = "1000"

# Belirli bir süre sonra geçici banları temizle
LF_EXPIRE = "3600"

# Tekrar ban sayısı - bu IP'yi kalıcı ban listesine al
LF_PERMBLOCK_COUNT = "4"
LF_PERMBLOCK_INTERVAL = "86400"
LF_PERMBLOCK_DURATION = "0"  # 0 = kalıcı

Büyük sunucularda geçici ban listesini düzenli temizlemek kritiktir. Bunun için bir cron job oluşturun:

# /etc/cron.d/csf-cleanup
# Her gece saat 02:00'de çalışır
0 2 * * * root /usr/local/sbin/csf -tf && /usr/local/sbin/csf -r

# Alternatif: sadece 7 günden eski kalıcı banları temizle
0 3 * * 0 root grep -v "^#" /etc/csf/csf.deny | 
  awk -v date="$(date -d '7 days ago' +%s)" 
  'BEGIN{FS="|"} $2 != "" && $2 < date {print $1}' | 
  xargs -I{} /usr/local/sbin/csf -dr {}

LFD (Login Failure Daemon) Optimizasyonu

LFD, sürekli log dosyalarını tarayarak başarısız giriş denemelerini tespit eder. Yüksek trafikli sunucularda bu tarama CPU’yu ciddi ölçüde tüketebilir.

# LFD'nin CPU kullanımını izle
top -p $(pgrep lfd) -b -n 5 -d 2

# LFD log analizi
tail -f /var/log/lfd.log | grep -E "(Blocked|Unblocked|triggers)"

csf.conf’ta LFD hassasiyetini optimize edin:

# Daha az agresif tarama aralığı (saniye)
LF_DAEMON = "1"

# Sshd brute force - varsayılan 5, yüksek trafikte 10-15 yapın
LF_SSHD = "10"
LF_SSHD_INTERVAL = "300"

# FTP
LF_FTPD = "10"
LF_FTPD_INTERVAL = "300"

# SMTP Auth
LF_SMTPAUTH = "10"
LF_SMTPAUTH_INTERVAL = "300"

# HTTP/cPanel brute force
LF_CPANEL = "15"
LF_CPANEL_INTERVAL = "300"

# POP3/IMAP
LF_POP3D = "15"
LF_POP3D_INTERVAL = "300"
LF_IMAPD = "15"
LF_IMAPD_INTERVAL = "300"

Log Dosyası Optimizasyonu

LFD’nin hangi log dosyalarını tarayacağını belirleyebilirsiniz. Gereksiz log taramalarını kapatmak CPU tasarrufu sağlar:

# /etc/csf/csf.conf içinde kullanılmayan servisleri kapat
LF_WEBMIN = "0"        # Webmin kullanmıyorsanız
LF_DIRECTADMIN = "0"   # DirectAdmin yoksa
LF_CUSTOM1 = ""        # Özel log 1 - boş bırakın gereksizse
LF_CUSTOM2 = ""        # Özel log 2

# Log tarama optimizasyonu
LF_PARSE = "5"         # Saniyede maksimum tarama sayısı

Bağlantı İzleme (Connection Tracking) Optimizasyonu

Yüksek trafikli sunucularda bağlantı izleme tablosu dolabilir. Bu durum “nf_conntrack: table full, dropping packet” hatasına yol açar.

# Mevcut conntrack durumu
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max

# Conntrack istatistikleri
conntrack -S

# Mevcut bağlantıları listele
conntrack -L | wc -l

sysctl optimizasyonlarını uygulayın:

# /etc/sysctl.d/99-csf-optimize.conf

# Conntrack tablosu boyutunu artır
net.netfilter.nf_conntrack_max = 524288
net.netfilter.nf_conntrack_buckets = 131072

# Zaman aşımı değerlerini optimize et
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 120

# İzleme boyutu için hash boyutu
net.netfilter.nf_conntrack_buckets = 65536

# Sysctl uygula
sysctl -p /etc/sysctl.d/99-csf-optimize.conf

CSF tarafındaki bağlantı izleme ayarları:

# /etc/csf/csf.conf

# Bağlantı takibi - yüksek trafikte dikkatli ayarlayın
CT_LIMIT = "300"          # IP başına maksimum bağlantı
CT_INTERVAL = "30"        # Kontrol aralığı (saniye)
CT_PORTS = ""             # Tüm portları izle (belirli portlar için: "80,443")
CT_BLOCK_TIME = "1800"    # Ban süresi
CT_SKIP_LOCAL = "1"       # Lokal bağlantıları atla

# SYN flood koruması
SYNFLOOD = "1"
SYNFLOOD_RATE = "100/s"
SYNFLOOD_BURST = "150"

Port Knocking ve Whitelist Optimizasyonu

Güvenilir IP’leri whitelist’e almak, bu IP’lerden gelen trafiğin kural kontrollerini atlayarak doğrudan geçmesini sağlar. Özellikle monitoring sistemleri, CDN IP’leri ve ofis IP’leri için kritiktir.

# Whitelist'e toplu IP ekleme
# Cloudflare IP'lerini whitelist'e ekle
cat > /tmp/cloudflare_ips.txt << 'EOF'
103.21.244.0/22 # Cloudflare
103.22.200.0/22 # Cloudflare
103.31.4.0/22   # Cloudflare
104.16.0.0/13   # Cloudflare
104.24.0.0/14   # Cloudflare
108.162.192.0/18 # Cloudflare
131.0.72.0/22   # Cloudflare
141.101.64.0/18 # Cloudflare
162.158.0.0/15  # Cloudflare
172.64.0.0/13   # Cloudflare
173.245.48.0/20 # Cloudflare
188.114.96.0/20 # Cloudflare
190.93.240.0/20 # Cloudflare
197.234.240.0/22 # Cloudflare
198.41.128.0/17 # Cloudflare
EOF

# Dosyayı csf.allow'a ekle
while read -r line; do
  ip=$(echo "$line" | awk '{print $1}')
  comment=$(echo "$line" | awk '{$1=""; print $0}' | xargs)
  echo "${ip} # ${comment}" >> /etc/csf/csf.allow
done < /tmp/cloudflare_ips.txt

csf -r

Büyük Sunucularda CSF Kural Yapısını İnceleme

Kural yapısını düzenli aralıklarla denetlemek, performans sorunlarını proaktif olarak önler:

#!/bin/bash
# /usr/local/bin/csf-health-check.sh
# CSF sağlık kontrolü scripti

echo "=== CSF Performans Raporu ==="
echo "Tarih: $(date)"
echo ""

echo "--- Kural Sayıları ---"
echo "INPUT kuralları: $(iptables -L INPUT | wc -l)"
echo "OUTPUT kuralları: $(iptables -L OUTPUT | wc -l)"
echo "FORWARD kuralları: $(iptables -L FORWARD | wc -l)"
echo ""

echo "--- Engelleme Listeleri ---"
echo "Kalıcı engelli IP: $(grep -v '^#' /etc/csf/csf.deny | grep -v '^$' | wc -l)"
echo "Geçici engelli IP: $(csf -t | wc -l)"
echo "Whitelist'teki IP: $(grep -v '^#' /etc/csf/csf.allow | grep -v '^$' | wc -l)"
echo ""

echo "--- Conntrack Durumu ---"
current=$(cat /proc/sys/net/netfilter/nf_conntrack_count)
max=$(cat /proc/sys/net/netfilter/nf_conntrack_max)
percent=$((current * 100 / max))
echo "Kullanılan: $current / $max (%$percent)"

if [ $percent -gt 80 ]; then
  echo "UYARI: Conntrack tablosu %80'in üzerinde!"
fi
echo ""

echo "--- LFD Durumu ---"
echo "LFD PID: $(pgrep lfd)"
echo "LFD CPU: $(ps -p $(pgrep lfd) -o %cpu --no-headers 2>/dev/null)"
echo ""

echo "--- ipset Listeleri ---"
ipset list -n 2>/dev/null | while read listname; do
  count=$(ipset list "$listname" | grep -c "^[0-9]")
  echo "$listname: $count eleman"
done

echo "=== Rapor Tamamlandi ==="
# Scripti çalıştırılabilir yap ve cron'a ekle
chmod +x /usr/local/bin/csf-health-check.sh

# Her saat başı çalıştır ve logla
echo "0 * * * * root /usr/local/bin/csf-health-check.sh >> /var/log/csf-health.log 2>&1" 
  >> /etc/cron.d/csf-health

Gerçek Dünya Senaryosu: E-Ticaret Sunucusu Optimizasyonu

Bir e-ticaret müşterisinin sunucusunda yaşadığım durumu aktarayım. Sunucu günde yaklaşık 2 milyon HTTP isteği alıyor, 150.000 unique IP’ye hizmet veriyordu. CSF varsayılan ayarlarla çalışıyordu ve zaman zaman “csf -r” komutu 90 saniyeye kadar çıkıyordu. Bu süre zarfında yeni bağlantılar kabul edilmiyordu.

Sorunu tespit etme süreci:

# Kural yeniden yükleme süresini ölç
time csf -r

# Çıktı: real 1m34.281s - felaket!

# Deny listesi boyutu
wc -l /etc/csf/csf.deny
# 187432 satır - sorunun kaynağı bu

# ipset durumu
grep "IPSET" /etc/csf/csf.conf
# IPSET = "0" - kapalıydı!

Uygulanan çözümler:

# 1. ipset'i etkinleştir
sed -i 's/^IPSET = "0"/IPSET = "1"/' /etc/csf/csf.conf
sed -i 's/^IPSET_MAXELEM = .*/IPSET_MAXELEM = "262144"/' /etc/csf/csf.conf

# 2. Deny listesini temizle - sadece son 30 günün IP'lerini tut
cp /etc/csf/csf.deny /etc/csf/csf.deny.backup.$(date +%Y%m%d)

# 30 günden eski kalıcı banları tespit et (CSF yorum satırlarında tarih tutar)
grep "^#" /etc/csf/csf.deny | grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" | 
  awk -v cutoff=$(date -d '30 days ago' +%Y-%m-%d) '$0 < cutoff' | head -20

# 3. Limit değerlerini ayarla
sed -i 's/^DENY_IP_LIMIT = .*/DENY_IP_LIMIT = "500"/' /etc/csf/csf.conf
sed -i 's/^DENY_TEMP_IP_LIMIT = .*/DENY_TEMP_IP_LIMIT = "2000"/' /etc/csf/csf.conf

# 4. Sonucu ölç
time csf -r
# Çıktı: real 0m2.847s - 94% iyileşme!

CSF ile Birlikte fail2ban Kullanımı

Büyük sunucularda CSF ve fail2ban’i birlikte kullanmak yerine, birini tercih etmek daha mantıklıdır. Ancak zorunlu durumlarda çakışmaları önlemek için dikkatli olunmalıdır:

# fail2ban'in kendi iptables kuralları oluşturmasını engelle
# /etc/fail2ban/action.d/iptables-common.conf içinde
# CSF zaten yönetiyorsa, fail2ban'i sadece log analizi için kullan

# fail2ban ban işlemini CSF'ye devret
# /etc/fail2ban/action.d/csf.conf
[Definition]
actionban = csf -d <ip> "fail2ban: <name>"
actionunban = csf -dr <ip>

# fail2ban jail'de CSF action kullan
# /etc/fail2ban/jail.local
[sshd]
enabled = true
action = csf

Monitoring ve Alerting

CSF’nin performansını sürekli izlemek için bir Prometheus exporter veya basit bir script kullanan Nagios check yazabilirsiniz:

#!/bin/bash
# /usr/local/bin/check_csf_performance.sh
# Nagios/Zabbix uyumlu CSF kontrol scripti

WARNING_THRESHOLD=80
CRITICAL_THRESHOLD=95

# Conntrack doluluk oranı
current=$(cat /proc/sys/net/netfilter/nf_conntrack_count)
max=$(cat /proc/sys/net/netfilter/nf_conntrack_max)
percent=$((current * 100 / max))

# Deny listesi büyüklüğü
deny_count=$(grep -v "^#" /etc/csf/csf.deny | grep -v "^$" | wc -l)

# LFD çalışıyor mu?
lfd_running=$(pgrep -x lfd > /dev/null && echo 1 || echo 0)

if [ $lfd_running -eq 0 ]; then
  echo "CRITICAL: LFD servisi calısmiyor!"
  exit 2
fi

if [ $percent -ge $CRITICAL_THRESHOLD ]; then
  echo "CRITICAL: Conntrack %$percent dolu ($current/$max) | deny_count=$deny_count"
  exit 2
elif [ $percent -ge $WARNING_THRESHOLD ]; then
  echo "WARNING: Conntrack %$percent dolu ($current/$max) | deny_count=$deny_count"
  exit 1
else
  echo "OK: Conntrack %$percent ($current/$max), Deny listesi: $deny_count IP | conntrack_pct=$percent deny_count=$deny_count"
  exit 0
fi

Cluster Ortamlarında CSF Senkronizasyonu

Birden fazla sunucu olan ortamlarda, engellenen IP’lerin tüm sunuculara senkronize edilmesi gerekir. CSF’nin yerleşik cluster desteğini kullanalım:

# /etc/csf/csf.conf içinde cluster'ı etkinleştir
CLUSTER_MASTER = ""           # Master sunucu IP
CLUSTER_SENDTO = ""           # Slave sunucular (virgülle ayrılmış)
CLUSTER_RECVFROM = ""         # Kabul edilecek sunucular
CLUSTER_PORT = "7777"         # Cluster iletişim portu
CLUSTER_KEY = ""              # Güvenlik anahtarı (csf -k ile oluşturun)

# Yeni cluster anahtarı oluştur
csf -k

# Örnek yapılandırma - Master sunucu (192.168.1.10)
sed -i 's/^CLUSTER_SENDTO = .*/CLUSTER_SENDTO = "192.168.1.11,192.168.1.12"/' /etc/csf/csf.conf

# Slave sunucu (192.168.1.11)
sed -i 's/^CLUSTER_RECVFROM = .*/CLUSTER_RECVFROM = "192.168.1.10"/' /etc/csf/csf.conf

# Senkronizasyon testi
csf --cping    # Cluster ping
csf --csync    # Manuel senkronizasyon

Sonuç

CSF optimizasyonu tek seferlik bir iş değil, sürekli bakım gerektiren bir süreçtir. Önerilerimi özetleyecek olursam:

  • ipset’i mutlaka etkinleştirin: 100’den fazla engellenmiş IP’niz varsa bu tek değişiklik bile performansı katlayarak artırır
  • Deny listesini düzenli temizleyin: Aylık temizlik rutini oluşturun, eski ve alakasız banları kaldırın
  • LFD hassasiyetini trafik hacminize göre ayarlayın: Çok agresif tetikleyiciler hem meşru kullanıcıları engeller hem de CPU tüketir
  • Conntrack tablosunu izleyin: Doluluk oranı %80’i geçmeye başlarsa hem sysctl hem de CSF ayarlarını gözden geçirin
  • Whitelist’i güncel tutun: Monitoring sistemleri, CDN’ler ve güvenilir kaynaklardaki değişiklikleri takip edin
  • Sağlık kontrol scriptlerini otomatize edin: Sorunu siz fark etmeden önce sistemin sizi uyarmasını sağlayın

En kritik kural şu: Büyük bir değişiklik yapmadan önce mutlaka mevcut yapılandırmanızı yedekleyin ve değişiklikleri önce test ortamında deneyin. CSF yanlış yapılandırıldığında kendinizi sunucudan kilitleyebilirsiniz, ki bu hiç eğlenceli değildir.

Yorum yapın