fail2ban ile Whitelist ve Kalıcı Engelleme Nasıl Yapılır

Sunucunuzu yoneten herkes bir gun su soruyla karsilasir: “Bu IP’yi sonsuza kadar engellemek istiyorum ama kendi IP’mi de yanlislikla engellemeyeyim.” Fail2ban tam da bu dengeyi saglamak icin guclu aracklar sunar. Whitelist (izin listesi) ve kalici engelleme mekanizmalari dogru yapilandirildiginda, hem yasalmis trafigi korur hem de kotu niyetli erisim girisimlerini kalici olarak kapatirsiniz. Bu yazida bu iki konuyu derinlemesine ele alacagiz.

Fail2ban’in Temel Calisma Mantigi

Fail2ban, log dosyalarini izler, belirlediginiz kurallara uyan basarisiz giris girisimlerini tespit eder ve ilgili IP adresini gecici veya kalici olarak engeller. Varsayilan davranis gecici engelleme yonundedir; bir IP belirli bir sure sonra otomatik olarak serbest birakilir.

Ancak bazi durumlarda bunlar yetmez:

  • Kendi ofis ya da ev IP’nizi yanlislikla engellemek istemezsiniz
  • Tekrar eden saldiricilari kalici olarak kapatmak istersiniz
  • Guvenilir sistem IP’lerinin hicbir zaman ban yememesini istersiniz

Bu noktada ignoreip (whitelist) ve bantime = -1 (kalici ban) devreye girer.

Whitelist: Guvenilir IP’leri Koruma Altina Almak

ignoreip Parametresi Nedir?

ignoreip, fail2ban’a “bu IP adreslerini veya subnetlen hicbir zaman engelleme” deme seklinizdir. Ne kadar cok basarisiz giris denemesi olursa olsun, listenizdeki adresler asla banlanmaz.

Varsayilan yapilandirma dosyasi olan /etc/fail2ban/jail.conf dosyasina dogrudan duzenleme yapmayin. Bunun yerine /etc/fail2ban/jail.local dosyasini kullanin. Bu sayede fail2ban guncellemelerinde ozel ayarlarinizi kaybetmezsiniz.

# Mevcut jail.local dosyasini acin ya da yoksa olusturun
sudo nano /etc/fail2ban/jail.local

Dosyanin [DEFAULT] bolumune asagidaki gibi ekleyin:

[DEFAULT]
# Whitelist: boslukla ayrilmis IP, subnet veya hostname
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 203.0.113.50

# Ornek: Birkac farkli format
# ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16

ignoreip Formatlari

Fail2ban bircok format destekler:

  • 127.0.0.1: Tekil IPv4 adresi
  • ::1: Tekil IPv6 adresi
  • 192.168.1.0/24: CIDR notasyonuyla subnet
  • 10.0.0.0/8: Buyuk bir subnet blogu
  • 203.0.113.50: Uzak bir ofis IP’si
  • my-trusted-host.example.com: Hostname (dikkatli kullanin, DNS degisebilir)

Jail Bazinda Whitelist Tanimlama

Bazi durumlarda global whitelist yetmez, belirli bir servis icin farkli bir liste tanimlamak istersiniz. Ornegin SSH icin extra koruma altindaki IP’ler eklemek:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
# Bu jail icin ek whitelist
ignoreip = 127.0.0.1/8 ::1 10.10.0.0/16 203.0.113.50

Dikkat edin: jail seviyesinde tanimlanan ignoreip, DEFAULT seviyesindekini override eder, birlestirmez. Bu yuzden DEFAULT’taki adresleri de tekrar eklemeniz gerekir.

ignorecommand ile Dinamik Whitelist

Statik IP listeleri her zaman yetmez. Dinamik IP’ye sahip ekip uyeleriniz varsa ignorecommand parametresi hayat kurtarici olur. Bu parametre, bir komutu calistirarak ban kararini dinamik sekilde verir.

[DEFAULT]
# Komut 0 donerse IP whitelist'te sayilir, 0 disinda bir deger donerse ban uygulanir
ignorecommand = /usr/local/bin/check_whitelist.sh <ip>

Ornek bir kontrol scripti:

#!/bin/bash
# /usr/local/bin/check_whitelist.sh
# Kullanim: check_whitelist.sh <ip>

IP="$1"
WHITELIST_FILE="/etc/fail2ban/trusted_ips.txt"

if grep -qF "$IP" "$WHITELIST_FILE" 2>/dev/null; then
    exit 0  # Whitelist'te, engelleme
else
    exit 1  # Whitelist'te degil, kural uygulanabilir
fi
# Scripti calistirilebilir yapin
sudo chmod +x /usr/local/bin/check_whitelist.sh

# Guvenilir IP'leri dosyaya ekleyin
echo "203.0.113.50" | sudo tee -a /etc/fail2ban/trusted_ips.txt
echo "198.51.100.0/24" | sudo tee -a /etc/fail2ban/trusted_ips.txt

Bu yontemle, trusted_ips.txt dosyasini guncelleyerek fail2ban’i yeniden baslatmadan whitelist’i dinamik olarak yonetebilirsiniz.

Kalici Engelleme: bantime = -1

Kalici Ban Nasil Calisir?

Fail2ban’da bantime parametresi, bir IP’nin kac saniye engellenmesi gerektigini belirler. -1 degeri ise “sonsuz sure engelle” anlamina gelir. Bu IP, el ile serbest birakilana kadar engellenmeye devam eder.

[DEFAULT]
# Standart ban suresi: 10 dakika (600 saniye)
bantime = 600

# Kalici ban icin:
# bantime = -1

Belirli bir jail icin kalici ban:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = -1  # SSH icin kalici engelleme

Bu ayar zellikle brute-force saldirilari icin cok etkilidir. SSH’a 3 kez yanlis parola giren bir IP artik hicbir zaman tekrar deneme sansi bulamaz.

Recidive Jail: Tekrar Edenleri Kalici Engelle

Daha akilli bir yaklasim, gecici ban yedikten sonra tekrar saldiranlar icin kalici ban uygulamaktir. Fail2ban’in recidive jail’i tam bu amaca hizmet eder.

[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
action = iptables-allports[name=recidive]
         sendmail-whois-lines[name=recidive, [email protected], logpath=/var/log/fail2ban.log]
bantime = -1          # Kalici engelle
findtime = 86400      # Son 24 saat icerisinde
maxretry = 5          # 5 farkli jail'den ban yemisse

Bu yapilandirmayla bir IP, herhangi bir servis icin 24 saat icerisinde 5 kez ban yerse artik tum portlardan kalici olarak engellenir.

Artimli Ban Suresi: bantime.increment

Fail2ban 0.10 ve sonrasinda gelen bu ozellik, her tekrar ban’da sure katlayan akilli bir sistem sunar:

[DEFAULT]
bantime = 600           # Baslangic: 10 dakika
bantime.increment = true
bantime.factor = 2      # Her seferinde 2 ile carp
bantime.maxtime = 86400 # Maksimum: 1 gun (saniye cinsinden)
# bantime.maxtime = -1  # Veya hic limit koyma, kalici yap

# Sirasiyla: 600s, 1200s, 2400s, 4800s, 9600s, 19200s, 38400s, 86400s

Buna ek olarak veritabani destegi etkinlestirmeniz gerekir:

[DEFAULT]
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 86400  # 1 gun gecmis kayitlari temizle

Gercek Dunya Senaryolari

Senaryo 1: E-ticaret Sunucusu

Bir e-ticaret sitesi yonetiyorsunuz. Odeme sayfaniza kaba kuvvet saldirilari geliyor. Hem gelistirici ekibinizin IP’lerini korumak hem de tekrar eden saldirganlar icin kalici ban uygulamak istiyorsunuz.

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 203.0.113.0/28
# 10.0.0.0/8: ic network, 203.0.113.0/28: ofis subneti

bantime = 3600
bantime.increment = true
bantime.maxtime = -1
bantime.factor = 24
findtime = 600
maxretry = 5
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 604800  # 7 gun

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

[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
action = iptables-allports[name=recidive]
bantime = -1
findtime = 86400
maxretry = 3

Senaryo 2: VPS ile SSH Koruması

Sadece belirli ülkelerden ya da IP bloklarından SSH erisimine izin verdiginiz bir VPS’inizde su konfigurasyonu uygulayabilirsiniz:

[sshd]
enabled = true
port = 2222         # Varsayilan SSH portunu degistirdiniz
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 300      # 5 dakika icinde
bantime = -1        # Kalici ban
ignoreip = 127.0.0.1/8 ::1 YOUR_HOME_IP YOUR_OFFICE_IP

Mevcut Banları Yonetme

Kalici ban uyguladiktan sonra yonetim komutlarini bilmek kritik onem tasiyor.

# Tum aktif jail'leri listele
sudo fail2ban-client status

# Belirli bir jail'in durumunu goster
sudo fail2ban-client status sshd

# Manuel olarak bir IP'yi kalici banla
sudo fail2ban-client set sshd banip 198.51.100.42

# Bir IP'yi serbest birak (unban)
sudo fail2ban-client set sshd unbanip 198.51.100.42

# Recidive jail'inden unban
sudo fail2ban-client set recidive unbanip 198.51.100.42

# Bir IP'nin banli olup olmadigini kontrol et
sudo fail2ban-client get sshd banip | grep 198.51.100.42

Whitelist ve Ban Konfigurasyonunu Test Etme

Yapilandirmanizin dogru calisip calismadigini test etmek icin fail2ban’in yerlesik araclarini kullanin.

# Konfigurasyonu test et (servisi yeniden baslatmadan)
sudo fail2ban-client --test

# Belirli bir filtreyi test et
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

# Whitelist'in calismasi icin log simulasyonu
# once regex testinde ignore durumunu gormek icin verbose mod
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf --print-all-ignored

# Degisiklikleri yaptiktan sonra servisi yeniden yukle
sudo systemctl reload fail2ban
# veya
sudo fail2ban-client reload

Fail2ban logunu canli takip etmek:

# Fail2ban logunu canli izle
sudo tail -f /var/log/fail2ban.log

# Belirli bir IP icin filtreleme
sudo tail -f /var/log/fail2ban.log | grep "192.168.1.100"

# Son ban islemlerini goster
sudo grep "Ban" /var/log/fail2ban.log | tail -20

Kalici Banlarin Iptables’taki Yansimasi

Fail2ban ban uyguladiginda arka planda iptables (ya da nftables) kurallari olusturur. Bunu dogrulamak icin:

# Fail2ban'in olusturdugu iptables zincirlerini goster
sudo iptables -L -n | grep -A 20 "f2b"

# Belirli bir IP icin kural var mi kontrol et
sudo iptables -L -n | grep "198.51.100.42"

# Fail2ban zincirine bakilabilir
sudo iptables -L f2b-sshd -n --line-numbers

Kalici banlarda sunucu yeniden baslatildiginda iptables kurallari temizlenir. Fail2ban servisi baslarken kendi veritabanindan (SQLite) ban listesini okur ve kurallari yeniden olusturur. Bu nedenle dbfile parametresinin dogru ayarlanmis olmasi kritiktir.

# Veritabanini kontrol et
sudo sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "SELECT ip, jail, timeofban FROM bans ORDER BY timeofban DESC LIMIT 20;"

# Kalici banlari listele (timeunban = -1 olanlari)
sudo sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "SELECT ip, jail FROM bans WHERE timeunban < 0;"

Tam Ornek: Production Hazir Konfigurasyonu

Asagida tipik bir web sunucusu icin hazir bir jail.local ornegi bulunuyor:

# /etc/fail2ban/jail.local
# Son guncelleme: Production yapilandirmasi

[DEFAULT]
# Whitelist: Hicbir zaman banlanmayacak adresler
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16

# Veritabani: Ban gecmisini sakla
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 1209600  # 14 gun

# Artimli ban
bantime = 3600
bantime.increment = true
bantime.factor = 24
bantime.maxtime = -1  # Sonunda kalici ban

findtime = 600
maxretry = 5

# Varsayilan aksiyon: ban + bildirim
action = %(action_mwl)s

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 120

[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10

[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = -1  # Bot taramalari icin direkt kalici ban

[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
action = iptables-allports[name=recidive]
bantime = -1
findtime = 86400
maxretry = 5

Degisiklikleri uygulayin:

# Konfigurasyonu dogrula
sudo fail2ban-client --test

# Servisi yeniden baslat
sudo systemctl restart fail2ban

# Durumu kontrol et
sudo fail2ban-client status

Sik Yapilan Hatalar ve Cozumleri

Kendi IP’nizi yanlislikla banlamak: Bu en klasik hatalardan biridir. Her zaman ignoreip parametresini kendi IP’nizle test etmeden once ayarlayin. Eger kendinizi banladiysaniz:

# Dogrudan iptables uzerinden acin (sunucu konsolundan)
sudo iptables -D f2b-sshd -s SIZIN_IP -j REJECT
# ya da fail2ban uzerinden
sudo fail2ban-client set sshd unbanip SIZIN_IP

jail.local yerine jail.conf duzenleme: Sistem guncelleme geldiginde jail.conf ezilir. Daima jail.local kullanin.

Recidive jail logpath hatasi: Recidive jail, fail2ban’in kendi logunu okur. Log dosyasinin yolu ve fail2ban’in yazdigi format eslesmelidir. Sisteminizdeki gercek yolu dogrulayin:

sudo grep "logpath" /etc/fail2ban/jail.d/defaults-debian.conf 2>/dev/null
# veya
sudo cat /etc/fail2ban/paths-common.conf | grep fail2ban

Sonuc

Fail2ban’in whitelist ve kalici engelleme ozelliklerini dogru konfigure etmek, sunucu guvenliginizin omurgasini olusturur. ignoreip ile guvenilir adresleri koruma altina alirken, bantime = -1 ve recidive jail kombinasyonuyla tekrar eden saldirganlar icin sifir tolerans politikasi uygulayabilirsiniz. Artimli ban suresi ozelligi ise iki ucu kesen bir klicin zekica kullanimidir: ilk hataya bicak gibi inmez, ama israrci olanlari sonunda tamamen kilitler.

En onemli nokta su: Bu ayarlari production’a almadan once test ortaminda mutlaka deneyin ve konfigurasyonunuzu versiyon kontrolune (git) alin. Bir gun gelir log dosyasi konum degisir, filter guncellemesi gelir ya da ekip arkadasi jail.conf uzerine yazar; o gun guncel yedek ve net yapilandirma tarihiniz hayat kurtarir.

Yorum yapın