Sunucunu yönetirken bir gün aniden trafik patlaması yaşıyorsun, CPU %100’e çıkıyor, SSH bağlantısı donuyor ve servisler yanıt vermez hale geliyor. Bu senaryoyu yaşadıysanız muhtemelen bir DDoS saldırısıyla karşılaşmışsınızdır. İyi haber şu: iptables, doğru yapılandırıldığında bu tür saldırılara karşı oldukça etkili bir savunma hattı oluşturabilir. Bu yazıda gerçek dünya senaryolarından yola çıkarak iptables ile DDoS korumasını katman katman nasıl kuracağınızı anlatacağım.
DDoS Saldırıları ve iptables İlişkisi
iptables, Linux çekirdeğinin netfilter alt sistemine arayüz sağlayan bir güvenlik duvarı aracıdır. DDoS saldırılarına karşı %100 koruma sağlamak mümkün değildir, özellikle bant genişliğini doyuran volumetrik saldırılarda upstream provider seviyesinde müdahale gerekmektedir. Ancak iptables şu konularda gerçekten işe yarar:
- SYN flood saldırılarını sınırlamak
- Bağlantı hızı aşan IP adreslerini engellemek
- Sahte paket (malformed packet) saldırılarını durdurmak
- UDP ve ICMP flood’larını kontrol altına almak
- Belirli port taramalarını ve kötü niyetli davranış kalıplarını tespit etmek
Küçük ve orta ölçekli VPS/dedicated sunucular için iptables kuralları, saldırıların büyük kısmını kernel seviyesinde filtreleyerek servis kesintisini engeller.
Temel Bağlantı Durumu Yönetimi
Her şeyden önce, sağlam bir temel oluşturalım. Stateful firewall mantığını kurarken önce mevcut bağlantılara izin veriyoruz:
# Önce tüm zincirler temizlenir
iptables -F
iptables -X
iptables -Z
# Varsayılan politikalar
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Loopback arayüzüne her zaman izin ver
iptables -A INPUT -i lo -j ACCEPT
# Kurulu ve ilişkili bağlantılara izin ver
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH erişimi (önce bunu ekle, kilitlenme olmasın)
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
Bu temel yapı olmadan diğer kuralları eklemek tehlikelidir. Özellikle uzak sunucularda SSH kuralını en başa almayı unutmayın.
SYN Flood Koruması
SYN flood, TCP el sıkışmasının ilk adımını kötüye kullanır. Saldırgan binlerce SYN paketi gönderir ama ACK yanıtını vermez. Sunucu her yarım açık bağlantı için kaynak ayırır ve sonunda tükenme yaşanır.
# SYN flood koruması - saniyede 25 yeni SYN bağlantısına izin ver
iptables -A INPUT -p tcp --syn -m limit --limit 25/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# SYN cookie desteğini aktif et (kernel seviyesi)
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Yarım açık bağlantı kuyruğunu büyüt
echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
--limit 25/s parametresi her saniye en fazla 25 yeni SYN paketine izin verir. --limit-burst 50 ise bu limiti aşmadan önce kabul edilebilecek anlık patlamayı belirtir. Web sunucusu gibi yoğun trafik alan servisler için bu değerleri artırmanız gerekebilir.
Önemli not: Yüksek trafikli bir web sunucusunda --limit 1000/s gibi değerler kullanmak daha mantıklıdır. Yoksa meşru kullanıcıları da engellersiniz.
Bağlantı Hızı Sınırlama (Rate Limiting)
Tek bir IP’den gelen aşırı bağlantı sayısını sınırlamak, uygulama katmanı DDoS’larına karşı etkilidir:
# Yeni bağlantı tablosunu oluştur
iptables -N RATE_LIMIT
# HTTP/HTTPS için bağlantı hızı sınırlama
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j RATE_LIMIT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j RATE_LIMIT
# RATE_LIMIT zinciri: saniyede 50 yeni bağlantı, burst 100
iptables -A RATE_LIMIT -m limit --limit 50/s --limit-burst 100 -j RETURN
iptables -A RATE_LIMIT -j DROP
Daha gelişmiş bir yaklaşım için hashlimit modülünü kullanın. Bu modül her kaynak IP için ayrı sayaç tutar:
# Her IP için dakikada maksimum 60 yeni bağlantı
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW
-m hashlimit
--hashlimit-name http_conn
--hashlimit-above 60/minute
--hashlimit-mode srcip
--hashlimit-burst 80
-j DROP
Bu yöntem --limit‘ten çok daha etkilidir çünkü “tek bir IP’den gelen saldırı” senaryosunu doğrudan hedefler. Meşru kullanıcılar dakikada 60’tan fazla yeni bağlantı açmaz, ama bir bot açar.
UDP Flood Koruması
UDP flood saldırıları özellikle game sunucuları ve DNS sunucularını hedef alır. UDP durumsuz bir protokol olduğundan savunması daha zordur:
# UDP flood koruması
iptables -A INPUT -p udp -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p udp -j DROP
# DNS sunucusu için özel kural (daha yüksek limit)
iptables -A INPUT -p udp --dport 53
-m hashlimit
--hashlimit-name dns_flood
--hashlimit-above 100/second
--hashlimit-mode srcip
-j DROP
iptables -A INPUT -p udp --dport 53 -j ACCEPT
Eğer UDP kullanan bir servis yoksa (örneğin sadece HTTP/HTTPS sunan bir web sunucusu), tüm UDP trafiğini direkt engelleyebilirsiniz:
# DNS ve NTP hariç tüm UDP'yi engelle
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 123 -j ACCEPT # NTP
iptables -A INPUT -p udp -j DROP
ICMP Flood ve Ping of Death Koruması
ICMP tamamen kapatmak çoğu zaman hatalı bir yaklaşımdır. Network diagnostics için ping’e ihtiyaç duyarsınız. Ama sınırsız bırakmak da ping flood saldırılarına davetiye çıkarır:
# ICMP echo (ping) için rate limiting
iptables -A INPUT -p icmp --icmp-type echo-request
-m limit --limit 1/s --limit-burst 5 -j ACCEPT
# Diğer gerekli ICMP tiplerini kabul et
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
# Geri kalan tüm ICMP'yi engelle
iptables -A INPUT -p icmp -j DROP
--limit 1/s ile saniyede sadece 1 ping isteğine izin veriyoruz. Normal monitoring araçları için bu yeterlidir ama flood saldırısını keser.
Sahte ve Hatalı Paket Koruması
Bazı saldırılar sahte TCP bayrakları veya geçersiz paket yapıları kullanır. Bu tür paketleri kernel seviyesinde düşürmek hem güvenlik hem de kaynak tasarrufu sağlar:
# Geçersiz paketleri düşür
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# NULL taramaları engelle (hiç bayrak yok)
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# XMAS taramaları engelle (tüm bayraklar set)
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# FIN taraması engelle
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 DROP
# SYN+RST kombinasyonu (geçersiz)
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
Bu kurallar Nmap gibi port tarama araçlarının kullandığı teknikleri de engeller. Gerçek dünyada bu kurallar olmadan sunucunuz reconnaissance saldırılarına açık kalır.
IP Engelleme Listesi Yönetimi
Belirli IP adreslerini veya aralıklarını hızlıca engellemek için ayrı bir zincir oluşturmak best practice’tir:
# Blacklist zinciri oluştur
iptables -N BLACKLIST
iptables -A INPUT -j BLACKLIST
# Belirli IP'leri engelle
iptables -A BLACKLIST -s 192.168.1.100 -j DROP
iptables -A BLACKLIST -s 10.0.0.0/8 -j DROP
# Blacklist zincirinden çık (engellenmemiş IP'ler devam eder)
iptables -A BLACKLIST -j RETURN
Büyük ölçekli engelleme listeleri için ipset kullanmak çok daha verimlidir. Binlerce IP için tek tek kural eklemek yerine:
# ipset ile büyük engelleme listesi
ipset create blacklist hash:ip hashsize 4096
# IP ekle
ipset add blacklist 192.168.1.100
ipset add blacklist 10.10.10.0/24
# iptables kuralı (tüm liste tek kuralla engellenir)
iptables -A INPUT -m set --match-set blacklist src -j DROP
# Listeyi kaydet
ipset save > /etc/ipset.conf
ipset ile 100.000 IP’yi tek bir iptables kuralıyla engelleyebilirsiniz. Klasik yöntemle 100.000 kural eklemek hem yavaş hem de yönetimi imkansız hale getirir.
Otomatik Saldırgan Engelleme
Belirli bir eşiği aşan IP adreslerini otomatik olarak engellemek için recent modülünü kullanabilirsiniz. Bu, port scanning ve brute force saldırılarına karşı da işe yarar:
# SSH brute force koruması (gerçek dünya örneği)
iptables -N SSH_PROTECT
iptables -A INPUT -p tcp --dport 22 -j SSH_PROTECT
# 60 saniyede 4'ten fazla deneme yapan IP'yi engelle
iptables -A SSH_PROTECT -m recent --set --name SSH_BRUTE --rsource
iptables -A SSH_PROTECT -m recent --rcheck --seconds 60 --hitcount 4
--name SSH_BRUTE --rsource -j DROP
iptables -A SSH_PROTECT -j ACCEPT
HTTP için benzer bir yaklaşım:
# HTTP flood koruması - recent modülü ile
iptables -N HTTP_PROTECT
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j HTTP_PROTECT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j HTTP_PROTECT
# 10 saniyede 100'den fazla bağlantı isteği gönderen IP'yi engelle
iptables -A HTTP_PROTECT -m recent --set --name HTTP_FLOOD --rsource
iptables -A HTTP_PROTECT -m recent --rcheck --seconds 10 --hitcount 100
--name HTTP_FLOOD --rsource -j DROP
iptables -A HTTP_PROTECT -j RETURN
Kapsamlı DDoS Koruma Scripti
Şimdiye kadar öğrendiklerimizi bir araya getiren, production ortamında kullanabileceğiniz bir script:
#!/bin/bash
# ddos_protection.sh - Kapsamli DDoS koruma scripti
# Renk kodlari
RED='33[0;31m'
GREEN='33[0;32m'
NC='33[0m'
echo -e "${GREEN}DDoS koruma kurallari yukleniyor...${NC}"
# Mevcut kurallari temizle
iptables -F
iptables -X
iptables -Z
# Varsayilan politikalar
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Temel kurallar
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# Sahte paket koruması
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# SYN flood koruması
iptables -A INPUT -p tcp --syn
-m limit --limit 100/s --limit-burst 200 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# ICMP koruması
iptables -A INPUT -p icmp --icmp-type echo-request
-m limit --limit 2/s --limit-burst 10 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp -j DROP
# SSH koruması
iptables -A INPUT -p tcp --dport 22
-m hashlimit
--hashlimit-name ssh_protect
--hashlimit-above 5/minute
--hashlimit-mode srcip
-j DROP
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# HTTP/HTTPS koruması
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW
-m hashlimit
--hashlimit-name http_protect
--hashlimit-above 200/second
--hashlimit-mode srcip
--hashlimit-burst 300
-j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# UDP koruması (DNS sunucusu varsa)
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp -m limit --limit 50/s --limit-burst 100 -j ACCEPT
iptables -A INPUT -p udp -j DROP
echo -e "${GREEN}Kurallar basariyla yuklendi.${NC}"
echo "Mevcut kurallar:"
iptables -L -n -v --line-numbers
Kernel Parametreleri ile Güçlendirme
iptables kuralları tek başına yeterli değildir. Kernel parametrelerini de optimize etmek gerekir:
# /etc/sysctl.conf dosyasına eklenecek parametreler
# SYN cookie koruması
net.ipv4.tcp_syncookies = 1
# SYN backlog boyutu
net.ipv4.tcp_max_syn_backlog = 4096
# Yarım açık bağlantı timeout süresi
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
# IP spoofing koruması
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# ICMP redirect kabul etme
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# Source routing'i kapat
net.ipv4.conf.all.accept_source_route = 0
# Bogus ICMP hata mesajlarini kaydet
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Broadcast ICMP'yi engelle
net.ipv4.icmp_echo_ignore_broadcasts = 1
# TIME_WAIT socket yeniden kullanimi
net.ipv4.tcp_tw_reuse = 1
# FIN_WAIT_2 timeout
net.ipv4.tcp_fin_timeout = 15
# Maksimum bağlantı kuyruğu
net.core.somaxconn = 65535
Ayarları uygulamak için:
sysctl -p /etc/sysctl.conf
Kuralları Kalıcı Hale Getirme
Sunucu yeniden başladığında iptables kuralları sıfırlanır. Kalıcı hale getirmek için:
# Debian/Ubuntu için
apt-get install iptables-persistent
netfilter-persistent save
# veya manuel olarak
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
# CentOS/RHEL için
service iptables save
# veya
iptables-save > /etc/sysconfig/iptables
Sistem başlangıcında yüklenmesi için:
# /etc/rc.local veya systemd service ile
cat > /etc/systemd/system/ddos-protection.service << EOF
[Unit]
Description=DDoS Protection iptables Rules
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash /root/ddos_protection.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl enable ddos-protection
systemctl start ddos-protection
Saldırı Anında Hızlı Müdahale
Aktif bir saldırı sırasında hangi IP’lerin en fazla bağlantı kurduğunu hızlıca tespit etmek için:
# En fazla bağlantı kuran IP'leri listele
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n | tail -20
# veya ss ile (daha hızlı)
ss -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
# Saldırgan IP'yi anında engelle
ATTACKER_IP="1.2.3.4"
iptables -I INPUT 1 -s $ATTACKER_IP -j DROP
# Tüm aktif bağlantı sayısını gör
ss -s
# HTTP bağlantılarını izle (web sunucusu için)
watch -n 1 'netstat -an | grep :80 | grep ESTABLISHED | wc -l'
Kuralların Test Edilmesi
Kurduğunuz kuralların doğru çalışıp çalışmadığını test etmek önemlidir:
# Mevcut kuralları görüntüle (detaylı)
iptables -L -n -v --line-numbers
# Belirli bir zinciri görüntüle
iptables -L INPUT -n -v --line-numbers
# Paket sayaçlarını sıfırla ve izle
iptables -Z
watch -n 5 'iptables -L INPUT -n -v'
# Kural testini log ile yap (production'dan önce)
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW
-m hashlimit
--hashlimit-name test_http
--hashlimit-above 100/second
--hashlimit-mode srcip
-j LOG --log-prefix "HTTP_FLOOD: "
# Log'ları izle
tail -f /var/log/kern.log | grep HTTP_FLOOD
Gerçek Dünya Senaryo: Küçük Web Sunucusu Saldırısı
Diyelim ki 2 vCPU, 4GB RAM’li bir VPS üzerinde WordPress çalıştırıyorsunuz ve bir sabah CPU %100, load average 50+ görüyorsunuz. İşte bu durumda adım adım yapılacaklar:
- İlk adım:
ss -sile bağlantı sayısını kontrol et - Eğer ESTABLISHED bağlantılar normalin 10 katıysa DDoS ihtimali yüksek
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -5ile top saldırganları bul- Tek bir IP’den binlerce bağlantı geliyorsa:
iptables -I INPUT 1 -s ATTACKER_IP -j DROP - Çok sayıda farklı IP varsa (botnet): hashlimit kurallarını aktif et
- nginx veya Apache log dosyasına bak: hangi endpoint hedef alınıyor
- Hedef endpoint’i geçici olarak kapat veya rate limit uygula
- Durumu stabilize ettikten sonra kalıcı kuralları yükle
Bu senaryo gerçekten yaşanmıştır. hashlimit kuralları devreye alındıktan sonra CPU %20’ye düşmüş ve servis normale dönmüştür.
Sonuç
iptables ile DDoS koruması katmanlı bir yaklaşım gerektirir. Tek bir kural her şeyi çözmez. Önemli noktalara bakacak olursak:
- Temel kurallar herzaman ilk sıraya alın: loopback, established bağlantılar, invalid paket dropu
- hashlimit modülü
--limit‘ten çok daha etkilidir, per-IP sayaç tuttuğu için tercih edin - Kernel parametreleri iptables kurallarını tamamlar, ihmal etmeyin
- ipset büyük engelleme listeleri için şarttır
- Test ortamında dene, production’da direkt uygulamak bağlantı kesilmesine yol açabilir
- Kuralları kalıcı hale getir, aksi takdirde reboot’ta her şey sıfırlanır
- Monitoring ekle, saldırı anında ne olduğunu görmek için log ve watch komutlarını kullan
iptables güçlü bir araçtır ama sınırları vardır. Volumetrik saldırılarda (10Gbps+) upstream filtering, CDN veya cloud-based DDoS protection servisleri gereklidir. Cloudflare, AWS Shield gibi çözümler bu durumda devreye girer. Ama küçük ve orta ölçekli saldırıların büyük çoğunluğu için burada anlattığımız iptables kuralları yeterince etkilidir.
Düzenli olarak iptables -L -n -v çıktısını incelemek ve paket sayaçlarını takip etmek, saldırıları erken fark etmenizi sağlar. Proaktif olmak, saldırı başladıktan sonra panik içinde kural yazmaktan çok daha iyidir.