iptables ile Gelen ve Giden Trafiği Filtreleme

Bir sunucuyu internete açtığınız anda, kötü niyetli taramalar, brute force denemeleri ve istenmeyen bağlantılar dakikalar içinde gelmeye başlar. Bu gerçekle yüzleşmek zorundaysanız, elinizin altındaki en güçlü araçlardan biri iptables’tır. Linux çekirdeğinin netfilter altyapısı üzerine inşa edilmiş bu araç, gelen ve giden her paketi istediğiniz kurallara göre filtrelemenizi sağlar. Karmaşık görünebilir, ancak mantığını bir kez kavradığınızda neden bu kadar yaygın kullanıldığını anlarsınız.

iptables’ın Temel Mantığı

iptables, paketleri belirli zincirler (chains) üzerinden geçirerek her zincire atanmış kuralları sırayla uygular. Üç temel zinciri bilmek işin büyük bölümünü çözer:

  • INPUT: Sunucuya gelen paketler
  • OUTPUT: Sunucudan çıkan paketler
  • FORWARD: Sunucunun üzerinden geçen paketler (router görevi görüyorsa)

Bu zincirlerin her biri bir tablo içinde çalışır. Günlük kullanımda karşılaşacağınız tablo büyük ihtimalle filter tablosudur. NAT işlemleri için nat, paket değiştirme için mangle tabloları devreye girer ama biz bu yazıda filter tablosuna odaklanacağız.

Bir paket zincire girdiğinde kurallar yukarıdan aşağıya doğru sırayla kontrol edilir. Eşleşen ilk kuralın aksiyonu (ACCEPT, DROP, REJECT) uygulanır ve pakete ne yapılacağına karar verilir. Hiçbir kural eşleşmezse zincirin varsayılan politikası (default policy) devreye girer.

Mevcut Kuralları Görüntülemek

Herhangi bir şey yapmadan önce mevcut durumu görmek iyi bir alışkanlıktır:

# Mevcut kuralları listele
iptables -L -v -n

# Satır numaralarıyla birlikte göster
iptables -L -v -n --line-numbers

# Belirli bir zinciri göster
iptables -L INPUT -v -n --line-numbers

# Nat tablosunu göster
iptables -t nat -L -v -n

-v parametresi verbose çıktı verir, paket ve byte sayaçlarını gösterir. -n ise DNS çözümlemesi yapmadan IP adreslerini sayısal olarak listeler, bu da listelemeyi çok daha hızlı yapar.

Temel Kural Yazım Yapısı

Kural yazarken kullandığınız parametreleri bilmek şart:

  • -A: Zincirin sonuna kural ekler (Append)
  • -I: Zincirin başına veya belirtilen konuma kural ekler (Insert)
  • -D: Kural siler (Delete)
  • -R: Kural değiştirir (Replace)
  • -F: Zincirdeki tüm kuralları temizler (Flush)
  • -P: Zincirin varsayılan politikasını ayarlar (Policy)
  • -s: Kaynak IP adresi
  • -d: Hedef IP adresi
  • -p: Protokol (tcp, udp, icmp)
  • –dport: Hedef port
  • –sport: Kaynak port
  • -j: Aksiyon (ACCEPT, DROP, REJECT, LOG)
  • -i: Gelen ağ arayüzü
  • -o: Çıkan ağ arayüzü

Varsayılan Politikaları Ayarlamak

Güvenli bir firewall kurulumunda en önemli karar varsayılan politikayı belirlemektir. İki farklı yaklaşım vardır: izin verici (her şeye izin ver, yasakları belirt) ve kısıtlayıcı (her şeyi engelle, izinleri belirt). Production sunucularda her zaman kısıtlayıcı yaklaşım tercih edilmelidir.

# Varsayılan olarak her şeyi engelle
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Mevcut bağlantıları ve ilişkili paketleri kabul et
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Loopback arayüzüne izin ver
iptables -A INPUT -i lo -j ACCEPT

Dikkat: INPUT’u DROP’a almadan önce SSH erişiminizi kaybetmemek için mutlaka SSH kuralını ekleyin. Bunu atlarsanız sunucuya erişiminiz kesilir ve konsol erişiminiz yoksa ciddi sorun yaşarsınız.

SSH Erişimini Güvence Altına Almak

En sık karşılaşılan senaryo SSH portunu doğru şekilde yönetmektir. Önce temel izni ekleyelim:

# SSH portuna izin ver (varsayılan 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Sadece belirli bir IP'den SSH erişimine izin ver
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.50 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

# Özel port kullanıyorsanız (örneğin 2222)
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

Gerçek dünya senaryosu olarak düşünün: Bir müşterinin web sunucusunu yönetiyorsunuz ve SSH erişimini sadece ofis IP’nizden açmak istiyorsunuz. Yukarıdaki ikinci örnek tam olarak bunu yapar. Ofis IP’si değiştiğinde kuralı güncellemeniz gerekir ama bu küçük bir zahmet karşılığında büyük bir güvenlik kazanımıdır.

Web Sunucu Kuralları

Bir web sunucu için HTTP ve HTTPS trafiğine izin vermek gerekir:

# HTTP ve HTTPS trafiğine izin ver
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# ICMP (ping) isteklerine izin ver
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# UDP DNS sorgularına izin ver (sunucu DNS sorgusu yapacaksa OUTPUT'ta)
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

Rate Limiting ile Brute Force Koruması

Sadece port açmak yetmez. SSH ve diğer servislere yönelik brute force saldırılarını sınırlamak için limit ve recent modüllerini kullanabilirsiniz:

# SSH brute force koruması - recent modülü ile
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP

# limit modülü ile SSH koruması
iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

# HTTP flood koruması
iptables -A INPUT -p tcp --dport 80 -m limit --limit 50/second --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP

Bu kurallar özellikle shared hosting veya küçük VPS sunucularında hayat kurtarır. Dakikada 3’ten fazla yeni SSH bağlantısı geliyorsa büyük ihtimalle brute force denemesi yaşanıyordur.

Belirli IP Aralıklarını Engellemek

Güvenlik loglarınızı incelediğinizde bazı IP aralıklarından sürekli kötü niyetli istek geldiğini görebilirsiniz:

# Tek IP engelleme
iptables -A INPUT -s 192.168.100.10 -j DROP

# IP aralığı engelleme (CIDR notasyonu)
iptables -A INPUT -s 10.0.0.0/8 -j DROP

# Birden fazla IP'yi ipset ile daha verimli engelleme
# Önce ipset kur ve liste oluştur
ipset create blacklist hash:ip
ipset add blacklist 192.168.100.10
ipset add blacklist 192.168.100.11
iptables -A INPUT -m set --match-set blacklist src -j DROP

# Bir ülkenin IP bloğunu engellemek için
# (GeoIP modülü gerektiren daha ileri bir konu)

ipset kullanımı, çok sayıda IP engellemeniz gerektiğinde iptables’tan çok daha verimlidir. Binlerce IP’yi tek tek kural yazmak yerine ipset listesine ekleyip tek kuralda hepsini engelleyebilirsiniz.

Giden Trafiği Filtrelemek

Sysadminlerin çoğu gelen trafiğe odaklanır ama giden trafiği filtrelemek de kritiktir. Özellikle bir sunucu ele geçirildiğinde dışarıya veri sızdırılmasını veya DDoS saldırısına katılmasını engelleyebilirsiniz:

# OUTPUT varsayılan politikasını DROP yap
iptables -P OUTPUT DROP

# Loopback çıkışına izin ver
iptables -A OUTPUT -o lo -j ACCEPT

# Mevcut bağlantılara izin ver
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# DNS sorgularına izin ver
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

# HTTP/HTTPS çıkışına izin ver (paket güncellemeleri için)
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

# NTP senkronizasyonu
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT

# SMTP (mail gönderimi) - sadece gerekiyorsa
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

Bir e-ticaret sunucusu yönetiyorsanız ve sunucunun sadece ödeme gateway’ine bağlanmasını istiyorsanız, OUTPUT kurallarıyla bunu sınırlandırabilirsiniz. Sunucu ele geçirilse bile kötü niyetli kişi rastgele dış bağlantı kuramaz.

Log Kayıtları Tutmak

Güvenlik olaylarını izlemek için LOG hedefini kullanabilirsiniz:

# DROP öncesi log tut
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "SSH-ATTEMPT: " --log-level 4
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP

# Tüm DROP edilen paketleri logla
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
iptables -A INPUT -j DROP

# Log limitini ayarla (log flood'u önlemek için)
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPTABLES-INPUT-DROP: " --log-level 7
iptables -A INPUT -j DROP

Loglar genellikle /var/log/syslog veya /var/log/kern.log dosyasına düşer. grep "IPTABLES-DROP" /var/log/kern.log komutuyla hızlıca filtreleyebilirsiniz.

Port Knocking ile Gizli Erişim

İleri düzey bir güvenlik yöntemi olan port knocking, SSH portunu tamamen kapatıp belirli bir “kapı çalma” sekansı ile açar:

# Port knocking için recent modülü kullanımı
# Önce tüm zincirleri temizle
iptables -F

# Port 7000'e gelen bağlantıyı işaretle
iptables -A INPUT -p tcp --dport 7000 -m recent --name KNOCK1 --set -j DROP

# 7000 sonrası 5 saniye içinde 8000'e gelirse ikinci aşama
iptables -A INPUT -p tcp --dport 8000 -m recent --name KNOCK1 --rcheck --seconds 5 -m recent --name KNOCK2 --set -j DROP
iptables -A INPUT -p tcp --dport 8000 -j DROP

# 8000 sonrası 5 saniye içinde 9000'e gelirse SSH aç
iptables -A INPUT -p tcp --dport 9000 -m recent --name KNOCK2 --rcheck --seconds 5 -m recent --name KNOCK3 --set -j DROP
iptables -A INPUT -p tcp --dport 9000 -j DROP

# Knocknoc tamamlandıysa SSH'a izin ver
iptables -A INPUT -p tcp --dport 22 -m recent --name KNOCK3 --rcheck --seconds 10 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

Bu yöntem internet taramalarında SSH portunuzu neredeyse görünmez kılar. Düzgün sekansı bilmeden kimse bağlanamaz.

Kuralları Kalıcı Hale Getirmek

iptables kuralları sunucu yeniden başlatıldığında silinir. Kalıcı hale getirmek için dağıtıma göre farklı yöntemler kullanılır:

# Debian/Ubuntu - iptables-persistent paketi
apt install iptables-persistent
netfilter-persistent save
netfilter-persistent reload

# Mevcut kuralları kaydet
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

# Kuralları geri yükle
iptables-restore < /etc/iptables/rules.v4

# RHEL/CentOS - eski yöntem
service iptables save
# veya
/sbin/iptables-save > /etc/sysconfig/iptables

# Systemd ile her boot'ta yüklemek için
cat > /etc/systemd/system/iptables-restore.service << EOF
[Unit]
Description=Restore iptables rules
Before=network.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

systemctl enable iptables-restore

Tam Bir Sunucu Firewall Şablonu

Tüm bu bilgileri bir araya getiren, production’a yakın bir şablon:

#!/bin/bash
# firewall.sh - Temel sunucu güvenlik duvarı

# Tüm kuralları temizle
iptables -F
iptables -X
iptables -Z

# Varsayılan politikaları ayarla
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Mevcut bağlantılar
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Invalid paketleri drop et
iptables -A INPUT -m state --state INVALID -j DROP

# ICMP ping
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# SSH - sadece yönetim IP'sinden
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.0/24 -m state --state NEW -j ACCEPT

# Web servisleri
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

# SYN flood koruması
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT

# Drop edilen paketleri logla
iptables -A INPUT -j LOG --log-prefix "FIREWALL-DROP: " --log-level 4
iptables -A INPUT -j DROP

# Kuralları kaydet
iptables-save > /etc/iptables/rules.v4
echo "Firewall kurallari uygulandı."

Bu betiği /usr/local/sbin/firewall.sh olarak kaydedip chmod +x ile çalıştırılabilir yapın. Test etmeden production’a atmayın, mutlaka bir test ortamında deneyin.

Kuralları Test Etmek ve Sorun Gidermek

Firewall kurallarını uyguladıktan sonra doğrulama kritik öneme sahiptir:

# Bağlantı testi için nmap kullanımı (başka bir makineden)
nmap -sS -p 22,80,443 sunucu-ip

# Belirli bir porta bağlantı testi
nc -zv sunucu-ip 443

# Canlı paket izleme
tcpdump -i eth0 -n port 22

# iptables sayaçlarını sıfırla ve izle
iptables -Z
watch -n 1 'iptables -L -v -n'

# Kural silme - satır numarasıyla
iptables -L INPUT --line-numbers
iptables -D INPUT 3

# Geçici kural testi için at komutu (30 dakika sonra kuralları temizle)
at now + 30 minutes << EOF
iptables -F
iptables -P INPUT ACCEPT
EOF

at komutu ile birlikte kullanılan son örnek gerçekten hayat kurtaran bir tekniktir. Uzak bir sunucuda denemeler yaparken kendinizi kitleyebilirsiniz. 30 dakika sonra kuralları temizleyecek bir görev bırakmak, hata durumunda erişiminizi geri kazanmanızı sağlar.

Yaygın Hatalar ve Dikkat Edilmesi Gerekenler

Deneyimli sysadminlerin bile düştüğü tuzaklar vardır:

  • Kural sırası önemlidir: DROP kuralından önce ACCEPT kuralı yazmazsanız paket asla kabul edilmez. Sıralamayı her zaman kontrol edin.
  • ESTABLISHED,RELATED kuralını unutmak: Bu kural olmadan mevcut bağlantılarınız bile kesilir.
  • IPv6’yı ihmal etmek: iptables sadece IPv4 için geçerlidir. ip6tables ile IPv6 kurallarını ayrıca yazmanız gerekir.
  • Kaydetmeyi unutmak: Tüm kurallarınızı yazıp sunucuyu yeniden başlatınca sıfıra döndüğünüzü görmek sinir bozucudur.
  • Çok agresif rate limiting: Yoğun trafik alan bir web sunucusunda çok düşük limit değerleri meşru kullanıcıları engeller.
  • Tek başına iptables’a güvenmek: iptables güçlü bir araçtır ama fail2ban, mod_security gibi araçlarla birlikte kullanılmalıdır.

Sonuç

iptables, Linux ekosisteminin en köklü ve güvenilir güvenlik araçlarından biridir. Karmaşık sözdizimi başlangıçta korkutucu görünse de temel kavramları öğrendikten sonra son derece esnek ve güçlü bir yapı sunar. Bu yazıda ele aldığımız konular, günlük sysadmin işlerinin büyük çoğunluğunu karşılar: varsayılan politikalar, SSH koruması, brute force önleme, giden trafik kontrolü ve kalıcı kural yönetimi.

Pratik olarak başlamak isteyenler için önerim şu: Önce bir test sanal makinesinde kuralları deneyin, sonra production’a taşıyın. Her değişiklikten önce mevcut kuralları yedekleyin. at komutu ile güvenlik ağı kurarak deneme yapın. Zamanla kendi organizasyonunuza özel şablonlar oluşturun ve bunları belgelendirin.

Daha modern alternatifler olan nftables veya firewalld son yıllarda popülerlik kazanmaktadır. Ancak iptables hala milyonlarca sunucuda aktif olarak çalışmakta, mevcut sistemleri anlamak ve yönetmek için bu bilgi vazgeçilmez olmaya devam etmektedir.

Yorum yapın