Rehber 06 Mayıs 2026 · 6 dakika okuma

Fail2ban Kurulumu: Sunucuyu Otomatik Koruma Rehberi

Fail2ban ile SSH ve web servislerinde kötü niyetli denemeleri otomatik engelleyin. Kurulum, ayar ve test adımlarıyla net koruma planı.

Sunucunuzun güvenliği yalnızca güçlü parola politikasıyla bitmez. İnternete açık servisler (özellikle SSH ve web) sürekli deneme ve tarama trafiği görür. Bu yazıda Linux sunucuda Fail2ban (log tabanlı intrusion prevention) kurulumunu, filtre/jail mantığını, pratik konfigürasyon örneklerini ve test/izleme adımlarını; net ve uygulanabilir şekilde öğreneceksiniz. Amaç, saldırı denemelerini tespit edip belirli süreyle engelleyen otomatik bir savunma hattı kurmak.

Fail2ban ne yapar, neden “log tabanlı” bir araçtır?

Fail2ban, öncelikle servislerinizin ürettiği log kayıtlarını izler. Bir kuralı (fail pattern) tetikleyen tekrarlar olursa, ilgili IP adresini belirlediğiniz süreyle engeller. Bu engelleme, çoğunlukla iptables veya nftables üzerinden yapılır (sisteme göre değişir).

Fail2ban’ın avantajı şudur: Sürekli firewall yönetmek yerine, olay bazlı (ör. “SSH’de art arda başarısız giriş”) otomatik aksiyon alır.

Jail (kural seti) ve filter (desen) mantığı

  • filter: Log dosyasında hangi metnin “hatalı deneme” sayılacağını tanımlar. Örn. SSH “Failed password” satırları.
  • jail: Hangi servisi izleyeceğinizi, kaç deneme sonrası aksiyon alınacağını, aksiyon süresini ve filtreyi bir araya getirir.

Bu ayrım sayesinde sadece SSH için değil, Nginx/Apache, Postfix/Dovecot gibi servisler için de hızlıca jail oluşturabilirsiniz.

Kurulum: Debian/Ubuntu ve CentOS/RHEL akışına göre fail2ban

Aşağıdaki adımlar, farklı dağıtımlarda benzer mantıktadır. En kritik nokta, log yolunuzun ve servis adlarının doğru olmasıdır.

Debian / Ubuntu

1) Paketleri yükleyin: - sudo apt update - sudo apt install -y fail2ban

2) Servisi başlatın: - sudo systemctl enable --now fail2ban

3) Durum kontrolü: - sudo systemctl status fail2ban

AlmaLinux / Rocky / CentOS Stream

  • sudo dnf install -y fail2ban
  • sudo systemctl enable --now fail2ban
  • sudo systemctl status fail2ban

Not: Bazı sistemlerde paket adı aynı olsa da log dosya konumları farklı olabilir. Bu yüzden ileride “log doğrulama” kısmını atlamayın.

Temel konfigürasyon: jail.local ile güvenli şekilde özelleştirme

Fail2ban ayarlarında en kritik pratik: Dağıtımın sağladığı dosyaları doğrudan düzenlemek yerine override dosyası kullanmaktır.

  • Varsayılan dosyalar genellikle /etc/fail2ban/jail.conf altında olur.
  • Özelleştirmeleri /etc/fail2ban/jail.local içine yapın.

Örnek: SSH için agresif olmayan, dengeli başlangıç ayarı

Önerilen yaklaşım, önce “saldırganlara” odaklanırken meşru kullanıcıları da kilitlememektir. Örneğin bu hedef, bruteforce denemelerine karşı minimum zaman kazanımı verir:

1) Dosyayı oluşturun/editleyin: - sudo nano /etc/fail2ban/jail.local

2) Şu içeriği ekleyin:

[DEFAULT]
# Engelleme mekanizmasını dağıtımınız destekliyorsa iptables/nftables üzerinden kullanır
bantime = 1h
findtime = 10m
maxretry = 5

# Varsayılan aksiyonlar bazı sistemlerde farklı olabilir
# Uygulamada sisteminize göre otomatik uyarlanır.

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log

[sshd-ddos]
# (opsiyonel) Dilerseniz ayrı parametrelerle farklı bir jail de kurabilirsiniz
enabled = false

3) Eğer log dosyanız /var/log/auth.log değilse, aşağıdaki “log bulma” adımına göre düzeltin.

Sistem logu yolu nasıl bulunur?

SSH denemelerinin düştüğü logu doğrulamak için: - Debian/Ubuntu sık olarak: /var/log/auth.log - CentOS/Alma/Rocky sık olarak: /var/log/secure

Doğrulamak için hızlı komut: - sudo grep -R "Failed password" /var/log/auth.log /var/log/secure 2>/dev/null | tail -n 20

Fail2ban jail’de logpath değerini bu sonuca göre ayarlayın.

Web servisleri için temel koruma: Nginx/Apache jail ekleyin

Web tarafında, “404/401/403” gibi sayılar tek başına yeterli bir brute-force göstergesi değildir. Fail2ban genelde daha spesifik eşleşmelerle (ör. POST denemeleri, çoklu 401 vb.) çalışır. Bu nedenle sadece “çok istek geldi” gibi kaba kurallar yerine, mevcut fail2ban filter’larının güvenilir başlangıç profillerini kullanmak iyi sonuç verir.

Nginx için (örnek)

1) jail.local içine şunu ekleyin:

[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log

[nginx-badbots]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log

2) Nginx error log yolunuz farklıysa logpath değerini düzeltin. Bazı kurulumlarda /var/log/nginx/access.log da kullanılabilir; filtreyle uyumlu log satırlarını yakalamak esastır.

Apache için (örnek)

jail.local içine:

[apache-auth]
enabled = true
port = http,https
logpath = /var/log/apache2/error.log

Filtre adları dağıtıma/kurulu pakete göre değişebilir. Fail2ban’ın “hangi filtreler hazır” listesini görmek için: sudo fail2ban-client status ve filtre dosyalarını incelemek gerekir.

Hazır filtreleri ve jail’leri doğrulama: sistemde ne var, neye ihtiyacınız var?

Kurulumdan sonra hangi jail’lerin mevcut olduğunu görmek için: - sudo fail2ban-client status - sudo fail2ban-client status sshd

Hazır filter/jail mantığını kontrol etmek için, fail2ban paketinin getirdiği dosyaları listeleyin: - sudo ls /etc/fail2ban/filter.d/ - sudo ls /etc/fail2ban/jail.d/

Aynı zamanda şunu kullanın: - sudo fail2ban-regex <log_dosyası> "<örnek_regex>"

Bu sayede log satırınızın gerçekten yakalanıp yakalanmadığını, körlemesine jail eklemeden test edebilirsiniz.

Parametreleri doğru seçme: bant süresi, pencere süresi, deneme limiti

Fail2ban ayarlarındaki üç temel değer, kilitlenme riskini ve engelleme etkinliğini belirler: - findtime: Belirli bir zaman penceresinde kaç başarısız deneme sayılacak. - maxretry: Pencere içinde kaç deneme olursa engelleme uygulanacak. - bantime: IP kaç süreyle engellenecek.

İyi pratik başlangıç değerleri

SSH için güvenli bir başlangıç: - findtime: 10m - maxretry: 5 - bantime: 1h

Bu set, otomatik tarayıcıların tipik deneme davranışını yakalar; fakat tek seferlik hata yapan kullanıcıları kalıcı kilitlemez.

Eğer sunucunuzda çok sayıda meşru IP NAT/kurumsal ağ üzerinden geliyorsa maxretry ve bantime değerlerini daha korumacı yapın. Örneğin maxretry=3 ve bantime=1h yerine maxretry=6 ve bantime=30m gibi.

Engelleme mekanizmasını doğrulama: gerçekten bloke ediyor mu?

Fail2ban’ın aksiyon verdiğini görmek için iki seviyeli kontrol yapın: (1) Fail2ban log’u, (2) firewall tablosu.

1) Fail2ban log’u

Fail2ban log dosyası dağıtıma göre değişebilir ama çoğunlukla journald üzerinden takip edilir: - sudo journalctl -u fail2ban -n 200 --no-pager

Engelleme satırları genelde “Ban” veya “Unban” şeklinde görünür.

2) Firewall durumunu kontrol edin

Sisteminizde kullanılan altyapıya göre: - iptables: sudo iptables -S - nftables: sudo nft list ruleset

Engellenecek IP’leri, bantime dolana kadar listede doğrulayın.

Test senaryosu: SSH’de doğru eşleşmeyi garantileyin

Amaç, Fail2ban’ın gerçekten sizin log formatınıza göre tetiklendiğini kanıtlamaktır. Bunu üretimde rastgele denemek yerine kontrollü test edin.

Test adımı

1) Yeni bir terminalden geçersiz kullanıcı adı/parola ile birkaç kez SSH deneyin. 2) Ardından Fail2ban durumunu kontrol edin: - sudo fail2ban-client status sshd

3) En kritik parametre: Currently banned değerinin artıp artmadığı.

Beklenen davranış: - Başarısız denemeler maxretry sayısını aşınca ilgili IP kısa süreyle engellenir. - Bant süresi dolunca IP otomatik geri açılır.

Hataları nasıl ayıklarsınız?

  • Jail aktif mi? enabled = true satırı kesin doğru olmalı.
  • logpath yanlış mı? SSH logunuz farklı dosyaya düşüyorsa findtime hiç dolmaz.
  • maxretry/findtime çok agresif mi? Meşru kullanımda kilitlenme artabilir.

Otomasyon ve bakım: güncelleme sonrası dayanıklılık

Fail2ban yapılandırmasını güncellemelere rağmen korumak için şu düzeni sürdürün: - Özelleştirmeleri /etc/fail2ban/jail.local içinde tutun. - Ek bileşenler için (dağıtımların desteklediği durumda) /etc/fail2ban/jail.d/ altında parça dosyalar kullanın. - Yedekleme (backup) mantığıyla sunucu imajınızda bu dosyaların içeriğini konfigürasyon yönetimine alın.

Ayrıca zaman zaman şunları çalıştırın: - sudo fail2ban-client ping - sudo fail2ban-client reload

Yaygın sorunlar ve net çözümler

1) “Fail2ban çalışıyor ama engellemiyor”

En sık nedenler: - logpath yanlış - jail adı aktif değil - ilgili filter dosyası eşleşmiyor (log satırı formatı farklı)

Çözüm: - journalctl -u fail2ban -n 200 ile “matched”/“error” satırlarını kontrol edin. - Log dosyasında gerçekten görünen metinle filter eşleşmesini doğrulayın.

2) “Kendimi de engelledim”

En sık nedenler: - Aynı IP’den çoklu deneme (SSH key/şifre karışıklığı) - Bant süresi çok yüksek

Çözüm: - Engeli manuel kaldırın: sudo fail2ban-client set sshd unbanip <ip> - maxretry ve bantime değerlerini yeniden dengeleyin.

Sonuç: 30 dakikada uygulanacak koruma planı

Fail2ban ile otomatik koruma kurmanın en doğru yolu, önce SSH için dengeli bir jail kurup log yolunu doğrulamaktır. Ardından Nginx/Apache tarafında yalnızca gerçekten anlamlı filtrelerle ekleme yapın. Son adım olarak “Ban/Unban” akışını hem Fail2ban log’undan hem de firewall kurallarından kontrol edin. Bu kontrol tamamlandıktan sonra yapılandırmayı jail.local üzerinden saklayın ve güncelleme sonrası reload ile sürekliliği koruyun.

İlk aksiyon önerim: SSH için bantime = 1h, findtime = 10m, maxretry = 5 ile başlayın; log dosyanızı doğrulayın; 5-10 dakikalık kontrollü bir testle “IP gerçekten engelleniyor mu?” sorusunu yanıtlayın. Ardından web jail’lerini ekleyin.

Etiketler: #fail2ban #ssh #güvenlik #vps #vds #firewall #linux

Hosting karşılaştırması yapmaya hazır mısın?

100+ firmanın fiyatlarını tek tıkla karşılaştır, en uygun paketi bul.

Hosting Karşılaştır →

İlgili Yazılar

0 ürün seçildi
NetKıyas AI
Hosting danışmanınız
Merhaba! Ben NetKıyas yapay zekâ asistanı. Hosting, VDS, VPS veya sunucu seçiminde size yardımcı olabilirim. Ne arıyorsunuz?