Brute Force Saldırılarını Engelleme: iptables Limit Modülü

Sunucunu internete açtığın an, brute force saldırıları kaçınılmaz bir gerçek haline gelir. SSH portunu dinleyen botlar, dakikalar içinde binlerce parola denemesi yapar. WordPress login sayfalarına yönelik otomatik saldırılar, web sunucusunu felç edebilir. İşte tam bu noktada iptables’ın limit ve hashlimit modülleri devreye girer. Bu yazıda, bu modülleri kullanarak brute force saldırılarını nasıl etkili biçimde engelleyeceğini, gerçek dünya senaryolarıyla birlikte ele alacağız.

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

Brute force saldırısı, bir sisteme erişim kazanmak için sistematik olarak tüm olası kombinasyonları deneyen bir yöntemdir. SSH için parola denemesi, HTTP form submit flood’u veya DNS sorgu bombardımanı bu kategoriye girer.

Bir VPS açtığında ilk 24 saat içinde SSH portuna yönelik binlerce deneme görmek olağandır. Shodan ve benzeri araçlarla internetdeki açık portlar sürekli taranmaktadır. Zayıf bir parolayla birleşince bu durum felaket olabilir.

iptables’ın limit modülü, belirli bir zaman diliminde kabul edilecek paket sayısını sınırlamana izin verir. hashlimit modülü ise bunu kaynak IP bazında yapmanı sağlar; yani her saldırganı ayrı ayrı izleyebilirsin.

iptables Limit Modülüne Giriş

Temel Kavramlar

-m limit modülü, token bucket algoritmasına dayanır. Bunu şöyle düşün: bir kova var, her saniye belirli sayıda token ekleniyor. Her kabul edilen paket bir token harcıyor. Kova boşaldığında yeni paketler reddediliyor.

İki temel parametre:

  • –limit rate: Saniye, dakika veya saat başına kabul edilecek maksimum paket sayısı (örn: 5/min, 100/sec, 10/hour)
  • –limit-burst N: Başlangıçta veya sessiz dönemlerde biriktirilebilecek maksimum token sayısı (varsayılan: 5)

İlk Basit Örnek

# SSH portuna dakikada en fazla 5 bağlantı denemesine izin ver
iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min --limit-burst 10 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

Bu kuralın mantığını anlamak önemli: İlk kural, limiti aşmayan paketleri kabul eder. Limit dolduğunda bu kural eşleşmez ve paket ikinci kurala düşer, orada DROP edilir. --limit-burst 10 sayesinde başlangıçta 10 pakete izin verilir, sonrası dakikada 5’e düşer.

SSH Brute Force Koruması

SSH brute force, en yaygın saldırı türlerinden biridir. Gerçek bir senaryodan bahsedelim: Bir müşterimin sunucusuna baktığımda /var/log/auth.log dosyasında saatte 3000’den fazla başarısız giriş denemesi görüyordum. Sunucu CPU’su gereksiz yere %15-20 civarında seyrediyordu.

Temel SSH Koruması

# Yeni bağlantıları takip etmek için önce state modülünü kullan
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH_BRUTE
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update 
  --seconds 60 --hitcount 4 --name SSH_BRUTE -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Bu yöntemde recent modülü her IP’nin son 60 saniyedeki bağlantı sayısını takip eder. 4’ü aşarsa o IP’den gelen paketler düşürülür.

hashlimit ile Daha Güçlü SSH Koruması

hashlimit modülü, limit modülünün kaynak IP bazında çalışan versiyonudur. Bu sayede meşru kullanıcılar saldırıdan etkilenmez.

# Önce mevcut kuralları temizle
iptables -F INPUT

# Loopback'e izin ver
iptables -A INPUT -i lo -j ACCEPT

# Kurulmuş bağlantılara izin ver
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH için hashlimit - her IP'den dakikada en fazla 3 yeni bağlantı
iptables -A INPUT -p tcp --dport 22 -m state --state NEW 
  -m hashlimit 
  --hashlimit-above 3/min 
  --hashlimit-burst 5 
  --hashlimit-mode srcip 
  --hashlimit-name ssh_brute 
  -j DROP

# Limiti geçmeyenlere izin ver
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

hashlimit parametrelerini açıklayalım:

  • –hashlimit-above 3/min: Dakikada 3’ü aşarsa eşleş
  • –hashlimit-burst 5: Başlangıçta 5 pakete kadar tolerans tanı
  • –hashlimit-mode srcip: Kaynak IP bazında takip et
  • –hashlimit-name ssh_brute: Kernel’ın /proc/net/ipt_hashlimit/ altında kullanacağı isim

HTTP/HTTPS Brute Force Koruması

Web uygulamalarına yönelik brute force saldırıları farklı bir boyut taşır. WordPress login, phpMyAdmin veya özel bir API endpoint’i hedef alınabilir. Buradaki zorluk, tek bir IP’nin çok sayıda istek atabilmesidir.

WordPress Login Koruması

# HTTP ve HTTPS portlarına yönelik hız sınırlama
# Önce özel bir zincir oluştur
iptables -N HTTP_LIMIT

# Bu zincire HTTP trafiğini yönlendir
iptables -A INPUT -p tcp --dport 80 -j HTTP_LIMIT
iptables -A INPUT -p tcp --dport 443 -j HTTP_LIMIT

# HTTP_LIMIT zincirinde hashlimit uygula
iptables -A HTTP_LIMIT -m hashlimit 
  --hashlimit-above 50/sec 
  --hashlimit-burst 200 
  --hashlimit-mode srcip 
  --hashlimit-name http_limit 
  -j DROP

iptables -A HTTP_LIMIT -j ACCEPT

Bu kurallar bir kullanıcının saniyede 50’den fazla istek göndermesini engeller. Normal bir kullanıcı için bu limit son derece yüksektir, ama bot trafiğini etkili biçimde keser.

API Rate Limiting

Bir REST API’yi koruyan kurallar biraz daha spesifik olabilir:

# API portuna (örneğin 8080) dakikada 30 istek limiti
iptables -A INPUT -p tcp --dport 8080 -m state --state NEW 
  -m hashlimit 
  --hashlimit-above 30/min 
  --hashlimit-burst 50 
  --hashlimit-mode srcip 
  --hashlimit-name api_limit 
  -j REJECT --reject-with tcp-reset

Burada DROP yerine REJECT kullandım. Meşru istemcilere hemen hata dönmesi, zaman aşımı bekleme süresini ortadan kaldırır.

ICMP ve Port Scan Koruması

Ping flood ve port tarama saldırıları da brute force kategorisinde değerlendirilebilir. ICMP paketlerini tamamen engellemek yerine sınırlandırmak daha sağlıklı bir yaklaşımdır; çünkü ping, ağ sorunlarını teşhis etmek için gereklidir.

# ICMP ping flood koruması - saniyede en fazla 5 ping
iptables -A INPUT -p icmp --icmp-type echo-request 
  -m limit --limit 5/sec --limit-burst 10 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

# Port tarama tespiti - yeni bağlantılarda agresif hız sınırlama
iptables -A INPUT -p tcp --syn 
  -m limit --limit 1/sec --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

FTP Brute Force Koruması

FTP hala pek çok sunucuda aktif, özellikle paylaşımlı hosting ortamlarında. FTP brute force saldırıları da son derece yaygın.

# FTP kontrol portu için bağlantı limiti
iptables -A INPUT -p tcp --dport 21 -m state --state NEW 
  -m hashlimit 
  --hashlimit-above 5/min 
  --hashlimit-burst 8 
  --hashlimit-mode srcip 
  --hashlimit-name ftp_brute 
  -j DROP

iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT

Kapsamlı Güvenlik Duvarı Scripti

Yukarıdaki tüm kuralları bir araya getiren, üretime alınabilir bir script yazalım. Bu scripti gerçek sunucularda kullandığım yapıdan uyarladım.

#!/bin/bash
# firewall-brute-force.sh
# Brute force koruması icin kapsamli iptables kuralları

# Degiskenler
SSHPORT="22"
HTTPPORT="80"
HTTPSPORT="443"

echo "[*] Mevcut kurallar temizleniyor..."
iptables -F
iptables -X
iptables -Z

echo "[*] Varsayilan politikalar ayarlaniyor..."
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

echo "[*] Temel kurallar ekleniyor..."
# Loopback
iptables -A INPUT -i lo -j ACCEPT

# Kurulu baglantilara izin ver
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Gecersiz paketleri duşur
iptables -A INPUT -m state --state INVALID -j DROP

echo "[*] ICMP koruması ayarlaniyor..."
iptables -A INPUT -p icmp --icmp-type echo-request 
  -m limit --limit 5/sec --limit-burst 10 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -p icmp -j ACCEPT

echo "[*] SSH brute force koruması ayarlaniyor..."
iptables -N SSH_PROTECT 2>/dev/null
iptables -F SSH_PROTECT
iptables -A SSH_PROTECT -m state --state NEW 
  -m hashlimit 
  --hashlimit-above 3/min 
  --hashlimit-burst 5 
  --hashlimit-mode srcip 
  --hashlimit-name ssh_brute 
  -j LOG --log-prefix "[SSH-BRUTE-FORCE] " --log-level 4
iptables -A SSH_PROTECT -m state --state NEW 
  -m hashlimit 
  --hashlimit-above 3/min 
  --hashlimit-burst 5 
  --hashlimit-mode srcip 
  --hashlimit-name ssh_brute 
  -j DROP
iptables -A SSH_PROTECT -j ACCEPT
iptables -A INPUT -p tcp --dport $SSHPORT -j SSH_PROTECT

echo "[*] HTTP/HTTPS koruması ayarlaniyor..."
iptables -N HTTP_PROTECT 2>/dev/null
iptables -F HTTP_PROTECT
iptables -A HTTP_PROTECT -m hashlimit 
  --hashlimit-above 100/sec 
  --hashlimit-burst 300 
  --hashlimit-mode srcip 
  --hashlimit-name http_limit 
  -j DROP
iptables -A HTTP_PROTECT -j ACCEPT
iptables -A INPUT -p tcp --dport $HTTPPORT -j HTTP_PROTECT
iptables -A INPUT -p tcp --dport $HTTPSPORT -j HTTP_PROTECT

echo "[*] Portlari son haline getiriliyor..."
iptables -A INPUT -p tcp --dport $SSHPORT -j ACCEPT
iptables -A INPUT -p tcp --dport $HTTPPORT -j ACCEPT
iptables -A INPUT -p tcp --dport $HTTPSPORT -j ACCEPT

echo "[+] Firewall kurallari basariyla yuklendi."
iptables -L -n -v --line-numbers

Scripti çalıştırmadan önce:

chmod +x firewall-brute-force.sh
# Test ortamında dene, sonra üretime al
bash firewall-brute-force.sh

Kuralları Kalıcı Hale Getirme

iptables kuralları, sunucu yeniden başlatıldığında silinir. Bunu önlemek için birkaç yöntem var.

Debian/Ubuntu Üzerinde

# iptables-persistent paketini kur
apt-get install iptables-persistent -y

# Mevcut kurallari kaydet
netfilter-persistent save

# Servis durumunu kontrol et
systemctl status netfilter-persistent

# Kurallar şu dosyalara kaydedildi
# /etc/iptables/rules.v4
# /etc/iptables/rules.v6

RHEL/CentOS/Rocky Linux Üzerinde

# iptables-services paketini kur
yum install iptables-services -y

# Servisi etkinlestir
systemctl enable iptables
systemctl start iptables

# Kurallari kaydet
service iptables save

# Veya dogrudan kaydet
iptables-save > /etc/sysconfig/iptables

Log Analizi ile Saldırıları İzleme

Kurallarını koydun, ama ne kadar etkili olduklarını nasıl anlarsın? LOG hedefi ile engellenen paketleri izleyebilirsin.

# SSH brute force denemelerini logla
iptables -I INPUT 1 -p tcp --dport 22 -m state --state NEW 
  -m recent --update --seconds 60 --hitcount 4 
  -j LOG --log-prefix "[SSH-BLOCK] " --log-level 4

# Logları takip et
tail -f /var/log/kern.log | grep "SSH-BLOCK"
# veya
journalctl -f | grep "SSH-BLOCK"

Log çıktısından saldırgan IP’leri çıkarmak için:

# Son 1 saatteki saldırgan IP'leri listele
grep "SSH-BLOCK" /var/log/kern.log | 
  grep -oP 'SRC=K[d.]+' | 
  sort | uniq -c | sort -rn | head -20

Bu komutu çalıştırdığımda genellikle şaşırtıcı sonuçlar görürüm: Çin, Rusya ve bazı Doğu Avrupa ülkelerinden onlarca farklı IP, sürekli deneme yapıyor. hashlimit sayesinde bunların hiçbiri sunucuya ulaşamıyor.

Mevcut Kuralları Test Etme

Kuralların doğru çalıştığını doğrulamak için hping3 aracını kullanabilirsin. Bunu kendi sunucunu test etmek için kullan, asla başkasının sunucusunda deneme.

# Başka bir makineden test (kendi sunucuna karsi)
# hping3 ile SYN flood simülasyonu
hping3 -S -p 22 --flood --rand-source SUNUCU_IP

# Normal bir makineden SSH bağlantı denemelerini say
for i in {1..10}; do
  ssh -o ConnectTimeout=3 kullanici@SUNUCU_IP 2>&1
  sleep 0.5
done

Kurallar doğru çalışıyorsa 4-5. denemeden sonra bağlantılar DROP edilecek ve zaman aşımına uğrayacak.

Gerçek Dünya Sorunları ve Çözümleri

Meşru Kullanıcıları Kilitleme Sorunu

Çalıştığım bir e-ticaret projesinde, müşteri servis ekibi sürekli SSH oturumu açıp kapatıyordu. Agresif hashlimit kuralları onları da kilitledi. Çözüm şuydu: Beyaz listeye güvenilir IP’leri eklemek.

# Ofis IP'sini (veya VPN IP'sini) beyaz listeye al
OFFICE_IP="203.0.113.50"
iptables -I INPUT 1 -s $OFFICE_IP -p tcp --dport 22 -j ACCEPT

# Birden fazla IP için
for IP in "203.0.113.50" "198.51.100.10" "192.0.2.25"; do
  iptables -I INPUT 1 -s $IP -j ACCEPT
done

hashlimit Tablosunu İzleme

# Aktif hashlimit kayıtlarını göster
cat /proc/net/ipt_hashlimit/ssh_brute

# Tüm hashlimit tablolarını listele
ls /proc/net/ipt_hashlimit/

Bu dosyayı düzenli izlemek, saldırı altında hangi IP’lerin en aktif olduğunu anlamana yardımcı olur.

fail2ban ile iptables Entegrasyonu

iptables limit kuralları anlık koruma sağlar, ama kalıcı engelleme için fail2ban ile birlikte kullanmak çok daha güçlü bir çözüm sunar.

# fail2ban kurulumu
apt-get install fail2ban -y

# SSH jail konfigürasyonu
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 3
backend = auto

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

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

systemctl restart fail2ban
systemctl enable fail2ban

# Aktif ban'leri kontrol et
fail2ban-client status sshd

fail2ban, başarısız giriş girişimlerini log dosyalarından okuyarak iptables’a otomatik DROP kuralları ekler. iptables limit modülü anlık flood’u durdururken, fail2ban ısrarcı saldırganları uzun süre engeller. İkisi birlikte mükemmel bir çift oluşturur.

Performans Konuları

Çok sayıda iptables kuralı sistemi yavaşlatabilir. Limit ve hashlimit modülleri görece hafif olsa da dikkat edilmesi gereken noktalar var.

  • Kural sırası önemlidir: En çok eşleşen kuralları listenin başına koy. Kurulmuş bağlantılar için ESTABLISHED/RELATED kuralı her zaman en üstte olmalı.
  • Özel zincirler kullan: SSH korumasını SSH_PROTECT zincirine, HTTP korumasını HTTP_PROTECT zincirine ayırarak organize et. Hem okunabilirlik hem performans açısından iyidir.
  • conntrack tablosunu izle: cat /proc/sys/net/netfilter/nf_conntrack_count komutuyla aktif bağlantı sayısını takip et. Maksimuma yaklaşıyorsa /proc/sys/net/netfilter/nf_conntrack_max değerini artır.
  • hashlimit tablosu boyutu: Çok sayıda farklı IP’den trafik alıyorsan --hashlimit-htable-size ve --hashlimit-htable-max parametrelerini artır.

ipset ile Ölçeklenebilir Engelleme

Binlerce IP’yi engellemen gerekiyorsa, her biri için ayrı iptables kuralı yerine ipset kullanmak çok daha verimlidir.

# ipset kurulumu
apt-get install ipset -y

# Kara liste seti oluştur
ipset create blacklist hash:ip maxelem 100000

# Saldırgan IP'yi ekle
ipset add blacklist 192.168.1.100

# iptables kuralıyla entegre et
iptables -I INPUT 1 -m set --match-set blacklist src -j DROP

# Otomatik ekleme scripti
grep "SSH-BLOCK" /var/log/kern.log | 
  grep -oP 'SRC=K[d.]+' | 
  sort -u | while read ip; do
    ipset add blacklist $ip 2>/dev/null
done

Sonuç

iptables’ın limit ve hashlimit modülleri, brute force saldırılarına karşı ilk savunma hattını oluşturur. Doğru yapılandırıldığında sunucunun kaynaklarını korur, saldırganları yavaşlatır ve meşru kullanıcıların etkilenmemesini sağlar.

Özetlemek gerekirse:

  • limit modülü genel trafik akışını sınırlamak için idealdir, basit senaryolarda yeterlidir
  • hashlimit modülü IP bazında sınırlama yaparak meşru kullanıcıları korur, tercih ettiğim yöntemdir
  • recent modülü bağlantı geçmişini takip ederek daha akıllı kararlar almana olanak tanır
  • fail2ban entegrasyonu kalıcı engelleme için vazgeçilmezdir
  • ipset büyük ölçekli engelleme listelerini verimli yönetmeni sağlar

Sunucunu internete açmadan önce bu kuralları mutlaka uygula. Bir test ortamında dene, logları incele, gerekirse eşik değerlerini ayarla ve sonra üretime al. Brute force saldırıları durdurulamaz ama etkisiz hale getirilebilir; bu modüller tam olarak bunun için var.

Son olarak şunu söyleyeyim: Güvenlik katmanlı bir yaklaşım gerektirir. iptables tek başına yeterli değildir. Güçlü parolalar, SSH anahtar tabanlı kimlik doğrulama, fail2ban, düzenli güncellemeler ve log izleme birlikte kullanıldığında gerçek bir güvenlik sağlanabilir.

Yorum yapın