Fail2ban kurulumu: SSH'i parola kaba kuvvetinden koruma
Fail2ban, servislerin günlüklerini okur, tekrarlanan başarısız giriş denemelerini bulur ve saldırganın IP adresini güvenlik duvarı üzerinden geçici olarak engeller. SSH'i korumak için paketi kurup /etc/fail2ban/jail.local dosyasına [sshd] bölümünü (enabled = true, maxretry, findtime, bantime) yazmak ve servisi yeniden başlatmak yeterlidir; durum fail2ban-client status sshd ile kontrol edilir.
Fail2ban, servislerin günlüklerini izleyen, tekrarlanan başarısız giriş denemelerini fark eden ve bunların geldiği IP adresini kısa süreliğine engelleyen bir servistir. SSH için bu, parola kaba kuvvetine karşı en basit korumadır: botlar birkaç hatadan sonra sunucuyu zorlamayı bırakır. Aşağıda fail2ban kurulumu, kurulumdan ban kontrolüne ve engeli kaldırmaya kadar anlatılıyor; tipik hatalar da var.
SSH anahtarı varken fail2ban neden gerekli
22. portu açık olan her sunucu, açıldıktan birkaç dakika sonra giriş denemeleri almaya başlar. Kendiniz bakabilirsiniz:
$ sudo journalctl -u ssh --since "1 hour ago" | grep -c "Failed password"
412
Parolayla giriş kapalıysa ve yalnızca anahtarlar kullanılıyorsa, erişimi tahmin etmek neredeyse imkânsızdır. Yine de fail2ban faydalıdır: günlükteki gürültüyü azaltır, binlerce bağlantının yükünü hafifletir ve parola girişinin yanlışlıkla yeniden açılması gibi yapılandırma hatalarına karşı korur. Bu anahtarların yerini almaz, ikinci bir katmandır.
Fail2ban nasıl çalışır
Mantık üç parçadan oluşur:
- Filtre (filter) — başarısız denemeyi gösteren günlük satırlarını bulan ve içinden IP'yi çıkaran düzenli ifadeler. Filtreler
/etc/fail2ban/filter.d/dizinindedir. - Eylem (action) — ihlal edene ne yapılacağı: iptables, nftables, ufw veya firewalld'ye kural eklemek. Eylemler
/etc/fail2ban/action.d/dizinindedir. - Hapishane (jail) — filtrenin, eylemin, günlük kaynağının ve eşiklerin birleşimi. Örneğin
sshdjail'i SSH günlüğünü izler.
findtime süresi içinde bir IP'den maxretry kadar eşleşme gelirse, adres bantime süresince engellenir. Süre dolunca engel kendiliğinden kalkar.
Fail2ban kurulumu
Debian ve Ubuntu'da:
sudo apt update
sudo apt install fail2ban
RHEL, Rocky, AlmaLinux'ta paket EPEL deposundadır:
sudo dnf install epel-release
sudo dnf install fail2ban
Açılışta otomatik başlatmayı açın ve servisin durumunu kontrol edin:
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
Debian ve Ubuntu'da SSH jail'i /etc/fail2ban/jail.d/defaults-debian.conf üzerinden varsayılan olarak açıktır. RHEL ailesinde kurulumdan sonra hiçbir jail açık değildir; onları elle etkinleştirmeniz gerekir.
Ayarlar nerede: jail.conf ve jail.local
Ana dosya /etc/fail2ban/jail.conf'tur, ama bunu düzenlemeyin: paket güncellendiğinde üzerine yazılır. Kendi ayarlarınızı /etc/fail2ban/jail.local veya /etc/fail2ban/jail.d/*.local dosyalarına yazın. Fail2ban dosyaları şu sırayla okur ve her sonraki, önceki değeri geçersiz kılar:
jail.confjail.d/*.confjail.localjail.d/*.local
jail.conf'un tamamını jail.local'a kopyalamayın — eski varsayılan değerleri dondurmuş olursunuz. jail.local dosyasına yalnızca değiştirdiklerinizi yazın.
SSH için fail2ban kurulumu: minimal jail.local
Dosyayı oluşturun:
sudo nano /etc/fail2ban/jail.local
İçine şunu ekleyin:
[DEFAULT]
# Hiçbir zaman engellenmeyecek adresler
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime = 1h
findtime = 10m
maxretry = 5
# Günlük kaynağı: systemd journal veya dosyalar
backend = systemd
[sshd]
enabled = true
port = ssh
maxretry = 3
Servisi yeniden başlatın ve jail'in ayağa kalktığını kontrol edin:
$ sudo systemctl restart fail2ban
$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
Parametrelerin anlamı
| Parametre | Anlamı | Örnek |
|---|---|---|
enabled | jail etkin mi | true |
port | ihlal edene engellenecek port(lar) | ssh, 2222, ssh,2222 |
maxretry | engellemeden önce izin verilen hata sayısı | 3 |
findtime | hataların sayıldığı zaman penceresi | 10m |
bantime | engelleme süresi; -1 — kalıcı | 1h, 1d |
ignoreip | engellenmeyecek adresler ve alt ağlar | 10.0.0.0/8 |
backend | günlük kaynağı | systemd, auto |
logpath | dosya tabanlı backend için günlük dosyasının yolu | /var/log/auth.log |
banaction | engellemek için hangi güvenlik duvarı kullanılır | nftables-multiport, ufw |
Süreler s, m, h, d, w ekleriyle yazılabilir. Ek olmayan sayılar saniye kabul edilir.
backend: systemd mi yoksa dosya mı
Debian 12 ve Ubuntu 24.04'te rsyslog kurulu değilse /var/log/auth.log dosyası olmayabilir: SSH günlükleri yalnızca systemd journal'da tutulur. Bu durumda backend = systemd gerekir; aksi halde fail2ban, günlük dosyası bulunamadığı hatasıyla başlamaz. rsyslog kuruluysa dosya tabanlı seçenek de kullanılabilir:
[sshd]
enabled = true
backend = auto
logpath = /var/log/auth.log
RHEL sistemlerinde karşılık gelen dosya /var/log/secure'dur.
Standart olmayan portta SSH
sshd, örneğin 2222 portunu dinliyorsa, bunu jail'de belirtin; aksi halde fail2ban 22. portu engeller, saldırı ise 2222'de sürer:
[sshd]
enabled = true
port = 2222
İhlal edenin tüm portlarını birden engellemek için banaction parametresiyle iptables-allports veya nftables-allports eylemi kullanılabilir.
Güvenlik duvarı seçimi: iptables, nftables, ufw, firewalld
Debian'da varsayılan banaction = nftables'tır (eski sürümlerde iptables), RHEL'de firewalld. Sunucuda ufw yapılandırılmışsa, engellerin ufw'de görünmesi daha kullanışlıdır:
[DEFAULT]
banaction = ufw
firewalld için:
[DEFAULT]
banaction = firewallcmd-rich-rules
Kuralların gerçekten eklendiğini sudo nft list ruleset | grep f2b veya sudo iptables -L -n | grep f2b ile görebilirsiniz: fail2ban, f2b- önekli zincirler oluşturur.
Çalışmayı kontrol etme: fail2ban-client status
Ana yönetim aracı fail2ban-client'tır. Belirli bir jail'in durumu:
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 147
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 4
|- Total banned: 38
`- Banned IP list: 45.148.10.12 92.118.39.7 185.224.128.40 218.92.0.112
Buradan şu anda pencerede kaç hata olduğunu, kaç IP'nin engellendiğini ve bunların hangileri olduğunu görürsünüz. Korumayı canlı test etmek için başka bir makineden (ignoreip içinde olmayan) birkaç kez yanlış parolayla giriş deneyin — üçüncü denemeden sonra bağlantı kurulamaz.
Fail2ban'ın kendi günlüğü /var/log/fail2ban.log dosyasındadır:
$ sudo tail -n 3 /var/log/fail2ban.log
2026-10-14 09:12:41,118 fail2ban.filter [812]: INFO [sshd] Found 218.92.0.112
2026-10-14 09:12:44,302 fail2ban.filter [812]: INFO [sshd] Found 218.92.0.112
2026-10-14 09:12:47,551 fail2ban.actions [812]: NOTICE [sshd] Ban 218.92.0.112
fail2ban'da IP engeli nasıl kaldırılır
Kendinizi veya bir meslektaşınızı yanlışlıkla engellediyseniz, engeli sunucunun konsolundan (sağlayıcı paneli veya başka bir IP üzerinden) kaldırın:
sudo fail2ban-client set sshd unbanip 203.0.113.25
Tüm jail'lerdeki tüm engelleri kaldırmak için:
sudo fail2ban-client unban --all
Filtrenin tetiklenmesini beklemeden bir adresi elle engellemek için:
sudo fail2ban-client set sshd banip 198.51.100.7
Aynı sorunun tekrarlanmaması için kendi sabit adreslerinizi veya ofis alt ağınızı ignoreip'e ekleyin.
Tekrarlayan ihlalciler için artan engelleme süresi
Birçok bot, engel kalkar kalkmaz geri döner. Sürüm 0.11'den itibaren fail2ban, tekrarlayan ihlalciler için engelleme süresinin artmasını destekler:
[DEFAULT]
bantime = 1h
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 4w
Aynı IP'nin her yeni engeli bir öncekinden daha uzun olur, ama dört haftayı geçmez. Eski sürümler için alternatif, kendi günlüğünü okuyan ve birden fazla kez yakalanan adresleri uzun süre engelleyen recidive jail'idir:
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5
Filtreyi test etme: fail2ban-regex
Jail çalışıyor ama kimseyi engellemiyorsa, filtrenin günlükte gerçekten satır bulup bulmadığını kontrol edin. Dosya günlüğü için:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
systemd journal için:
sudo fail2ban-regex systemd-journal sshd
Çıktıda Lines: ... matched satırına bakın. Sıfır eşleşme, filtrenin günlük biçimine uymadığı veya yanlış kaynağın seçildiği anlamına gelir. Yeniden başlatmadan önce tüm yapılandırmanın sözdizimini de kontrol etmek iyidir:
sudo fail2ban-client -t
Tipik hatalar
- Servis başlamıyor: «Have not found any log file for sshd jail».
/var/log/auth.logyok.backend = systemdayarlayın veya rsyslog kurun. - Durumda engeller var ama saldırı sürüyor. Yanlış port belirtilmiş (SSH taşınmış) veya güvenlik duvarı kuralları daha önceki bir izin kuralıyla çakışıyor.
portdeğerini venft list rulesetçıktısını kontrol edin. - Değişiklikler uygulanmadı.
jail.confdüzenlenmiş, amajail.localveyajail.d/*.localiçinde başka bir değer var. Etkin değeri görün:sudo fail2ban-client get sshd maxretry. - Kendinizi engellediniz. Konsoldan engeli kaldırın ve IP'nizi
ignoreip'e ekleyin. - Docker'daki fail2ban saldırıları görmüyor. Konteyner portları INPUT'u atlayan DOCKER zinciri üzerinden yayımlanır. Bu tür servisler için eylemde
chain = DOCKER-USERkullanın.
SSH'i korumak için başka neler yapılabilir
Fail2ban, /etc/ssh/sshd_config içindeki temel önlemlerle birlikte iyi çalışır:
PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3
Değişiklikten sonra sudo sshd -t ile yapılandırmayı kontrol edin ve servisi yeniden başlatın. Yeni oturumda anahtarla girişin çalıştığını doğrulayana kadar mevcut oturumunuzu kapatmayın. Ayrıca güvenlik duvarında SSH erişimini yalnızca gerekli adreslerle sınırlayabilirsiniz.
Sonuç
Fail2ban kurulumu birkaç adımdır: paketi kurun, [sshd] bölümü olan bir jail.local oluşturun, doğru backend'i ve portu seçin, maxretry, findtime ve bantime değerlerini belirleyin, kendi adreslerinizi ignoreip'e ekleyin ve fail2ban-client status sshd ile çalışmayı doğrulayın. Yalnızca anahtarla girişle birlikte bu, SSH'i parola kaba kuvvetinden güvenilir biçimde korur. Sunucu koruması ve fail2ban kurstaki Linux uygulamalarında ele alınır.
Sık sorulan sorular
Parolalı giriş kapalıysa fail2ban'a ihtiyaç var mı?
Zorunlu değil, ama faydalı: binlerce anlamsız denemeyi günlüklerden temizler, yükü azaltır ve parola girişi yanlışlıkla yeniden açılırsa ek koruma sağlar.
Tüm jail'lerdeki engellenmiş IP'leri nasıl görürüm?
sudo fail2ban-client banned komutunu çalıştırın; her jail için engellenen adreslerin listesini verir. Tek bir jail için fail2ban-client status sshd kullanın.
Sunucu yeniden başlatıldıktan sonra engeller korunur mu?
Evet. fail2ban engelleri kendi SQLite veritabanında (/var/lib/fail2ban/fail2ban.sqlite3) tutar ve dbpurgeage bunları daha önce silmediyse açılışta geri yükler.
Fail2ban yalnızca SSH'i mi koruyabilir?
Hayır, paketle birlikte nginx, Apache, Postfix, Dovecot ve diğer servisler için filtreler gelir. Gerekli jail'i jail.local içinde etkinleştirmek yeterlidir, örneğin enabled = true ile [nginx-http-auth].
Fail2ban ile güvenlik duvarındaki kısıtlama arasındaki fark nedir?
Güvenlik duvarı adresleri sabit olarak izinli veya yasaklı yapar, fail2ban ise günlüklerde kötü davranış gösterenleri dinamik olarak engeller. Çoğunlukla birlikte kullanılırlar: güvenlik duvarında beyaz liste, geri kalanı için fail2ban.
Bu konu “Linux: с нуля до уверенного администрирования” kursunda uygulamalı olarak ayrıntılı işleniyor.
Kursa git