iptables ile Log Tutma ve Saldırı Tespiti

Bir sunucuyu yönetirken en büyük korkulardan biri, sisteminize birinin sızdığını ancak bunu haftalarca fark etmemenizdir. iptables sadece paketleri engellemekle kalmaz, aynı zamanda ağ trafiğiniz hakkında son derece değerli log kayıtları üretebilir. Bu logları doğru yapılandırıp analiz ettiğinizde, brute force saldırılarını, port taramalarını ve şüpheli aktiviteleri gerçek zamanlı olarak tespit edebilirsiniz. Bu yazıda iptables log mekanizmasını derinlemesine inceleyecek, gerçek dünya senaryoları üzerinden saldırı tespit sistemleri kuracağız.

iptables LOG Hedefi Nasıl Çalışır?

iptables’ın LOG hedefi, diğer hedeflerden (ACCEPT, DROP, REJECT) farklı olarak terminating bir hedef değildir. Yani bir paket LOG kuralıyla eşleştiğinde kural zincirinde ilerlemeye devam eder. Bu önemli bir detay çünkü önce loglayıp sonra aynı paketi farklı bir kuralla işleyebilirsiniz.

Log kayıtları varsayılan olarak kernel mesajları aracılığıyla /var/log/kern.log veya /var/log/syslog dosyasına, ya da journalctl ile görüntülenebilen systemd journal’a yazılır. rsyslog veya syslog-ng kullanıyorsanız bu kayıtları ayrı dosyalara yönlendirebilirsiniz.

# Temel LOG kuralı yapısı
iptables -A INPUT -j LOG --log-prefix "IPT-INPUT: " --log-level 4

# Log seviyelerini görmek için
# 0: emerg, 1: alert, 2: crit, 3: err, 4: warning, 5: notice, 6: info, 7: debug

–log-prefix: Log satırının başına eklenecek önek. Maksimum 29 karakter. Filtreleme için kritik öneme sahip.

–log-level: Syslog öncelik seviyesi. Genellikle 4 (warning) veya 6 (info) kullanılır.

–log-tcp-options: TCP seçeneklerini de loglar.

–log-ip-options: IP başlık seçeneklerini loglar.

–log-uid: Paketi gönderen yerel sürecin UID’ini loglar.

Log Dosyalarını Ayrı Tutmak

Güvenlik loglarını sistem loglarından ayırmak hem analizi kolaylaştırır hem de log rotasyonu için esneklik sağlar. rsyslog kullanıyorsanız şu yapılandırmayı ekleyin:

# /etc/rsyslog.d/10-iptables.conf dosyası oluşturun
cat << 'EOF' > /etc/rsyslog.d/10-iptables.conf
:msg, contains, "IPT-" /var/log/iptables.log
& stop
EOF

# rsyslog servisini yeniden başlatın
systemctl restart rsyslog

# Log dosyası oluştu mu kontrol edin
tail -f /var/log/iptables.log

Log rotasyonu için de bir kural ekleyelim:

cat << 'EOF' > /etc/logrotate.d/iptables
/var/log/iptables.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}
EOF

Gerçek Dünya Senaryosu 1: SSH Brute Force Tespiti

Bir web sunucusu yönetiyorsunuz ve akşam raporlarınızda SSH portuna yüzlerce başarısız giriş denemesi görüyorsunuz. iptables’ı hem bu saldırıları engellemek hem de loglamak için kullanabilirsiniz.

# Önce mevcut SSH kurallarını temizleyelim (dikkatli olun!)
# Yeni zincir oluştur
iptables -N SSH_BRUTE

# SSH trafiğini bu zincire yönlendir
iptables -A INPUT -p tcp --dport 22 -j SSH_BRUTE

# Son 60 saniye içinde 4'ten fazla bağlantı kuran IP'leri logla ve engelle
iptables -A SSH_BRUTE -m recent --name SSH_ATTACK --update --seconds 60 --hitcount 4 -j LOG 
  --log-prefix "IPT-SSH-BRUTE: " --log-level 4

iptables -A SSH_BRUTE -m recent --name SSH_ATTACK --update --seconds 60 --hitcount 4 -j DROP

# İlk bağlantıyı recent listesine ekle ve geçir
iptables -A SSH_BRUTE -m recent --name SSH_ATTACK --set -j ACCEPT

Bu yapılandırmayla brute force denemeleri hem engellenecek hem de loglanacak. Log dosyasında şöyle bir çıktı göreceksiniz:

Jan 15 03:24:11 webserver01 kernel: IPT-SSH-BRUTE: IN=eth0 OUT= MAC=... SRC=185.220.101.45 DST=192.168.1.10 LEN=60 TOS=0x00 PREC=0x00 TTL=49 ID=12453 DF PROTO=TCP SPT=54832 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0

Gerçek Dünya Senaryosu 2: Port Tarama Tespiti

Nmap gibi araçlarla yapılan port taramalarını tespit etmek için birkaç farklı yaklaşım kullanabilirsiniz. NULL, FIN ve XMAS paketleri normal iletişimde kullanılmaz, bu yüzden bunları görmek hemen alarm zili çaldırmalıdır.

# NULL paket taraması tespiti (hiçbir flag yok)
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j LOG 
  --log-prefix "IPT-NULL-SCAN: " --log-level 4
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# XMAS taraması tespiti (FIN, PSH, URG flagleri set)
iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j LOG 
  --log-prefix "IPT-XMAS-SCAN: " --log-level 4
iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP

# FIN taraması tespiti
iptables -A INPUT -p tcp --tcp-flags ALL FIN -j LOG 
  --log-prefix "IPT-FIN-SCAN: " --log-level 4
iptables -A INPUT -p tcp --tcp-flags ALL FIN -j DROP

# SYN-FIN kombinasyonu (geçersiz)
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG 
  --log-prefix "IPT-SYNFIN-SCAN: " --log-level 4
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

Log Analizi için Bash Scriptleri

Ham log dosyaları binlerce satırdan oluşabilir. Anlamlı bilgi çıkarmak için basit ama etkili scriptler yazalım.

#!/bin/bash
# /usr/local/bin/iptables-report.sh
# Günlük güvenlik raporu üretir

LOG_FILE="/var/log/iptables.log"
REPORT_DATE=$(date '+%Y-%m-%d')
echo "=== iptables Güvenlik Raporu: $REPORT_DATE ==="
echo ""

# En çok saldıran IP'ler
echo "--- TOP 10 SALDIRGAN IP ---"
grep "$REPORT_DATE" "$LOG_FILE" | 
  grep -oP 'SRC=K[0-9.]+' | 
  sort | uniq -c | sort -rn | head -10

echo ""

# Saldırı türlerine göre istatistik
echo "--- SALDIRI TÜRLERİ ---"
for prefix in "SSH-BRUTE" "NULL-SCAN" "XMAS-SCAN" "FIN-SCAN" "SYNFIN-SCAN" "PORT-SCAN"; do
  count=$(grep "$REPORT_DATE" "$LOG_FILE" | grep -c "IPT-$prefix" 2>/dev/null || echo 0)
  echo "$prefix: $count olay"
done

echo ""

# En çok hedef alınan portlar
echo "--- EN ÇOK HEDEF ALINAN PORTLAR ---"
grep "$REPORT_DATE" "$LOG_FILE" | 
  grep -oP 'DPT=K[0-9]+' | 
  sort | uniq -c | sort -rn | head -10

Bu scripti cron ile her gün sabah gönderecek şekilde ayarlayabilirsiniz:

chmod +x /usr/local/bin/iptables-report.sh

# Her gün 07:00'de çalıştır ve mail gönder
echo "0 7 * * * root /usr/local/bin/iptables-report.sh | mail -s 'iptables Günlük Rapor' [email protected]" 
  >> /etc/crontab

ICMP Flood ve DDoS Tespiti

Ping flood saldırıları küçük altyapıları felç edebilir. Rate limiting ile hem koruma hem de loglama yapabilirsiniz:

# ICMP için özel zincir
iptables -N ICMP_CHECK

iptables -A INPUT -p icmp -j ICMP_CHECK

# Saniyede 5'ten fazla ping paketini logla
iptables -A ICMP_CHECK -p icmp --icmp-type echo-request 
  -m limit --limit 5/second --limit-burst 10 -j ACCEPT

# Limiti aşanları logla
iptables -A ICMP_CHECK -p icmp --icmp-type echo-request -j LOG 
  --log-prefix "IPT-ICMP-FLOOD: " --log-level 4

# Limiti aşanları düşür
iptables -A ICMP_CHECK -p icmp --icmp-type echo-request -j DROP

# Diğer ICMP tiplerini kabul et (unreachable, TTL exceeded vs.)
iptables -A ICMP_CHECK -p icmp -j ACCEPT

Gerçek Zamanlı İzleme ve Otomatik Engelleme

Logları sadece izlemek yetmez, şüpheli IP’leri otomatik olarak engelleyecek bir mekanizma kurmak çok daha etkilidir. Aşağıdaki script sürekli çalışarak log dosyasını izler ve belirlenen eşiği aşan IP’leri otomatik engeller:

#!/bin/bash
# /usr/local/bin/auto-block.sh
# Aktif saldırganları otomatik engeller

LOG_FILE="/var/log/iptables.log"
THRESHOLD=20        # Bu sayının üzerinde olay varsa engelle
CHECK_WINDOW=300    # Son 5 dakikayı kontrol et
WHITELIST="192.168.1.0/24 10.0.0.1"  # Asla engellenmeyecek IP'ler

# Gerekli komutları kontrol et
command -v iptables &>/dev/null || { echo "iptables bulunamadı"; exit 1; }

# Beyaz liste kontrolü
is_whitelisted() {
  local ip=$1
  for entry in $WHITELIST; do
    if [[ "$ip" == "$entry" ]]; then
      return 0
    fi
  done
  return 1
}

# Son CHECK_WINDOW saniyedeki logları analiz et
SINCE=$(date -d "$CHECK_WINDOW seconds ago" '+%b %e %H:%M' 2>/dev/null || 
        date -v-${CHECK_WINDOW}S '+%b %e %H:%M')

# Şüpheli IP'leri bul
grep "IPT-" "$LOG_FILE" | 
  grep -oP 'SRC=K[0-9.]+' | 
  sort | uniq -c | sort -rn | 
  while read count ip; do
    if [ "$count" -gt "$THRESHOLD" ]; then
      if is_whitelisted "$ip"; then
        echo "$(date): $ip beyaz listede, atlanıyor"
        continue
      fi
      # Zaten engellenmiş mi?
      if ! iptables -C INPUT -s "$ip" -j DROP &>/dev/null; then
        iptables -I INPUT 1 -s "$ip" -j DROP
        echo "$(date): $ip ENGELLENDI ($count olay)" | 
          tee -a /var/log/auto-block.log
      fi
    fi
  done

Bu scripti systemd service olarak çalıştırmak production ortamı için daha sağlıklıdır:

cat << 'EOF' > /etc/systemd/system/auto-block.service
[Unit]
Description=iptables Otomatik Engelleme Servisi
After=network.target

[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do /usr/local/bin/auto-block.sh; sleep 60; done'
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable auto-block
systemctl start auto-block

Log Üretimini Optimize Etmek

Yoğun trafikli sunucularda kontrolsüz loglama disk dolmasına veya syslog servisinin boğulmasına neden olabilir. Birkaç optimizasyon tekniği:

# Log rate limiting - aynı kuraldan saniyede max 5 log üret
iptables -A INPUT -p tcp --dport 22 
  -m limit --limit 5/minute --limit-burst 10 
  -j LOG --log-prefix "IPT-SSH: " --log-level 4

# Belirli bir IP aralığından gelen trafiği logla (hedefli analiz)
iptables -A INPUT -s 185.220.0.0/16 
  -j LOG --log-prefix "IPT-TOR-EXIT: " --log-level 4

# Yeni bağlantıları logla, kurulmuş olanları değil (gürültüyü azaltır)
iptables -A INPUT -m state --state NEW 
  -j LOG --log-prefix "IPT-NEW-CONN: " --log-level 6

# FORWARD zincirinde de loglama (router/firewall senaryosu için)
iptables -A FORWARD -m state --state INVALID 
  -j LOG --log-prefix "IPT-INVALID-FWD: " --log-level 4

fail2ban ile Entegrasyon

fail2ban, iptables loglarını okuyarak otomatik IP engelleme yapan popüler bir araçtır. iptables log prefixlerimizi fail2ban filtreleriyle eşleştirelim:

# Özel fail2ban filtresi oluştur
cat << 'EOF' > /etc/fail2ban/filter.d/iptables-portscan.conf
[Definition]
failregex = IPT-NULL-SCAN:.*SRC=<HOST>
            IPT-XMAS-SCAN:.*SRC=<HOST>
            IPT-FIN-SCAN:.*SRC=<HOST>
            IPT-SYNFIN-SCAN:.*SRC=<HOST>
ignoreregex =
EOF

# fail2ban jail yapılandırması
cat << 'EOF' >> /etc/fail2ban/jail.local
[iptables-portscan]
enabled = true
filter = iptables-portscan
logpath = /var/log/iptables.log
maxretry = 2
bantime = 3600
findtime = 600
action = iptables-allports[name=portscan]
EOF

systemctl restart fail2ban
fail2ban-client status iptables-portscan

Kuralları Kalıcı Hale Getirmek

Sunucu yeniden başladığında tüm bu emeklerinizin kaybolmaması için kuralları kaydetmek şart:

# Debian/Ubuntu sistemlerde
apt install iptables-persistent -y
netfilter-persistent save

# RedHat/CentOS sistemlerde
service iptables save
# veya
iptables-save > /etc/sysconfig/iptables

# Mevcut kuralları görüntüle ve dosyaya kaydet
iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules

# Yedekten geri yükle
iptables-restore < /root/iptables-backup-20240115.rules

# Kuralların doğru yüklendiğini doğrula
iptables -L INPUT -n -v --line-numbers

Gelişmiş Log Analizi: AWK ile İstatistik

Büyük log dosyaları için awk çok daha hızlı çalışır:

#!/bin/bash
# Saatlik saldırı dağılımı
echo "=== Saatlik Saldırı Dağılımı ==="
awk '/IPT-/ {
  match($3, /([0-9]+):/, arr)
  saat[arr[1]]++
}
END {
  for (s in saat)
    printf "Saat %02d:00 - %d olayn", s, saat[s]
}' /var/log/iptables.log | sort

echo ""
echo "=== Ülkelere Göre Saldırı Kaynakları ==="
# geoiplookup kuruluysa
grep "IPT-" /var/log/iptables.log | 
  grep -oP 'SRC=K[0-9.]+' | 
  sort -u | 
  while read ip; do
    country=$(geoiplookup "$ip" 2>/dev/null | grep -oP 'GeoIP Country Edition: K.*' || echo "Bilinmiyor")
    echo "$country"
  done | sort | uniq -c | sort -rn | head -15

Uygulama Öncesi Kontrol Listesi

Tüm bu yapılandırmaları üretime almadan önce dikkat edilmesi gereken noktalar:

  • Test ortamında dene: Yanlış yapılandırılmış bir kural kendinizi sunucudan kitleyebilir. Önce test VM üzerinde çalıştırın.
  • SSH bağlantınızı kesme: SSH kurallarını değiştirirken her zaman mevcut oturumunuzu açık tutun, ikinci bir terminal sekmesi açın.
  • at komutuyla güvenlik ağı: echo "iptables -F" | at now + 5 minutes ile 5 dakika sonra kuralları temizleyecek bir zamanlayıcı kurun, test başarılıysa iptal edin.
  • Log disk kullanımını izle: /var/log bölümünün dolmaması için logrotate yapılandırması şart.
  • Beyaz liste oluştur: Kendi ofis IP’niz veya VPN IP’niz her zaman beyaz listede olmalı.
  • Kural sıralaması önemli: iptables kuralları yukarıdan aşağıya işlenir, LOG kuralları DROP kurallarından önce gelmeli.

Sonuç

iptables log mekanizması, birçok sysadmin tarafından göz ardı edilen güçlü bir araçtır. Sadece paket filtrelemek yerine sistematik bir loglama altyapısı kurduğunuzda, güvenlik olaylarını proaktif olarak tespit edebilir ve saldırganların davranış paternlerini analiz edebilirsiniz.

Bu yazıda anlattıklarımı özetlemek gerekirse: önce logları ayrı bir dosyaya yönlendirin, anlamlı prefixler kullanın, rate limiting ile log flooding’i önleyin, bash scriptleriyle düzenli raporlar üretin ve fail2ban gibi araçlarla otomasyonu tamamlayın. Production ortamında bu adımları tamamladıktan sonra güvenlik görünürlüğünüzün dramatik biçimde arttığını göreceksiniz.

Unutmayın, bir saldırıyı loglamak onu durdurmaz ama sizi bilinçlendirir. Bilinçli bir sysadmin, reaktif değil proaktif güvenlik önlemleri alır. İyi loglar, iyi kararların temelidir.

Yorum yapın