Buyukweb
Fail2Ban Kurulumu ve Yapılandırması: Sunucu Saldırı Koruma Rehberi

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.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü9 dakika okuma

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?

  1. Log dosyalarını sürekli izler (SSH: /var/log/auth.log)
  2. Başarısız giriş denemelerini sayar
  3. Eşik aşılınca (örn. 5 deneme) IP'yi güvenlik duvarına bloke eder
  4. 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ı:

  1. Login URL'sini değiştir (WPS Hide Login plugin) — botların %95'i tek başına biter
  2. 2FA zorunlu (Wordfence, Two Factor Authentication)
  3. CAPTCHA wp-login.php'de
  4. Cloudflare Bot Fight veya WAF rule
  5. 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:

#fail2ban#kurulum rehberi#sunucu#server yönetimi#sistem yönetimi

Bu yazıyı paylaş