Her sunucu, er ya da geç, sel (flooding) saldırılarına maruz kalır, bu da hizmetler üzerindeki yükün artmasına ve kaynak kullanımının yükselmesine yol açar. İnternet üzerindeki sayısız bot, güvenlik açıklarını bulmak ve veri toplamak amacıyla web sitelerini tarar.
Bu botlar kötü niyetli davranışlar sergiler ve sunucu kaynaklarını onlara harcamamak için engellenmeleri gerekir.
Bu makalede, sel saldırılarıyla mücadele etmenin yollarından birini özel olarak inceliyoruz. DDoS saldırılarıyla mücadele etmek için başka hizmetler ve yöntemler kullanılır.
Bu tür isteklerin bir örneği:
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /aa.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /file.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /file.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /wp-file.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /wp-file.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /k.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /k.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /al.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /al.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /wp- HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /wp- HTTP/1.1" 404 48273 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /admin.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /admin.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /file2.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /file2.php HTTP/1.1" 404 27 "-" "-"
Logdan da anlaşılacağı üzere, bot saniyede yaklaşık 9 istek gönderiyor ki bu oldukça yüksek bir sayı. Özellikle farklı IP adreslerine sahip birden fazla bot olabileceği düşünüldüğünde, bu durum sanal bir sunucu üzerinde önemli bir yük oluşturabilir.
Görevimiz, statik dosyaları hariç tutarak çok sayıda düzenli istek yapan IP adreslerini engellemektir – sadece dinamik istekleri sayacağız, çünkü yükü oluşturanlar onlardır.
1. Fail2ban Kurulumu
apt install fail2ban
2. Yapılandırma
nano /etc/fail2ban/jail.local
[DEFAULT]
# Ana ayarlar
ignoreip = 127.0.0.1/8 ::1
bantime = 3600
findtime = 600
maxretry = 200
# E-posta ayarları
destemail = corp@domain.tld
sender = fail2ban@domain.tld
sendername = Fail2Ban
mta = sendmail
# Varsayılan eylem (e-posta gönderimi ile)
action = %(action_mwl)s
[nginx-flood]
enabled = true
port = http,https
filter = nginx-flood
logpath = /var/log/nginx/*access*.log
maxretry = 200
findtime = 60
bantime = 3600
# eylem DEFAULT'tan miras alındığı için tekrar etmeye gerek yoktur
2.1 Filtrenin Kendisi
nano /etc/fail2ban/filter.d/nginx-flood.conf
[Definition]
# Statik dosyaları sayım dışı bırak
failregex = ^<HOST> -.*"(GET|POST|HEAD) (?!.*\.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|eot|svg|pdf|txt|xml)(\?.*)?$).* HTTP/\d\.\d".*
ignoreregex =
datepattern = ^[^\[]*\[({DATE})\s+({TIME})\s+[^\]]*\]
2.2 Değişiklikler
E-posta adresini kendinize ait olanla değiştirmeyi unutmayın:
destemail = corp@domain.tld
sender = fail2ban@domain.tld
2.3 Tetikleme Eşiği
Gerektiğinde, yanlış pozitifleri önlemek için parametreleri ihtiyaçlarınıza göre ayarlayın:
maxretry = 200
findtime = 60
bantime = 3600
3. Hizmetleri Başlatma
systemctl restart fail2ban
systemctl enable fail2ban
4. Görüntüleme ve Yönetim
4.1 Engellenen IP'leri Görüntüleme
iptables için
iptables -L -n
fail2ban için
fail2ban-client status nginx-flood
4.2 Test
Geçici olarak bir test IP'sini engelleme listesine ekleme
fail2ban-client set nginx-flood banip 1.2.3.4
Engellenip engellenmediğini ve e-postanın alınıp alınmadığını kontrol etme
fail2ban-client set nginx-flood unbanip 1.2.3.4