Fail2ban ile Aktif Koruma
Fail2ban, sunucunuzdaki log dosyalarını sürekli okuyan bir "Güvenlik Bekçisi"dir.
[!CAUTION] > Çakışma Uyarısı: Eğer sunucunuzda CrowdSec yüklü ise Fail2ban kurmayın! İki araç aynı anda çalışırsa Firewall kuralları (iptables/nftables) birbirine girer ve sunucuyu kilitleyebilir. Modern ve daha performanslı bir alternatif için CrowdSec rehberine bakın.
Sık Sorulan Sorular (Önce Burayı Okuyun!)
1. Sadece SSH'ı mı korur?
HAYIR. Fail2ban, log üreten her şeyi koruyabilir.
- SSH: Yanlış şifre deneyenleri banlar.
- Nginx/Apache: 403/404 hatalarını çok alanları veya botları banlar.
- WordPress:
/wp-login.phpsayfasına saldıranları banlar.
2. Kurdum ve "Active" yazıyor, koruyor mu?
HAYIR, henüz değil!
- Fail2ban kurulduğunda varsayılan olarak sadece 22. Portu dinler.
- Biz SSH portunu 2222 yaptığımız için, şu an Fail2ban "havaya bakıyor". Saldırgan 2222'den girip denerse Fail2ban bunu GÖRMEZ.
- Bu yüzden konfigürasyon yapmamız ŞARTTIR.
1. Kurulum ve Kontrol
Önce paketi kurun ve servisin durumuna bakın:
Eğer "active (running)" değilse servisi başlatın:
[!TIP] > Neden
--no-pager? >systemctlnormalde çıktı uzunsa (less) içine girer.--no-pagereklerseniz çıktıyı ekrana basar ve terminale geri döner. Diğer yararlı parametreler:
systemctl status fail2ban -l: Satırları kesmeden (truncate) tüm hatayı gösterir.systemctl status fail2ban -n 50: Son 10 satır yerine son 50 satırı gösterir.
2. Konfigürasyon Mantığı (Nasıl Ayarlayacağız?)
Fail2ban'in ayar dosyasını (jail.conf) ASLA değiştirmeyin. Çünkü güncelleme gelince dosya sıfırlanır, ayarlarınız gider.
Bunun yerine "Parçalı Yönetim" (Modular) yapısını kullanacağız.
Neden jail.d kullanıyoruz?
Tüm ayarları tek bir devasa dosyaya (jail.local) yazmak eski bir yöntemdir. Yönetmesi zordur.
Biz /etc/fail2ban/jail.d/ klasörü altına her servis için ayrı bir dosya koyacağız.
sshd.local: Sadece SSH ayarları.nginx.local: Sadece Nginx ayarları.whitelist.local: Sadece güvenli IP listesi.
Bu sayede bir şeyi kapatmak isterseniz, o dosyayı silmeniz yeterlidir.
Gelecek için Örnekler (Future Proof)
/etc/fail2ban/jail.d/ altına şu dosyaları oluşturabilirsiniz:
1. Nginx Proxy Manager (jail.d/npm.local):
[npm-proxy]
enabled = true
port = 80,443
filter = nginx-proxy-manager
logpath = /data/logs/proxy-host-*.log
maxretry = 3
2. PostgreSQL (jail.d/postgresql.local):
[postgresql]
enabled = true
port = 5432
filter = postgresql
logpath = /var/log/postgresql/postgresql-*-main.log
maxretry = 5
3. MySQL (jail.d/mysql.local):
Her servis için ayrı dosya açmak, yönetimi çocuk oyuncağı yapar.
3. SSH Koruması (Jail Oluşturma)
Hadi ilk parçamızı (modülümüzü) oluşturalım. SSH servisini koruyacak ayarları yapıyoruz. Dosya yoksa oluşacaktır, korkmayın.
Dosyanın içine aşağıdaki ayarları yapıştırın. Port kısmının sizin kullandığınız portla (2222) aynı olduğundan emin olun.
```ini
[sshd]
enabled = true
backend = systemd
port = 2222
maxretry = 5
findtime = 10m
bantime = 1h
# Public Key hatalarını yakalamak için agresif mod şarttır:
mode = aggressive
4. İleri Düzey Kavramlar (Filtreler ve Eylemler)
Fail2ban'in nasıl çalıştığını anlamak için iki kavramı bilmek gerekir:
Filtreler (Filters)
Log dosyasında "neyin saldırı olduğunu" anlayan Regex kurallarıdır. /etc/fail2ban/filter.d/ altında dururlar. Örn: sshd.conf içinde "Failed password" yazısını arayan kurallar vardır. Genelde bunlara dokunmanız gerekmez.
Eylemler (Actions)
Bir IP banlanınca ne olacak?
- action_: Sadece Firewall (iptables/ufw) kuralı ekler (Varsayılan).
- action_mw: Banlar ve
destemailadresine mail atar. - action_mwl: Banlar, mail atar ve mailin içine logları da ekler.
[!NOTE] Mail almak isterseniz sunucuda
sendmailveyapostfixkurulu olmalıdır. Günümüzde sunucudan mail atmak zor olduğu için (SPAM riski), genelde Slack/Discord webhook'ları tercih edilir.
5. Whitelist (Kendini Banlamamak)
Eğer sabit bir IP adresiniz varsa, kendinizi güvenli listeye ekleyebilirsiniz.
En üste IP adresinizi ekleyin (birden fazla IP varsa boşlukla ayırın):
6. Aktifleştirme ve Kontrol
Ayarları geçerli kılmak için servisi yeniden başlatın:
# Konfigürasyonda hata var mı kontrol et
sudo fail2ban-client -t
# Servisi yeniden başlat
sudo systemctl restart fail2ban
Durum Sorgulama
# Genel durum (Hangi hapishaneler aktif?)
sudo fail2ban-client status
# Çıktı: Jail list: sshd
# SSH Jail detayları (Kimler banlanmış?)
sudo fail2ban-client status sshd
Derinlemesine Kontrol (Firewall Seviyesi)
Fail2ban gerçekten iş yapıyor mu? Bunu firewall kurallarına bakarak görebilirsiniz. iptables komutu, UFW kullansanız bile arka plandaki kuralları gösterir:
Çıktıda şuna benzer satırlar görmelisiniz:
-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 2222 -j f2b-sshd
-A f2b-sshd -s 1.2.3.4/32 -j REJECT --reject-with icmp-port-unreachable
(Son satırdaki 1.2.3.4 banlanmış bir saldırgandır).
7. Test Etme (Ban Testi)
Ayarlarınızın çalışıp çalışmadığını test etmek için en güvenli yöntem şudur:
- Farklı Bir Bağlantı Bulun: Telefonunuzun mobil internetini (Hotspot) kullanın.
- Hatalı Giriş Yapın: Mobil internet üzerinden terminal açın (Termius vb.) ve sunucunuza yanlış şifre ile bağlanmayı deneyin.
- Tekrarlayın: 5-6 kez hızlıca yanlış şifre girin.
- Banlanma: Bir süre sonra cevap gelmemeye başlayacak veya "Connection Refused" alacaksınız.
-
Ban Kaldırma (Unban): Şimdi çalışan (Wi-Fi) bağlantınızdan sunucuya dönün ve o banlanan (mobil) IP'yi affedin:
8. Sorun Giderme (Troubleshooting)
İşler ters gittiğinde kontrol etmeniz gerekenler:
Hata: "Failed to access socket"
Komutu yazdınız ve şu hatayı aldınız:
Anlamı: Fail2ban servisi çökmüş (Running değil). Çözümü:
- Servisi başlatmayı deneyin:
sudo systemctl restart fail2ban - Eğer başlamıyorsa, konfigürasyon dosyanızda yazım hatası vardır.
- Hatayı bulmak için:
sudo fail2ban-client -t - Veya detaylı log için:
journalctl -u fail2ban.service -e
Uyarı: "Wrong value for 'maxretry'"
fail2ban-client -t yaptıysanız ve bu uyarıyı görüyorsanız, dosyada bir şeyi yanlış yazdınız.
- Yanlış: Dosyanın en başına
[sshd]etiketi koymayı unutmuş olabilirsiniz. - Yanlış: Satırbaşlarında gereksiz boşluk bırakmış olabilirsiniz.
- Doğru: Her blok mutlaka
[köşeli parantez]ile başlamalıdır.
Hata: Dosya Yanlış Yerde
Dosyalar mutlaka /etc/fail2ban/jail.d/ klasöründe olmalıdır.
Eğer yanlışlıkla /etc/fail2ban/sshd.local (bir üst klasör) oluşturduysanız silin:
Sorun: "Test Ediyorum Banlamıyor"
Terminalden "Permission denied (publickey)" hatası alıyorsunuz ama Fail2ban saymıyor mu?
Sebep: Fail2ban varsayılan olarak "Wrong Password" hatalarına bakar. Public Key hataları daha sessizdir.
Çözüm: Konfigürasyon dosyanıza (sshd.local) şu satırı ekleyin:
Sorun: "iptables Listesinde Göremiyorum"
Eğer iptables -S boş dönüyorsa, sunucunuz nftables kullanıyor olabilir. Şunu deneyin: