Sunucunu yöneten herkesin er ya da geç karşılaştığı bir durum var: Brute force saldırıları. fail2ban bu saldırıları güzel bir şekilde yakalayıp engelliyor, ama asıl sinir bozucu olan şu ki bazı saldırganlar engellendikten sonra tekrar tekrar dönüyor. IP ban süresi doluyor, aynı IP yeniden bağlanmaya çalışıyor, yeniden banlıyor, süre bitiyor, tekrar geliyor. Bu döngü hem log dosyalarını dolduruyor hem de sistem kaynaklarını gereksiz yere tüketiyor. İşte tam bu noktada Recidive Jail devreye giriyor.
Recidive Jail Nedir?
Fail2ban’ın standart çalışma mantığı şu şekilde: Bir IP belirli sayıda başarısız deneme yaparsa, belirlenen süre boyunca engellenir. Süre dolunca ban kalkar. Basit ve etkili, ama yeterli mi? Hayır.
Recidive Jail (recidive = nükseden suçlu, yani alışkın olmuş saldırgan demek), fail2ban’ın diğer jail’lerinden farklı olarak şunu yapar: Herhangi bir jail tarafından daha önce banlanmış IP’leri izler. Eğer bir IP sürekli olarak farklı servislerden ya da aynı servisten defalarca banlanıyorsa, bu sefer çok daha uzun süreyle, genellikle haftalar veya aylar boyunca engellenir.
Kısacası Recidive Jail, fail2ban’ın kendi log dosyasını (fail2ban.log) dinliyor ve “Bu IP daha önce de banlandı, artık daha sert muamele görecek” diyor.
Nasıl Çalışır?
Mantık oldukça zekice:
- Fail2ban, kendi eylemlerini
/var/log/fail2ban.logdosyasına yazar - Recidive jail bu log dosyasını filtre kaynağı olarak kullanır
- Belirli bir zaman diliminde (örneğin 1 gün içinde) birden fazla kez banlanan bir IP tespit edilirse, çok uzun süreli bir ban uygulanır
- Bu ban genellikle diğer jail’lerin banlarından bağımsız olarak işlenir
Kurulum Öncesi Kontroller
Önce mevcut fail2ban kurulumumuzun düzgün çalıştığından emin olalım:
# Fail2ban servis durumu
sudo systemctl status fail2ban
# Mevcut aktif jail'leri listele
sudo fail2ban-client status
# Fail2ban versiyonunu kontrol et
fail2ban-client --version
Recidive jail fail2ban ile birlikte geliyor, ekstra paket kurmanıza gerek yok. Ancak bazı dağıtımlarda /etc/fail2ban/jail.conf dosyasında disabled olarak işaretlenmiş olabilir.
# Recidive jail'in mevcut konfigürasyonda olup olmadığını kontrol et
grep -n "recidive" /etc/fail2ban/jail.conf
Eğer bu komut sonuç verirse, jail.conf içinde recidive tanımı var demektir. Ama biz bunu hiçbir zaman doğrudan düzenlemiyoruz. Bunun yerine jail.local veya /etc/fail2ban/jail.d/ dizini altında özel konfigürasyon dosyaları oluşturuyoruz.
Temel Yapılandırma
jail.local ile Basit Yapılandırma
En kolay yöntem jail.local dosyasına recidive bölümü eklemek:
sudo nano /etc/fail2ban/jail.local
Dosyaya şunu ekleyin:
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = iptables-allports
bantime = 1w
findtime = 1d
maxretry = 5
filter = recidive
Bu ayarları biraz açalım:
- enabled = true: Jail’i aktif hale getirir
- logpath: fail2ban’ın kendi log dosyasını izliyoruz
- banaction = iptables-allports: Normal jail’lerde sadece ilgili port bloklanır, burada tüm portlar bloklanıyor. Bu önemli bir fark.
- bantime = 1w: 1 hafta ban süresi. Bunu 1 ay (30d) veya daha uzun yapabilirsiniz.
- findtime = 1d: Son 1 gün içinde yapılan banlara bakıyoruz
- maxretry = 5: 1 gün içinde 5 kez banlanırsa recidive devreye giriyor
Daha Agresif Yapılandırma
Yüksek trafik alan veya sık saldırı hedefi olan sunucular için daha sıkı ayarlar:
sudo nano /etc/fail2ban/jail.d/recidive.local
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = iptables-allports
bantime = 4w
findtime = 12h
maxretry = 3
filter = recidive
action = %(action_mwl)s
Bu yapılandırmada:
- findtime = 12h: 12 saat içinde 3 kez banlanırsa yeterli
- bantime = 4w: 4 hafta boyunca tüm portlardan engelleniyor
- action = %(action_mwl)s: Ban uygulandığında e-posta bildirimi de gönderiyor (mail with log)
Recidive Filter Dosyasını Anlamak
Fail2ban filtreler /etc/fail2ban/filter.d/ dizininde saklanır. Recidive filtresine bakalım:
cat /etc/fail2ban/filter.d/recidive.conf
Normal şartlarda bu dosya şuna benzer bir içerik barındırır:
# Fail2Ban filter to ban hosts that were banned many times in the past
# It relies on a log (such as /var/log/fail2ban.log) with ban entries
[Definition]
_daemon = fail2ban.server
failregex = ^(%(__prefix_line)s| %(__bsd_syslog_verbose)s)?%(_daemon)ss+[<HOST>]s+Bans
ignoreregex =
Bu regex pattern, fail2ban log dosyasındaki “Ban” eylemlerini yakalıyor ve hangi IP’nin banlandığını tespit ediyor. Filtreyi test etmek isterseniz:
# Filtreyi test et
sudo fail2ban-regex /var/log/fail2ban.log /etc/fail2ban/filter.d/recidive.conf
Bu komut size kaç eşleşme bulunduğunu gösterir. Eğer sıfır eşleşme çıkıyorsa, log formatınızda bir sorun olabilir.
Gerçek Dünya Senaryosu: Web Sunucusu + SSH Koruması
Diyelim ki bir web sunucunuz var. Hem SSH hem Apache/Nginx hem de mail servisi çalışıyor. Günde onlarca farklı IP saldırıyor, bazıları banlıktan çıkınca geri dönüyor.
İşte bu senaryo için eksiksiz bir yapılandırma:
sudo nano /etc/fail2ban/jail.d/custom-security.local
[DEFAULT]
bantime = 10m
findtime = 10m
maxretry = 5
banaction = iptables-multiport
# SSH Jail
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 1h
# Apache Auth Jail
[apache-auth]
enabled = true
port = http,https
logpath = %(apache_error_log)s
maxretry = 6
# Nginx Limit Req
[nginx-limit-req]
enabled = true
port = http,https
logpath = %(nginx_error_log)s
maxretry = 10
# Recidive - Hepsini kapsayan son kalkan
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = iptables-allports
bantime = 2w
findtime = 1d
maxretry = 4
Değişiklikleri uygulamak için:
sudo systemctl restart fail2ban
sudo fail2ban-client status
Log Formatı Sorunlarını Gidermek
Bazen recidive jail aktif görünür ama hiçbir IP banlamaz. En yaygın sebep log formatı uyuşmazlığıdır.
Önce fail2ban.log dosyasına bakalım:
tail -50 /var/log/fail2ban.log | grep "Ban"
Tipik bir ban satırı şöyle görünmeli:
2024-01-15 14:23:45,123 fail2ban.actions [12345]: NOTICE [sshd] Ban 192.168.1.100
Eğer log satırları farklı bir formattaysa (örneğin systemd journal üzerinden geliyorsa), filtreyi güncellemeniz gerekebilir:
sudo nano /etc/fail2ban/filter.d/recidive.conf
[Definition]
_daemon = fail2ban.server|fail2ban.actions
failregex = ^(%(__prefix_line)s)?s*([<HOST>]s+)?Bans+<HOST>s*$
^.*[<HOST>]s+Bans*$
ignoreregex =
[Init]
datepattern = %%Y-%%m-%%d %%H:%%M:%%S,%%f
Ardından filtreyi test edin:
sudo fail2ban-regex /var/log/fail2ban.log recidive
Recidive Jail Durumunu İzlemek
Yapılandırma bittikten sonra düzgün çalışıp çalışmadığını izlemek çok önemli:
# Recidive jail durumunu görüntüle
sudo fail2ban-client status recidive
# Tüm aktif jail'lerin durumunu göster
sudo fail2ban-client status
# Şu an banlı IP'leri listele
sudo fail2ban-client get recidive banip
# Belirli bir IP'nin ban durumunu sorgula
sudo fail2ban-client get recidive bantime 203.0.113.42
Gerçek zamanlı log izleme için:
# Fail2ban logunu canlı izle
sudo tail -f /var/log/fail2ban.log | grep -E "Ban|Unban|Found"
# Sadece recidive aktivitesini izle
sudo journalctl -u fail2ban -f | grep -i "recidive"
Manuel Ban ve Unban İşlemleri
Bazen recidive tarafından hatalı banlanan bir IP olabilir. Ya da çok tehlikeli bir IP’yi manuel olarak recidive’e eklemek isteyebilirsiniz:
# Manuel olarak IP ban et (recidive jail'ine)
sudo fail2ban-client set recidive banip 203.0.113.42
# Banlı bir IP'yi serbest bırak
sudo fail2ban-client set recidive unbanip 203.0.113.42
# Tüm jail'lerden bir IP'yi unban et
for JAIL in $(sudo fail2ban-client status | grep "Jail list" | sed 's/.*://;s/,//g'); do
sudo fail2ban-client set $JAIL unbanip 203.0.113.42 2>/dev/null
done
Whitelist: Kendi IP’nizi Koruma Altına Almak
Bu en kritik adımlardan biri. Kendi IP adresinizi veya güvendiğiniz IP bloklarını ignore list’e eklemezsek, yanlışlıkla kendi sunucunuzdan kendinizi kilitleyebilirsiniz:
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# Tek IP whitelist
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 192.168.0.0/16
# Ev IP'nizi veya ofis IP'nizi ekleyin
# ignoreip = 127.0.0.1/8 ::1 203.0.113.10 198.51.100.0/24
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = iptables-allports
bantime = 1w
findtime = 1d
maxretry = 5
# Recidive için de whitelist geçerlidir
ipset ile Performans Optimizasyonu
Çok sayıda IP banlaması gerektiğinde iptables performans sorunları yaşayabilirsiniz. Bu durumda ipset kullanmak çok daha verimli:
Önce ipset kurulumunu kontrol edin:
sudo apt-get install ipset # Debian/Ubuntu için
sudo yum install ipset # CentOS/RHEL için
Sonra recidive jail’ini ipset kullanacak şekilde yapılandırın:
sudo nano /etc/fail2ban/jail.d/recidive.local
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = iptables-ipset-proto6-allports
bantime = 1w
findtime = 1d
maxretry = 5
ipset tabanlı banlist’i görüntülemek için:
# ipset listelerini göster
sudo ipset list
# Fail2ban'ın oluşturduğu ipset'leri filtrele
sudo ipset list | grep -E "^Name:|recidive"
E-posta Bildirimleri Ayarlamak
Recidive devreye girdiğinde haberdar olmak çok işe yarıyor. Çünkü bir IP recidive tarafından banlandıysa bu ciddi bir saldırı sinyali:
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
destemail = [email protected]
sendername = Fail2Ban
mta = sendmail
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = iptables-allports
bantime = 1w
findtime = 1d
maxretry = 5
# Banlama + mail gönder + ilgili log satırlarını ekle
action = %(action_mwl)s
Mail göndermek için sistemde bir MTA kurulu olması gerekiyor. Basit bir çözüm olarak ssmtp veya msmtp kullanabilirsiniz.
Sorun Giderme: Recidive Çalışmıyor
Recidive jail’i aktif etmenize rağmen hiçbir IP banlamıyorsa şu kontrolleri yapın:
1. Jail gerçekten aktif mi?
sudo fail2ban-client status recidive
“Status for the jail: recidive” çıktısı geliyorsa jail çalışıyordur. “No such jail” hatası geliyorsa config dosyanızda bir yazım hatası var demektir.
2. Log dosyası doğru mu?
# Fail2ban.log'un var olup olmadığını ve ban içerip içermediğini kontrol et
ls -la /var/log/fail2ban.log
grep "Ban" /var/log/fail2ban.log | wc -l
Eğer fail2ban.log yoksa, fail2ban belki systemd journal’e yazıyordur:
journalctl -u fail2ban | grep "Ban" | head -20
Bu durumda logpath’i güncellemeniz veya fail2ban’ı dosyaya log yazacak şekilde yapılandırmanız gerekir.
3. findtime penceresi içinde yeterli ban var mı?
# Son 24 saat içindeki ban sayısını kontrol et
grep "Ban" /var/log/fail2ban.log | awk '{print $1" "$2}' |
awk -F'[- :]' '{print $1"-"$2"-"$3}' | sort | uniq -c | sort -rn | head -10
Güvenlik Katmanlarını Birleştirmek
Recidive tek başına yeterli değil, diğer güvenlik katmanlarıyla birlikte çalışmalı:
Coğrafi engelleme ile birlikte kullanım: Eğer sunucunuza Türkiye dışından bağlantı gelmesi gerekmiyorsa, önce coğrafi engelleme yapıp fail2ban’ı sadece izin verilen bölgeler için konfigüre edebilirsiniz.
Port Knocking ile SSH güvenliğini artırma: SSH’ı standart 22 portundan farklı bir porta taşıyıp fail2ban + recidive ile koruma altına almak çok etkili.
Cloudflare veya benzeri WAF hizmetleriyle: Web trafiği için CDN/WAF katmanı + fail2ban + recidive kombinasyonu en güçlü savunmayı oluşturuyor.
Tüm bu yapılandırmalar sonrasında düzenli kontrol için basit bir script işinize yarayabilir:
#!/bin/bash
# fail2ban-status.sh - Fail2ban özet raporu
echo "=== FAIL2BAN DURUM RAPORU ==="
echo "Tarih: $(date)"
echo ""
echo "--- Aktif Jail'ler ---"
sudo fail2ban-client status | grep -E "Number|Jail list"
echo ""
echo "--- Recidive Durumu ---"
sudo fail2ban-client status recidive
echo ""
echo "--- Son 10 Recidive Ban ---"
grep "recidive.*Ban" /var/log/fail2ban.log | tail -10
echo ""
echo "--- En Çok Ban Yiyen IP'ler (Son 7 Gün) ---"
grep "Ban" /var/log/fail2ban.log | grep -v "Unban" |
awk '{print $NF}' | sort | uniq -c | sort -rn | head -10
Scripti çalıştırılabilir yapın:
chmod +x fail2ban-status.sh
sudo ./fail2ban-status.sh
Sonuç
Recidive jail, fail2ban’ın en güçlü ama en çok göz ardı edilen özelliklerinden biri. Standart jail’ler saldırıları anlık olarak engeller, recidive ise “alışkanlık haline getirmiş” saldırganları tespit edip uzun vadeli olarak sistemden uzaklaştırır. Bu iki katmanlı yaklaşım, sunucunuzu ciddi ölçüde koruma altına alır.
Yapılandırma yaparken dikkat etmeniz gereken en kritik noktaları özetleyelim:
- Her zaman önce
ignoreipile güvendiğiniz IP’leri whitelist’e ekleyin, kendinizi kilitlemekten koruyun jail.confdosyasını asla doğrudan düzenlemeyin, her zamanjail.localveyajail.d/altında özel dosyalar oluşturunbanaction = iptables-allportskullanmak recidive’in gücünü tam anlamıyla ortaya koyar- Log dosyası formatını düzenli kontrol edin, çünkü sistem güncellemeleri bazen log formatını değiştirebilir
fail2ban-regexkomutu ile filtrelerinizi düzenli test edin
Saldırılar asla tamamen durmuyor, ama doğru yapılandırılmış bir fail2ban + recidive kombinasyonuyla sunucunuzun güvenlik yükünü ciddi ölçüde azaltabilir, log dosyalarınızı temiz tutabilir ve sistem kaynaklarınızı gereksiz yere tüketmekten kurtarabilirsiniz.