Güvenlik & SSL

    Fail2ban ile Brute-Force Saldırılarını Engelleme

    Fail2ban'ın ne olduğunu, nasıl çalıştığını ve Ubuntu sunucuda brute-force saldırılarını engellemek için jail.local ile nasıl yapılandırılacağını uçtan uca öğrenin.

    10 dk okuma Güncellendi: 9 Temmuz 2026

    Sunucunuzu internete açtığınız ilk dakikadan itibaren otomatik saldırı botları kapınızı çalmaya başlar. SSH portuna saniyeler içinde ardı ardına parola denemeleri düşer, WordPress giriş sayfanız yüzlerce farklı kullanıcı adıyla zorlanır, e-posta ve cPanel servisleri sürekli taranır. Bunların çok büyük bölümü insan eliyle değil, tüm internet adres bloklarını tarayan otomatik yazılımlarca yapılır. Tek bir zayıf parola, bu denemelerden birinin tutması için yeterlidir.

    İşte tam bu noktada Fail2ban devreye girer. Fail2ban, sunucunuzun log dosyalarını gerçek zamanlı okuyup başarısız giriş denemelerini sayan ve belirlediğiniz eşiği aşan IP adreslerini güvenlik duvarı üzerinden geçici olarak yasaklayan hafif bir servistir. Bu rehberde brute-force saldırısının ne olduğunu, Fail2ban'ın çalışma mantığını, Ubuntu üzerinde kurulumunu ve gerçek üretim ortamına uygun bir jail.local yapılandırmasını adım adım ele alacağız.

    Brute-Force Saldırısı Nedir ve Neden Tehlikelidir?#

    Brute-force (kaba kuvvet) saldırısı, bir hesabın parolasını ya da bir servisin kimlik bilgilerini deneme-yanılma yoluyla ele geçirmeye çalışan yöntemdir. Saldırgan, doğru kombinasyonu bulana kadar binlerce, hatta milyonlarca parolayı otomatik olarak dener. Bu denemeler sözlük saldırısı (yaygın parola listeleri), credential stuffing (başka sitelerden sızmış kullanıcı adı-parola çiftleri) veya tamamen rastgele kombinasyon üretimi biçiminde olabilir.

    Bir sunucuda en çok hedef alınan servisler şunlardır:

    • SSH (22 portu): Sunucuya tam yetkiyle erişim sağladığı için birinci hedeftir. Başarılı bir giriş, saldırgana kök (root) yetkisine giden yolu açar.
    • WordPress giriş sayfası (wp-login.php, xmlrpc.php): İnternetin en yaygın içerik yönetim sistemi olduğu için endüstriyel ölçekte taranır.
    • cPanel / WHM / Webmail: Barındırma paneli erişimi ele geçirildiğinde saldırgan tüm siteleri, veritabanlarını ve e-postaları kontrol edebilir.
    • FTP, e-posta (SMTP/IMAP/POP3) ve veritabanı servisleri: Doğrudan internete açıksa hepsi denenir.

    Brute-force'un tehlikesi yalnızca hesabın ele geçirilmesiyle sınırlı değildir. Sürekli devam eden binlerce deneme, CPU ve bant genişliği tüketerek sunucunuzu yavaşlatır; log dosyalarını şişirir; kimi zaman bir tür düşük yoğunluklu hizmet reddi (DoS) etkisi bile yaratır. Sunucu güvenliğinin temelleri konusunda daha geniş bir çerçeve için sunucu güvenliği temelleri yazımızı da inceleyebilirsiniz.

    Fail2ban Nedir ve Nasıl Çalışır?#

    Fail2ban, adından da anlaşılacağı gibi "başarısızlıkta yasakla" mantığıyla çalışan Python tabanlı bir arka plan servisidir. Bir güvenlik duvarının yerine geçmez; onun önünde çalışan, akıllı bir tetikleyici görevi görür. Çalışma döngüsü dört aşamalıdır:

    1. Log tarama: Fail2ban, izlemesini istediğiniz servislerin log dosyalarını (/var/log/auth.log, /var/log/nginx/error.log gibi) sürekli okur.
    2. Filtre eşleştirme: Her jail'e bağlı bir filtre (regex kalıpları) vardır. Bu kalıplar "başarısız giriş", "geçersiz kullanıcı" gibi satırları yakalar ve satırdaki IP adresini çıkarır.
    3. Sayaç ve eşik: Aynı IP, findtime süresi içinde maxretry sayısından fazla başarısız denemede bulunursa eşik aşılmış sayılır.
    4. Ban (yasaklama): Eşiği aşan IP, bantime süresince güvenlik duvarına (modern sistemlerde nftables, eski sistemlerde iptables) eklenerek engellenir. Süre dolunca ban otomatik kalkar.

    Bu yapıdaki temel kavramlar iki başlıkta toplanır. Jail (hapishane), "hangi servisi, hangi filtreyle, hangi eşikte izleyeceğim ve ban için ne yapacağım" tanımıdır. Filter ise log satırlarını yakalayan düzenli ifade (regex) setidir. Fail2ban kutudan çıktığında SSH, Apache, Nginx, Postfix, Dovecot ve daha pek çok servis için hazır filtrelerle gelir; siz yalnızca bunları etkinleştirir ve eşikleri ayarlarsınız.

    Ubuntu ve Debian Üzerinde Fail2ban Kurulumu#

    Fail2ban Ubuntu ve Debian depolarında hazır bulunur, dolayısıyla kurulum tek komuttur. Öncelikle paket listesini güncelleyip paketi kurun:

    sudo apt update
    sudo apt install fail2ban -y
    

    Kurulumun ardından servisin etkin ve çalışır durumda olduğunu doğrulayın:

    sudo systemctl enable fail2ban
    sudo systemctl start fail2ban
    sudo systemctl status fail2ban
    

    status çıktısında active (running) ifadesini görmelisiniz. Fail2ban modern Ubuntu sürümlerinde varsayılan olarak systemd journal üzerinden logları okuyacak biçimde gelir, bu yüzden çoğu durumda ek yapılandırma olmadan bile SSH jail'i devrededir. Yine de üretim ortamında ayarları elle kontrol etmek en doğrusudur.

    jail.local Mantığı — jail.conf'u Asla Düzenlemeyin#

    Fail2ban'ın kalbi /etc/fail2ban/jail.conf dosyasıdır. Ancak bu dosyayı doğrudan düzenlememeniz gerekir. Nedeni basittir: jail.conf, paket her güncellendiğinde üzerine yazılır ve tüm değişiklikleriniz kaybolur. Bunun yerine Fail2ban size bir üst-katman sunar. jail.local adında ayrı bir dosya oluşturursanız, buradaki ayarlar jail.conf'un ilgili değerlerini ezer; güncellemeler ise jail.conf'a dokunur ama sizin jail.local'ınıza dokunmaz.

    Uygulamada iki yaygın yöntem vardır. Ya jail.conf'u kopyalayıp jail.local yaparsınız ya da sadece değiştireceğiniz bölümleri içeren yeni ve sade bir jail.local yazarsınız. İkinci yöntem daha temizdir çünkü hangi ayarları bilinçli olarak değiştirdiğinizi net biçimde gösterir:

    sudo nano /etc/fail2ban/jail.local
    

    Benzer bir kural jail ve filtre dosyaları için de geçerlidir: /etc/fail2ban/jail.d/ ve /etc/fail2ban/filter.d/ dizinlerine .local uzantılı dosyalar ekleyerek varsayılanları güvenle özelleştirebilirsiniz.

    Temel Ayarlar — bantime, findtime, maxretry ve ignoreip#

    Fail2ban davranışını belirleyen dört anahtar parametreyi iyi anlamak, hem güvenliği hem de kullanılabilirliği dengelemenin sırrıdır:

    ParametreAnlamıÖrnek Değer
    maxretryBan öncesi izin verilen başarısız deneme sayısı3–5
    findtimeDenemelerin sayıldığı zaman penceresi (saniye)600 (10 dk)
    bantimeIP'nin yasaklı kalacağı süre (saniye)3600 veya daha fazla
    ignoreipAsla yasaklanmayacak IP/ağ listesikendi IP'niz

    ignoreip parametresi hayati önemdedir. Buraya kendi statik IP adresinizi, ofis ağınızı veya sunucunun kendi loopback adresini eklemezseniz, birkaç yanlış parola girdiğinizde kendinizi sunucudan kilitleyebilirsiniz. Bu, Fail2ban'la yaşanan en yaygın kazadır ve rehberin sonunda ayrıca değineceğiz.

    bantime için negatif bir değer (-1) kalıcı ban anlamına gelir; ancak bunu genel olarak kullanmak önerilmez çünkü dinamik IP kullanan meşru kullanıcıları kalıcı olarak dışarıda bırakabilir. Bunun yerine tekrarlayan saldırganları giderek daha uzun süre yasaklayan "üstel artış" (incremental ban) özelliğini tercih edebilirsiniz.

    Gerçek Bir jail.local Örneği#

    Aşağıda üretim ortamı için makul kabul edilebilecek, açıklamalı bir jail.local örneği yer alıyor. ignoreip satırındaki örnek adresi kendi gerçek IP adresinizle değiştirmeyi unutmayın:

    [DEFAULT]
    # Kendi IP adresinizi ve yerel ağı asla banlama
    ignoreip = 127.0.0.1/8 ::1 203.0.113.25
    
    # 10 dakika içinde 4 hatalı denemede 1 saat ban
    bantime  = 1h
    findtime = 10m
    maxretry = 4
    
    # Tekrar eden saldırganları daha uzun banla
    bantime.increment = true
    bantime.factor    = 2
    bantime.maxtime   = 1w
    
    # Ban aksiyonu (modern sistemlerde nftables)
    banaction = nftables-multiport
    backend   = systemd
    
    [sshd]
    enabled = true
    port    = 22
    # Özel SSH portu kullanıyorsanız burada belirtin
    # port  = 2222
    maxretry = 3
    
    [nginx-http-auth]
    enabled = true
    
    [nginx-limit-req]
    enabled = true
    

    Bu yapılandırmada [DEFAULT] bloğundaki değerler tüm jail'ler için geçerli varsayılan olur; her jail bloğu ise kendi özel değeriyle bunları ezebilir. Örneğin SSH için maxretry değerini 3'e düşürerek en kritik servise daha sıkı bir eşik uyguladık. SSH portunuzu değiştirdiyseniz (ki bu güvenlik için önerilen bir uygulamadır — SSH bağlantısı ve güvenliği yazımıza bakın) port satırını mutlaka güncelleyin, aksi halde jail yanlış portu izler.

    WordPress, Nginx ve Apache için Jail Oluşturma#

    Web uygulamalarını korumak için de Fail2ban kullanabilirsiniz. WordPress giriş denemeleri Apache/Nginx erişim loglarına düştüğü için, bu logları izleyen özel bir filtre ve jail tanımlamak yeterlidir. Önce basit bir filtre oluşturun:

    sudo nano /etc/fail2ban/filter.d/wordpress-auth.local
    

    İçine, POST isteğiyle yapılan başarısız giriş satırlarını yakalayan bir kalıp yazabilirsiniz:

    [Definition]
    failregex = ^<HOST>.*"POST /wp-login.php
                ^<HOST>.*"POST /xmlrpc.php
    ignoreregex =
    

    Ardından jail.local dosyanıza karşılık gelen jail'i ekleyin:

    [wordpress-auth]
    enabled  = true
    filter   = wordpress-auth
    port     = http,https
    logpath  = /var/log/nginx/access.log
    maxretry = 5
    findtime = 5m
    bantime  = 2h
    

    Bu jail, beş dakika içinde beşten fazla giriş POST'u gönderen IP'yi iki saat yasaklar. Bu yaklaşım hem wp-login.php üzerinden brute-force'u hem de xmlrpc.php istismarını büyük ölçüde durdurur. WordPress güvenliğinin bütününü ele alan WordPress güvenliği rehberimizde bu önlemi tamamlayan diğer katmanları bulabilirsiniz.

    Durum Kontrolü, Banlıları Görme ve Elle Unban#

    Fail2ban'ı yönettiğiniz ana araç fail2ban-client komutudur. Genel durumu ve etkin jail'leri görmek için:

    sudo fail2ban-client status
    

    Belirli bir jail'in ayrıntısına, o an banlı IP sayısına ve listesine bakmak için jail adını ekleyin:

    sudo fail2ban-client status sshd
    

    Bu komut, toplam başarısız deneme sayısını, o an banlı IP listesini ve kümülatif ban sayısını gösterir. Yanlışlıkla ya da testle banlanmış bir IP'yi elle serbest bırakmak isterseniz:

    sudo fail2ban-client set sshd unbanip 203.0.113.99
    

    Bir IP'yi elle banlamak da mümkündür:

    sudo fail2ban-client set sshd banip 198.51.100.23
    

    Yaptığınız yapılandırma değişikliklerinin devreye girmesi için servisi yeniden yükleyin. reload, aktif banları koruyarak yapılandırmayı tazeler:

    sudo fail2ban-client reload
    

    Loglama ve İzleme#

    Fail2ban kendi etkinliğini /var/log/fail2ban.log dosyasına yazar. Hangi IP'nin ne zaman banlandığını, hangi jail'in tetiklendiğini buradan takip edebilirsiniz:

    sudo tail -f /var/log/fail2ban.log
    

    Çıktıda Ban 203.0.113.99 ve Unban 203.0.113.99 gibi satırlar Fail2ban'ın çalıştığının doğrudan kanıtıdır. Ban ve unban olaylarını düzenli olarak gözlemlemek, hem saldırı yoğunluğunu anlamanıza hem de eşiklerinizi (özellikle maxretry ve bantime) gerçek trafiğe göre kalibre etmenize yardımcı olur. Çok sayıda meşru kullanıcı yanlışlıkla banlanıyorsa eşikleri gevşetin; buna karşılık loglarda hâlâ yoğun deneme görüyorsanız sıkılaştırın.

    Yaygın Hatalar ve Kendini Banlamaktan Kaçınma#

    Fail2ban ile en sık yapılan ve en can sıkıcı hata, yöneticinin kendi IP adresini ignoreip listesine eklememesi ve birkaç yanlış parola sonrası kendini SSH'tan kilitlemesidir. Bunu önlemek için:

    • Kendi statik IP'nizi mutlaka ignoreip'e ekleyin. Dinamik IP kullanıyorsanız ofis/ev ağınızın bloğunu ekleyin veya sunucuya erişim için bir VPN sabit IP'si kullanın.
    • Konsol/VNC erişimini hazır tutun. Yine de kilitlenirseniz, barındırıcınızın sağladığı web konsolu üzerinden sunucuya girip banı elle kaldırabilirsiniz. Clou.TR sunucularında panel üzerinden Console/VNC erişimi bu tür durumlar için her zaman elinizin altındadır.
    • Değişiklikten sonra test edin. sudo fail2ban-client status sshd ile jail'in gerçekten aktif olduğunu ve doğru portu izlediğini doğrulayın.

    Diğer sık hatalar arasında yanlış logpath tanımlamak (jail hiçbir şeyi yakalamaz), özel SSH portunu jail'de belirtmeyi unutmak ve systemd backend'i beklerken dosya tabanlı log yolu vermek yer alır. Bir jail çalışmıyorsa ilk bakılacak yer fail2ban.log'daki hata satırları ve fail2ban-client status <jail> çıktısıdır.

    Son olarak Fail2ban'ın bir sihirli değnek olmadığını unutmayın. O, brute-force gürültüsünü büyük ölçüde susturur ama tek başına yeterli değildir. Güçlü ve benzersiz parolalar için güçlü parola politikası rehberimizi, SSH'ta anahtar tabanlı kimlik doğrulama ve iki faktörlü doğrulama için iki faktörlü doğrulama (2FA) yazımızı okumanızı öneririz. Katmanlı savunma her zaman tek bir aracın önüne geçer.

    Sıkça Sorulan Sorular#

    Fail2ban bir güvenlik duvarının yerine geçer mi?#

    Hayır. Fail2ban bir güvenlik duvarı değil, güvenlik duvarını yöneten akıllı bir tetikleyicidir. Logları izleyip kural ihlali yapan IP'leri nftables veya iptables'a geçici olarak ekler. Sunucunuzda hangi portların açık olacağını hâlâ UFW gibi bir güvenlik duvarıyla belirlemeniz gerekir. İkisi birbirini tamamlar; Fail2ban dinamik ban, güvenlik duvarı ise statik erişim politikası sağlar.

    Fail2ban WordPress giriş denemelerini engelleyebilir mi?#

    Evet. WordPress giriş denemeleri web sunucusunun erişim loguna düştüğü için, wp-login.php ve xmlrpc.php isteklerini yakalayan özel bir filtre ve jail tanımlayarak bu denemeleri sınırlayabilirsiniz. Belirlediğiniz süre içinde eşiği aşan IP'ler otomatik yasaklanır. Bu, bir güvenlik eklentisiyle birlikte kullanıldığında WordPress giriş sayfanızı brute-force'a karşı önemli ölçüde korur.

    Yanlışlıkla kendimi banladım, ne yapmalıyım?#

    Öncelikle barındırıcınızın sunduğu web konsolu veya VNC erişimini kullanarak SSH'a ihtiyaç duymadan sunucuya girin. Ardından sudo fail2ban-client set sshd unbanip <IP> komutuyla kendinizi serbest bırakın. Bir daha yaşamamak için kendi IP adresinizi jail.local içindeki ignoreip listesine ekleyin. Statik IP'niz yoksa güvenli erişim için bir VPN sabit IP'si kullanmak en sağlam çözümdür.

    bantime ve findtime değerlerini nasıl seçmeliyim?#

    Genel bir başlangıç noktası olarak findtime için 10 dakika, maxretry için 3–5 arası ve bantime için 1 saat makuldür. Loglarınızı izleyerek bu değerleri kalibre edin: hâlâ yoğun saldırı görüyorsanız bantime'ı uzatıp maxretry'ı düşürün. Tekrar eden saldırganlar için bantime.increment = true ile üstel artan ban süreleri en etkili yaklaşımdır çünkü ısrarcı botları giderek daha uzun süre uzakta tutar.

    Fail2ban sunucumu yavaşlatır mı?#

    Hayır, Fail2ban son derece hafiftir. Sadece log satırlarını okuyup regex eşleştirmesi yaptığı için kaynak tüketimi ihmal edilebilir düzeydedir. Aksine, engellediği binlerce brute-force denemesi sayesinde saldırı altındaki bir sunucunun CPU ve bant genişliği yükünü azaltarak genellikle performansı iyileştirir. Yüzlerce jail ve çok yüksek trafik dışında performans endişesi yaratmaz.

    Kapanış#

    Fail2ban, birkaç dakikalık kurulum ve dikkatli bir jail.local yapılandırmasıyla sunucunuza yönelen otomatik brute-force saldırılarının büyük bölümünü sessizce durduran, düşük maliyetli ama yüksek etkili bir güvenlik katmanıdır. Doğru eşikler, kendi IP'nizi koruyan bir ignoreip listesi ve düzenli log takibiyle SSH'tan WordPress'e kadar tüm giriş noktalarınızı güçlendirebilirsiniz. Unutmayın: Fail2ban katmanlı savunmanın bir parçasıdır; güçlü parolalar, anahtar tabanlı SSH ve güncel yazılımlarla birleştiğinde gerçek gücüne ulaşır.

    Güvenliği yönetilmiş ve düzenli izlenen bir altyapı arıyorsanız Clou.TR'nin sunucu çözümlerini ve uzman ekibimizin ilgilendiği sunucu yönetimi hizmetini inceleyebilirsiniz. Web sitenizi barındırmak için ise güvenlik önlemleri hazır gelen hosting paketlerimize göz atın.

    Fail2banGüvenlikSunucu

    Uygulamaya geçmeye hazır mısınız?

    NVMe SSD, ücretsiz SSL ve %99.9 uptime garantisiyle Clou.TR hosting ve sunucu çözümleriyle projenizi hayata geçirin.