
Fail2Ban Kurulumu ve Yapılandırması: Sunucu Saldırı Koruma Rehberi
Fail2Ban ile Linux sunucunuzu brute force saldırılarına karşı nasıl korursunuz? SSH, WordPress, Nginx ve Apache için Fail2Ban jail yapılandırması rehberi.
Fail2Ban Kurulumu ve Yapılandırması: Sunucu Saldırı Koruma Rehberi
Fail2Ban, log dosyalarını izleyerek başarısız giriş denemelerini tespit eden ve belirli sayıda başarısız denemeden sonra saldırganın IP adresini otomatik bloke eden açık kaynaklı güvenlik aracıdır. SSH, FTP, HTTP kimlik doğrulaması ve daha fazlası için koruma sağlar.
Fail2Ban Nasıl Çalışır?
- Log dosyalarını sürekli izler (SSH: /var/log/auth.log)
- Başarısız giriş denemelerini sayar
- Eşik aşılınca (örn. 5 deneme) IP'yi güvenlik duvarına bloke eder
- Belirli süre sonra bloğu kaldırır (veya kalıcı blok)
Kurulum
# Ubuntu/Debian
apt update
apt install fail2ban
# AlmaLinux/CentOS (EPEL gerekir)
dnf install epel-release
dnf install fail2ban
# Servisi başlat
systemctl enable --now fail2ban
Temel Yapılandırma
Fail2Ban konfigürasyonu /etc/fail2ban/ dizininde:
- jail.conf: Varsayılan ayarlar (düzenleme)
- jail.local: Özel ayarlar (KULLANIN)
- filter.d/: Log kalıp dosyaları
- action.d/: Engelleme eylem dosyaları
jail.local Oluşturma
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
nano /etc/fail2ban/jail.local
Global Ayarlar
[DEFAULT]
# Beyaz liste (kendi IP'niz)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
# Ban süresi (saniye, -1 = kalıcı)
bantime = 3600
# Deneme periyodu
findtime = 600
# Maksimum başarısız deneme
maxretry = 5
# Ban eylemi (iptables)
banaction = iptables-multiport
# E-posta bildirimi
destemail = [email protected]
sender = [email protected]
mta = sendmail
action = %(action_mwl)s # mail + whois + log
Modern Backend Seçimi: iptables / nftables / firewalld
Fail2Ban varsayılan olarak iptables-multiport kullanır, ama modern dağıtımlarda nftables öne çıkıyor.
# /etc/fail2ban/jail.local
# iptables-multiport (klasik, en yaygın)
banaction = iptables-multiport
# nftables (Debian 11+, Ubuntu 22.04+, RHEL 9+ default)
banaction = nftables-multiport
# firewalld (RHEL/CentOS/Alma için tavsiye edilir)
banaction = firewallcmd-rich-rules
# IPv6 desteği (her ikisi)
banaction_allports = nftables-allports
| Backend | Avantaj | Dezavantaj |
|---|---|---|
| iptables | En yaygın, dökümantasyon bol | Kernel'de eski; yavaş büyük listeler |
| nftables | Hızlı, set tabanlı (1M IP'lik blocklist O(log n)) | Bazı eski script'ler uyumsuz |
| firewalld | RHEL ekosistemi, zone tabanlı | Karmaşık yapılandırma |
⚠️ Çakışma: ufw veya firewalld yönetimindeyken Fail2Ban iptables komutları kuralları çakıştırabilir. Tercih: dağıtımın firewall'una uygun banaction seçin.
SSH Jail Yapılandırması
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
# Ubuntu için:
# logpath = /var/log/auth.log
# CentOS için:
# logpath = /var/log/secure
maxretry = 5
findtime = 300
bantime = 7200
Nginx Jail Yapılandırması
HTTP Kimlik Doğrulama
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
Nginx Kötü Bağlantı
[nginx-badbots]
enabled = true
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 86400 # 1 gün
WordPress Brute Force Koruması
wp-login.php'ye yönelik saldırılar için özel filtre:
/etc/fail2ban/filter.d/wordpress.conf:
[Definition]
failregex = <HOST>.*POST.*wp-login.php
ignoreregex =
jail.local'e ekle:
[wordpress]
enabled = true
filter = wordpress
logpath = /var/log/nginx/access.log
port = 80,443
maxretry = 5
findtime = 600
bantime = 86400
Recidive Jail — Tekrarlayan Saldırganlar
Standart jail süreyi (örn. 1 saat) bitirdikten sonra IP serbest kalır; aynı saldırgan tekrar deneyebilir. Recidive jail, fail2ban'ın kendi fail2ban.log dosyasını izleyerek birden fazla kez ban yiyen IP'leri çok daha uzun süreli banlar.
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
banaction = %(banaction_allports)s
maxretry = 5 # 5 farklı jail'de ban yedi mi?
findtime = 86400 # 1 gün penceresi
bantime = 604800 # 1 hafta ban
Bu yapıda saldırgan SSH, WordPress, postfix gibi farklı vektörlerden 5 kez ban yerse 1 hafta tüm portlardan dışlanır. Botnet IP'lerinde bu çok etkili.
IP Reputation Listesi (DROP listesi) Entegrasyonu
# AbuseIPDB veya Spamhaus DROP listesi
wget https://www.spamhaus.org/drop/drop.txt -O /etc/spamhaus-drop.txt
# nftables sete ekle
nft add set inet filter blacklist '{ type ipv4_addr; flags interval; }'
while read line; do
ip=$(echo $line | awk '{print $1}')
[[ -z "$ip" || "$ip" == ";" ]] && continue
nft add element inet filter blacklist "{ $ip }"
done < /etc/spamhaus-drop.txt
# Cron ile haftalık güncelleme
echo '0 3 * * 1 /usr/local/bin/update-spamhaus.sh' | crontab -
Cloudflare API ile Edge Bloklama
Sunucu seviyesinde IP banlamak iyi ama Cloudflare CDN'in arkasındaysa asıl IP saldırganın değil, Cloudflare'in IP'sidir. Çözüm: Fail2Ban tetiklendiğinde Cloudflare Firewall API üzerinden IP'yi edge'de blokla.
# /etc/fail2ban/action.d/cloudflare-token.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl -s -X POST "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data '{"mode":"block","configuration":{"target":"ip","value":"<ip>"},"notes":"fail2ban"}'
actionunban = # API ile rule listele + sil (uzun komut)
# /etc/fail2ban/jail.local
[sshd]
banaction = cloudflare-token
Cloudflare Free planda bin IP/ay rule kotası vardır; Recidive jail ile kombine edip ciddi tekrarlayan saldırganları edge'e itmek doğru kullanım.
Slack/Discord Bildirimi
# /etc/fail2ban/action.d/slack.conf
[Definition]
actionban = curl -X POST -H 'Content-type: application/json' \
--data '{"text":":no_entry: <name> jail `<ip>` IP\'\sini banladı (<failures> deneme)"}' \
<slack_webhook>
Production'da bu bildirim, gece yarısı SSH attack başladığında anlık görünürlük sağlar.
Postfix, Dovecot ve Veritabanı Log İzleme
Postfix SMTP Auth
[postfix-sasl]
enabled = true
filter = postfix-sasl
logpath = /var/log/mail.log
maxretry = 5
bantime = 7200
Dovecot (IMAP/POP3)
[dovecot]
enabled = true
filter = dovecot
logpath = /var/log/mail.log
maxretry = 5
findtime = 600
bantime = 7200
MySQL/MariaDB Failed Auth
MySQL default'ta failed login'leri error.log'a yazmaz. Önce general log veya audit plugin ile loglayın:
# /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
log_error = /var/log/mysql/error.log
# /etc/fail2ban/filter.d/mysql-auth.conf
[Definition]
failregex = Access denied for user.*\@'<HOST>'
[mysql-auth]
enabled = true
filter = mysql-auth
logpath = /var/log/mysql/error.log
port = 3306
maxretry = 5
⚠️ Veritabanı public açıksa (3306 port internet'e) — fail2ban bile yetmeyebilir. Önce VPN veya bind 127.0.0.1, sonra fail2ban ek katman.
Fail2Ban Yönetimi
# Genel durum
fail2ban-client status
# Jail durumu
fail2ban-client status sshd
fail2ban-client status wordpress
# Banlı IP'leri listele
fail2ban-client status sshd | grep "Banned IP"
# IP ban'ını kaldır
fail2ban-client set sshd unbanip 192.168.1.100
# IP'yi manuel banla
fail2ban-client set sshd banip 192.168.1.200
# Fail2Ban'ı yeniden başlat
systemctl restart fail2ban
# Log izleme
tail -f /var/log/fail2ban.log
Kalıcı Ban (IPBan)
Tekrarlayan saldırganlar için kalıcı ban:
[sshd]
enabled = true
bantime = -1 # Kalıcı ban
maxretry = 3
veya belirli IP'leri kalıcı olarak kara listeye:
# iptables ile
iptables -A INPUT -s 5.6.7.8 -j DROP
iptables-save > /etc/iptables/rules.v4
Özel Filtre Oluşturma
/etc/fail2ban/filter.d/my-app.conf:
[Definition]
# Regex ile başarısız giriş kalıbı
failregex = ^<HOST> .* "POST /login.php.*" 401
ignoreregex =
[Init]
# Regex test
# fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/my-app.conf
Filtreyi test etme:
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/my-app.conf
Fail2Ban İstatistikleri
# Toplam ban sayısı
fail2ban-client status | grep "Number of jail"
# Günlük ban istatistiği
grep "Ban " /var/log/fail2ban.log | wc -l
grep "Ban " /var/log/fail2ban.log | awk '{print $8}' | sort | uniq -c | sort -rn | head -10
Yaygın Fail2Ban Sorunları ve Çözümleri
| Sorun | Sebep | Çözüm |
|---|---|---|
| Jail enabled ama ban almıyor | Filter regex log formatına uymuyor | fail2ban-regex /var/log/X /etc/fail2ban/filter.d/Y.conf ile test |
| Kendi IP'm banlandı | ignoreip eksik |
ignoreip = 127.0.0.1/8 ::1 X.X.X.X ekle |
| Logrotate sonrası filter kaçırıyor | F2B yeni dosyayı tanımıyor | logrotate config'e copytruncate ekle veya postrotate'da fail2ban-client reload |
| iptables kuralları her boot'ta sıfırlanıyor | netfilter-persistent yok | apt install iptables-persistent veya nftables backend'e geç |
| Çok fazla CPU/memory tüketiyor | Aşırı log + complex regex | use_journal = yes (journald), filter'da failregex basitleştir |
| IPv6 banlanmıyor | banaction IPv6 destekli mi? |
banaction = nftables-multiport (hem v4 hem v6) |
| Saat dilimi yanlış log parsing | Server UTC, log Europe/Istanbul | /etc/timezone ve logpath saat eşle, datepattern filter'a ekle |
| Whitelist çalışmıyor | CIDR formatı yanlış | 192.168.1.0/24 (doğru) vs 192.168.1.* (yanlış) |
Debug Komutları
# Detaylı durum
fail2ban-client status sshd
# Filter regex test
fail2ban-regex /var/log/auth.log sshd
# Log seviyesini DEBUG'a al (geçici)
fail2ban-client set loglevel DEBUG
tail -f /var/log/fail2ban.log
# Tüm jaildeki banlanmış IP listesi (ipset/nftables)
nft list set inet filter f2b-sshd 2>/dev/null
ipset list f2b-sshd 2>/dev/null
Büyükweb Hosting Güvenliği
Büyükweb VDS sunucular üzerine Fail2Ban kurulumu ilk yapılandırma adımlarından biri olarak önerilir. Yüksek trafikli sitelerde Fail2Ban'ı ModSecurity ve CloudFlare ile kombine kullanmak çok katmanlı güvenlik sağlar.
Sonuç
Fail2Ban, minimum kaynak kullanımıyla maksimum koruma sağlayan etkili bir güvenlik aracıdır. SSH, web sunucu ve uygulama giriş sayfaları için jail yapılandırması, sunucunuzu otomatik saldırılara karşı korur. E-posta bildirimleri ile de güvenlik olaylarından anında haberdar olabilirsiniz.
Fail2Ban Sıkça Sorulan Sorular
Fail2Ban modern saldırılara karşı yeterli mi?
Tek başına yeterli değil. Distributed brute force (binlerce farklı IP'den 1 deneme), 0-day exploit, app-layer DDoS gibi saldırılarda etkisizdir. Fail2Ban + WAF (ModSecurity, Cloudflare) + rate limiting (Nginx limit_req) + monitoring (Wazuh, OSSEC) katmanlı yaklaşım gerekli.
IPv6 destekli mi?
Evet, ama banaction doğru seçilmeli. iptables-multiport sadece IPv4. nftables-multiport veya iptables-multiport[allports] + ip6tables-multiport çift kurulum.
Recidive ne kadar agresif olmalı?
Sunucu kullanım profiline göre. Açık SSH ile 24/7 erişimli VDS → 1 hafta. Kurumsal mail server → 1 ay. Dahili intranet → kalıcı. Çok agresif politika gerçek kullanıcıyı yanlışlıkla blokladığında support yükü artırır.
CPU yükü ne zaman sorun olur?
Saniyede 1000+ log satırı üreten yüksek trafikli sunucularda complex failregex CPU'yu tüketebilir. Çözüm: journald kullan (backend = systemd) veya logları F2B özel sunucuya merkezileştir.
Cloud sunucularda dikkat?
Büyükweb VDS gibi cloud sunucularda sağlayıcı kendi WAF'ını ekleyebilir. Çift bloklama (provider + F2B) hatalı durumlarda erişimi tamamen kaybettirebilir. Test için alternatif erişim (KVM console, IPMI, geçici VPN) hazır olmalı.
Otomatik unban (geçici ban) mı kalıcı ban mı?
Genel kural: ilk ban geçici (1-2 saat), recidive ile tekrar saldırganlar kalıcı. Tamamen kalıcı ban (bantime = -1) DHCP IP havuzları yüzünden gelecekteki gerçek kullanıcıyı kalıcı engelleyebilir.
Büyükweb hosting paketlerinde Fail2Ban kurulu mu?
Paylaşımlı cPanel hosting ve Plesk hosting paketlerinde sunucu seviyesinde Imunify360 + cPHulk + Fail2Ban kombine çalışır — ek kurulum gerektirmez. VDS ve dedicated paketlerinde root size ait, manuel kurulum + destek ekibi yardımı.
WordPress sürekli ban yiyor, çözüm?
WordPress login'inin botnet hedefi olması beklenir. Çözüm sırası:
- Login URL'sini değiştir (WPS Hide Login plugin) — botların %95'i tek başına biter
- 2FA zorunlu (Wordfence, Two Factor Authentication)
- CAPTCHA wp-login.php'de
- Cloudflare Bot Fight veya WAF rule
- Fail2Ban son katman olarak
Bu sıralama yapıldığında F2B logları neredeyse boş kalır — gerçek başarı işareti.
İlgili Büyükweb Hizmetleri
Yönetimini kontrol etmek istediğiniz sunucu için Büyükweb VDS / VPS / dedicated paketleri:
Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.
Sunucu Yönetimi İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:

