Fail2ban kurulumu, internete açık bir Linux sunucusunda yapılacak ilk beş işten biridir. Sunucunuzu açtığınız günün akşamında /var/log/auth.log dosyasını okuyun; Çin’den, Hollanda’dan, Brezilya’dan gelen yüzlerce başarısız SSH giriş denemesi göreceksiniz. Kimse size özel saldırmıyor. Bunlar bütün IPv4 alanını tarayan otomatik botlar ve durmuyorlar.
Fail2ban işte bu trafiği kesiyor. Günlük dosyalarını satır satır okuyor, belirlediğiniz süre içinde belirlediğiniz sayıdan fazla başarısız deneme yapan IP adresini güvenlik duvarına yazıyor ve o adres bir süre sunucuya hiç ulaşamıyor. Kurulumu iki komut, doğru yapılandırması ise on beş dakika sürüyor.
Bu rehberde Ubuntu 24.04 üzerinden ilerleyeceğiz; Debian 12 ve AlmaLinux/Rocky farklarını ayrıca vereceğiz. jail.local ayarları, ssh brute force engelleme mantığı, artan ban süreleri, beyaz liste, güvenlik duvarı entegrasyonu ve dağıtıma göre değişen günlük kaynağı — hepsi sırayla. Sunucunuza henüz bağlanmadıysanız önce SSH bağlantı rehberine göz atın.
Fail2ban Ne Yapar, Ne Yapmaz?#
Çalışma mantığı üç adımdan ibaret: oku, say, engelle. Bir “jail” (hapishane) tanımı, hangi günlük kaynağının okunacağını, hangi desenin başarısız deneme sayılacağını ve engellemenin nasıl uygulanacağını belirtir. Desenler /etc/fail2ban/filter.d/ altındaki filtre dosyalarında düzenli ifadelerle yazılıdır; sshd, nginx, postfix, dovecot ve daha onlarcası hazır gelir.
Ama şunu baştan netleştirelim, çünkü çok karıştırılıyor:
- Yapar: Kaba kuvvet ve sözlük saldırılarını yavaşlatır, günlükleri temiz tutar, CPU ve bant genişliği israfını azaltır, saldırı denemelerini kayıt altına alır.
- Yapmaz: DDoS engellemez. Fail2ban günlüğe düşen satırları okur; saniyede yüz binlerce paket gönderen bir hacim saldırısı günlüğe bile ulaşmaz. Onun için ağ seviyesinde DDoS koruması gerekir.
- Yapmaz: Zayıf parolayı güçlendirmez. Botun 3 denemede tutturabileceği bir parola kullanıyorsanız Fail2ban sizi kurtarmaz.
- Yapmaz: Sıfırıncı gün açığını kapatmaz. Güncel paket, doğru izin ve dar güvenlik duvarı hâlâ zorunlu.
Ubuntu 24.04’e Fail2ban Kurulumu#
Paket resmî depolarda hazır. Ek depo eklemeye gerek yok.
sudo apt update && sudo apt install -y fail2ban
# systemd günlüğünü okuyacaksanız Python bağlayıcısı da gerekir
sudo apt install -y python3-systemd
# Servisi başlat ve açılışta çalışacak şekilde etkinleştir
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
# Sürümü kontrol edin
fail2ban-client --version
Kurulumdan hemen sonra Fail2ban çalışmaya başlar ama Ubuntu’da varsayılan olarak hiçbir jail etkin değildir. Yani kurdunuz diye korunuyor sayılmazsınız; sshd jail’ini elle açmanız gerekiyor. Bir sonraki bölümde tam olarak bunu yapacağız.
Debian 12#
Komutlar birebir aynıdır. Tek fark, bazı minimal Debian imajlarında rsyslog kurulu gelmez; bu durumda /var/log/auth.log dosyası hiç oluşmaz ve dosya tabanlı okuma çalışmaz. Çözümü backend = systemd ayarında, aşağıda anlatıyoruz.
AlmaLinux ve Rocky Linux#
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalld
sudo systemctl enable --now fail2ban
RHEL ailesinde paket EPEL deposundan gelir. fail2ban-firewalld paketi, banların firewalld üzerinden uygulanması için gereken tanımı /etc/fail2ban/jail.d/ altına kendisi bırakır. Günlük dosyası /var/log/auth.log değil /var/log/secure’dur; sistemde journald baskın olduğu için genelde backend = systemd kullanılır.
jail.local Ayarları ve sshd Jail’ini Etkinleştirme#
Neden jail.conf değil de jail.local?#
Bu, Fail2ban’de yeni başlayanların düştüğü bir numaralı tuzak. /etc/fail2ban/jail.conf dosyası paketle gelir ve her paket güncellemesinde üzerine yazılır. Oraya yazdığınız ayarlar bir gün, siz farkına bile varmadan silinir.
Doğru yöntem, kendi ayarlarınızı ayrı bir dosyaya koymaktır. Fail2ban dosyaları şu sırayla okur ve sonrakiler öncekileri geçersiz kılar:
/etc/fail2ban/jail.conf— paketin varsayılanları, dokunmayın/etc/fail2ban/jail.d/*.conf— paketlerin bıraktığı parça dosyalar/etc/fail2ban/jail.local— sizin dosyanız
jail.conf’un tamamını jail.local’a kopyalamayın; bu da yaygın bir hata. Sadece değiştirdiğiniz satırları yazın, gerisi varsayılanlardan gelir. Böylece dosyanız on satır kalır ve altı ay sonra baktığınızda neyi neden değiştirdiğinizi anlarsınız.
sudo nano /etc/fail2ban/jail.local
sshd jail’i ve temel ayarlar#
Aşağıdaki içerik, tek başına çalışan makul bir başlangıç yapılandırmasıdır. IP adresini kendi sabit adresinizle değiştirin.
[DEFAULT]
# Beyaz liste: bu adresler asla banlanmaz
ignoreip = 127.0.0.1/8 ::1 203.0.113.55
# Kaç deneme, ne kadar sürede, ne kadar ban
maxretry = 5
findtime = 10m
bantime = 1h
# Günlük kaynağı (dağıtıma göre değişir, aşağıya bakın)
backend = systemd
# UFW kullanıyorsanız banlar ufw kurallarına yazılsın
banaction = ufw
banaction_allports = ufw
[sshd]
enabled = true
port = 22
maxretry = 3
findtime = 10m
bantime = 24h
# Yapılandırmayı yükle
sudo fail2ban-client reload
# Gerçekte hangi değerlerin geçerli olduğunu gör
sudo fail2ban-client get sshd maxretry
sudo fail2ban-client get sshd bantime
sudo fail2ban-client get sshd ignoreip
| Ayar | Ne yapar | Önerilen | Not |
|---|---|---|---|
enabled | Jail’i açar/kapatır | true | Ubuntu’da varsayılan kapalıdır |
maxretry | Ban için gereken başarısız deneme sayısı | 3 | 2’ye düşürmek yanlış banları artırır |
findtime | Denemelerin sayıldığı zaman penceresi | 10m | Uzatmak yavaş saldırıları da yakalar |
bantime | Ban süresi | 1h – 24h | -1 kalıcı ban demektir |
ignoreip | Hiç banlanmayacak adresler | Kendi IP’niz | Boşlukla ayrılır, CIDR kabul eder |
port | Jail’in kapatacağı port | 22 veya özel | SSH portunu değiştirdiyseniz burayı da güncelleyin |
backend | Günlüğün nereden okunacağı | systemd | Dosya için auto veya polling |
[sshd] bölümündeki port satırını da güncelleyin. Aksi hâlde Fail2ban denemeleri saymaya devam eder ama banı yanlış porta uygular ve saldırgan rahatça bağlanmaya devam eder. Ban’ın hiç işe yaramadığı durumların çoğu bu tek satırdan kaynaklanıyor.Ban Süresi: Artan Ban ve Kalıcı Ban#
Sabit bir saatlik ban, ısrarcı botlara karşı zayıf kalır: süre dolar, bot geri gelir, tekrar denemeye başlar. Fail2ban’in bantime.increment özelliği bu döngüyü kırar — aynı IP her yakalandığında ban süresi katlanarak uzar.
[DEFAULT]
bantime = 1h
# Tekrar eden IP'lerde ban süresi büyüsün
bantime.increment = true
bantime.rndtime = 5m
bantime.maxtime = 5w
bantime.multipliers = 1 5 30 60 300 720 1440 2880
# Ban geçmişi erken silinmesin, yoksa çarpan sıfırlanır
dbpurgeage = 10w
Bu tanımla ilk ban 1 saat, ikincisi 5 saat, üçüncüsü 30 saat sürer ve üst sınır olan 5 haftaya kadar tırmanır. bantime.rndtime süreye rastgele bir sapma ekler; böylece banın ne zaman düşeceğini kestirip tam o anda geri gelen botlar şaşar.
dbpurgeage satırı önemli. Fail2ban ban geçmişini /var/lib/fail2ban/fail2ban.sqlite3 veritabanında tutar ve varsayılan olarak eski kayıtları bir gün sonra temizler. Temizlenirse çarpan sıfırdan başlar, yani artan ban özelliği fiilen çalışmaz. Değeri bantime.maxtime’dan büyük tutun.
# Kalıcı ban: süre dolmaz
[sshd]
enabled = true
bantime = -1
Durumu Görme, Ban Kaldırma ve Beyaz Liste#
fail2ban-client status ile durum#
# Hangi jail'ler açık?
sudo fail2ban-client status
# Belirli bir jail'in ayrıntısı
sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 418
| `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
|- Currently banned: 6
|- Total banned: 37
`- Banned IP list: 198.51.100.7 198.51.100.23 203.0.113.99
“Total failed” değeri artıyor ama “Total banned” sıfırda kalıyorsa filtre günlüğü okuyor fakat eşleşme bulamıyordur — bu genellikle backend ya da filtre sorunudur. İkisi de sıfırsa jail hiç çalışmıyordur. Ayırt etmesi kolay, tanısı hızlı.
Banı elle kaldırma ve elle ban#
# Tek adresi tüm jail'lerden çıkar
sudo fail2ban-client unban 203.0.113.55
# Belirli bir jail'den çıkar
sudo fail2ban-client set sshd unbanip 203.0.113.55
# Bütün banları temizle (dikkatli kullanın)
sudo fail2ban-client unban --all
# Bir adresi elle banla
sudo fail2ban-client set sshd banip 198.51.100.7
Kendi IP’nizi beyaz listeye alma#
ignoreip satırı, listelenen adreslerin sayaca hiç girmemesini sağlar. Sabit IP’niz varsa mutlaka ekleyin; ofis ağınız için tüm bloğu verebilirsiniz.
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.55 198.51.100.0/24 ofis.example.com
# Sunucunun kendi adreslerini otomatik atla (varsayılan açık)
ignoreself = true
ignoreip sizi tam korumaz; IP’niz değişince beyaz liste anlamsız hâle gelir. Bu yüzden panelin KVM/VNC konsoluna nasıl eriştiğinizi şimdiden öğrenin. Kendinizi banlarsanız tek çıkış yolu orasıdır. Erişemiyorsanız destek talebi açmanız gerekir.Güvenlik Duvarıyla Birlikte Çalışma#
Fail2ban kendi başına paket engellemez; işi güvenlik duvarına yaptırır. Hangi aracı kullanacağı banaction ayarıyla belirlenir.
| Sistem | Önerilen banaction | Kontrol komutu |
|---|---|---|
| Ubuntu / Debian + UFW | ufw | sudo ufw status numbered |
| Ubuntu / Debian, UFW yok | iptables-multiport | sudo iptables -S | grep f2b |
| nftables kullananlar | nftables-multiport | sudo nft list ruleset | grep f2b |
| AlmaLinux / Rocky | firewallcmd-rich-rules | sudo firewall-cmd --list-rich-rules |
# UFW ile birlikte kullanıyorsanız önce UFW ayakta olmalı
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw enable
sudo ufw status numbered
# Fail2ban'in eklediği kuralları görün
sudo iptables -S | grep f2b
sudo nft list ruleset | grep -i f2b
İki aracın çakışması diye birşey yok. Fail2ban kendi zincirini kural setinin başına ekler; banlı bir paket UFW’nin “allow 22” kuralına ulaşmadan düşer. Sıralama böyle olduğu için ikisi aynı anda sorunsuz çalışır. Güvenlik duvarı tarafını sıfırdan kuracaksanız UFW ve iptables rehberi gerekli komutları veriyor.
iptables komutu aslında arka planda nftables’a yazar (iptables-nft uyumluluk katmanı). Bu yüzden iptables-multiport eylemi de sorunsuz çalışır; ayrı bir şey yapmanıza gerek yok. Kuralları hangi araçla listelediğinize göre çıktı farklı görünebilir, panik yapmayın.Log Kaynağı ve backend Ayarı#
Fail2ban’in en sık takıldığı yer burası. Servis “çalışıyor” görünür, jail “etkin” yazar, ama tek bir ban bile gelmez — çünkü okuduğu yerde günlük yoktur.
| Dağıtım | SSH günlüğü | Uygun backend |
|---|---|---|
| Ubuntu 24.04 (rsyslog kurulu) | /var/log/auth.log | auto veya systemd |
| Ubuntu / Debian minimal imaj | Dosya yok | systemd |
| Debian 12 | /var/log/auth.log | auto veya systemd |
| AlmaLinux / Rocky | /var/log/secure | systemd |
| Konteyner / kesilmiş imajlar | Değişken | systemd |
Servis açılmıyorsa ve “Failed during configuration: Have not found any log file for sshd jail” hatası alıyorsanız tanı nettir: dosya tabanlı okuma denenmiş, dosya bulunamamıştır. Çözüm backend = systemd.
# Filtre günlükte gerçekten eşleşiyor mu, test edin
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
sudo fail2ban-regex systemd-journal /etc/fail2ban/filter.d/sshd.conf
# Servisin kendi günlüğü
sudo tail -f /var/log/fail2ban.log
sudo journalctl -u fail2ban -f
# Yalnızca ban satırları
sudo grep " Ban " /var/log/fail2ban.log | tail -20
fail2ban-regex çıktısındaki “Lines: … matched” satırı sıfır gösteriyorsa filtre günlükle konuşmuyor demektir. Bu araç, tahmin yürütmek yerine kesin cevap verdiği için sorun giderirken ilk başvuracağınız komut olmalı.
ssh.service yerine ssh@0-... biçiminde birim adlarıyla düşer ve systemd arka ucunda hiç eşleşme görmezsiniz. Böyle bir durumda /etc/fail2ban/jail.local içindeki [sshd] bölümüne journalmatch = _COMM=sshd satırını ekleyin.SSH Portunu Değiştirmek Ne Kadar İşe Yarar?#
Forumlarda en çok verilen tavsiye bu: “22’yi kapat, 2222’ye al, kurtul.” Doğrusunu söyleyelim — işe yarar ama sandığınız kadar değil.
Port değiştirmenin gerçek faydası gürültü azaltmaktır. IPv4 alanının tamamında 22 numaralı portu tarayan botların büyük çoğunluğu başka bir porta bakmaz; günlükleriniz temizlenir, Fail2ban daha az çalışır, disk ve CPU tasarrufu olur. Bu küçümsenecek bir kazanç değil.
Faydası olmayan yer ise güvenliktir. Modern tarama araçları 65 bin portun tamamını dakikalar içinde geçiyor; hedefli bir tarayıcı sizin 2222’nizi de bulur. Yani port değişikliği bir kilit değil, kapının önündeki paspasın altına saklanmış anahtar gibi: rastgele geçenleri şaşırtır, arayanı durdurmaz.
| Önlem | Otomatik botlara etkisi | Hedefli saldırıya etkisi | Öncelik |
|---|---|---|---|
Anahtar tabanlı giriş + PasswordAuthentication no | Tamamen keser | Çok yüksek | 1 |
| Güvenlik duvarında dar kural | Yüksek | Yüksek | 2 |
| Fail2ban | Yüksek | Orta | 3 |
| Root girişini kapatma | Orta | Orta | 4 |
| SSH portunu değiştirme | Orta (gürültü azaltır) | Düşük | 5 |
Sıralama açık: önce SSH anahtarı oluşturup parola girişini kapatın, sonra Fail2ban’i kurun, port değişikliğini en sona bırakın. Anahtar tabanlı girişe geçmiş bir sunucuda parola denemesi zaten hiçbir zaman başarılı olamaz — Fail2ban orada güvenlik değil, temizlik görevi görür. Portu yine de değiştirecekseniz port açma ve test etme sayfası doğrulama adımlarını veriyor.
Kurulumdan Sonra: İzleme ve Bakım#
Fail2ban kur-unut türü bir araç değil. Ayda bir bakmak yeterli ama bakmak gerekiyor.
# En çok banlanan adresler
sudo grep " Ban " /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head
# Şu an banlı olanlar
sudo fail2ban-client status sshd
# Yapılandırma değişikliğinden sonra
sudo fail2ban-client reload sshd
# Tam yapılandırma dökümü (hata ararken)
sudo fail2ban-client -d | grep sshd
- Yanlış banları izleyin. Kendi ekibinizden biri sürekli banlanıyorsa
maxretrydeğeri fazla dar olabilir. - Veritabanı boyutuna bakın. Artan ban kullanıyorsanız
/var/lib/fail2ban/fail2ban.sqlite3zamanla büyür;dbpurgeagebunu dengeler. - Diğer servisler için jail açın. Web paneli, posta sunucusu veya Nginx kullanıyorsanız hazır filtreler var;
ls /etc/fail2ban/filter.d/ile listeleyin. - Genel izlemeye bağlayın. Ban sayısındaki ani sıçrama bir saldırının habercisidir; sunucu izleme rehberindeki araçlarla uyarı kurabilirsiniz.
Yeni bir sunucu teslim aldıysanız Fail2ban’i tek başına düşünmeyin; VDS ilk ayarlar listesindeki adımların bir parçası olarak uygulayın. Günlük dosyalarını okumakta zorlanıyorsanız Linux temel komutları sayfası grep, tail ve journalctl kullanımını örneklerle anlatıyor. Oyun sunucusu işletenler için aynı sıkılaştırma mantığı geçerli; Minecraft sunucu güvenliği sayfasında oyun tarafındaki ek başlıklar var. Sunucu tarafında Ryzen tabanlı VDS paketleri kullanıyorsanız Fail2ban’in kaynak tüketimi hissedilir düzeyde bile değildir; birkaç MB bellek ve ihmal edilebilir CPU.
Özetle#
Fail2ban kurulumu Ubuntu 24.04’te sudo apt install -y fail2ban ile başlar, sudo systemctl enable --now fail2ban ile biter. Ama kurmak yetmez: Ubuntu’da jail’ler varsayılan olarak kapalı gelir, sshd jail’ini /etc/fail2ban/jail.local dosyasına enabled = true yazarak siz açarsınız. jail.conf dosyasına hiç dokunmayın, güncellemede kaybolur.
Dört ayar işin özü: maxretry kaç denemede banlanacağını, findtime bu denemelerin hangi pencerede sayılacağını, bantime ne kadar süreceğini, ignoreip ise kimin hiç banlanmayacağını belirler. Israrcı botlar için bantime.increment = true ve yeterince büyük bir dbpurgeage ekleyin. Durumu fail2ban-client status sshd ile görür, yanlış banı fail2ban-client unban IP ile kaldırırsınız.
Ban gelmiyorsa ilk bakılacak yer backend ayarıdır; günlük kaynağı dağıtıma göre değişir ve modern imajlarda systemd çoğu zaman doğru cevaptır. Son olarak beklentinizi doğru kurun: Fail2ban gürültüyü keser ve kaynak kazandırır, DDoS engellemez, zayıf parolayı kurtarmaz. Sunucunuzu gerçekten kapatan şey anahtar tabanlı SSH girişidir; Fail2ban onun üstüne konan sağlam ama ikincil bir katmandır. Portu değiştirmek ise listenin en altında — hala faydalı, ama en az.