Sunuculara yapılan yetkisiz erişim girişimleri, brute force saldırıları ve şüpheli trafik akışları her sistem yöneticisinin kabusudur. Linux’un güçlü güvenlik duvarı çözümü iptables, bu tehditlere karşı son derece esnek ve güçlü bir savunma hattı oluşturmanızı sağlar. Bu yazıda IP adresi ve MAC adresi bazlı engelleme tekniklerini, gerçek dünya senaryolarıyla birlikte ele alacağız.
iptables Temel Mantığı
iptables, Linux çekirdeğinin netfilter altyapısı üzerine inşa edilmiş bir paket filtreleme aracıdır. Kurallar zincirler (chains) halinde işlenir ve her paket bu zincirden geçerken kurallara göre değerlendirilir.
Temel zincirleri hatırlayalım:
- INPUT: Sisteme gelen paketler
- OUTPUT: Sistemden çıkan paketler
- FORWARD: Sistem üzerinden geçen paketler (router senaryolarında)
Her kural bir hedef (target) belirtir:
- ACCEPT: Paketi kabul et
- DROP: Paketi sessizce düşür
- REJECT: Paketi reddet ve hata mesajı gönder
- LOG: Paketi logla
Mevcut kuralları görmek için her zaman şu komutla başlayalım:
# Mevcut kuralları listele
iptables -L -n -v
# Satır numaralarıyla birlikte göster
iptables -L INPUT -n -v --line-numbers
# NAT tablosunu göster
iptables -t nat -L -n -v
Tek Bir IP Adresini Engelleme
En basit senaryo: belirli bir IP adresinden gelen tüm trafiği engellemek. Diyelim ki log dosyalarınızda 192.168.1.100 IP’sinden sürekli başarısız SSH denemeleri görüyorsunuz.
# Gelen trafiği engelle (DROP - sessiz)
iptables -A INPUT -s 192.168.1.100 -j DROP
# Gelen trafiği engelle (REJECT - hata mesajıyla)
iptables -A INPUT -s 192.168.1.100 -j REJECT
# Hem gelen hem giden trafiği engelle
iptables -A INPUT -s 192.168.1.100 -j DROP
iptables -A OUTPUT -d 192.168.1.100 -j DROP
DROP mu REJECT mı kullanmalısınız? Saldırganlar açısından DROP daha iyidir çünkü bağlantı sadece zaman aşımına uğrar ve portun/IP’nin aktif olup olmadığını anlayamazlar. REJECT ise istemciye açık bir hata mesajı gönderir. İç ağ kullanıcıları için REJECT daha kullanıcı dostudur çünkü neden bağlanamadıklarını anlayabilirler.
Engeli kaldırmak için:
# -A yerine -D kullanarak kuralı sil
iptables -D INPUT -s 192.168.1.100 -j DROP
# Satır numarasıyla silme (önce --line-numbers ile bakın)
iptables -D INPUT 3
IP Aralığı (Subnet) Engelleme
Bazen tek bir IP değil, tüm bir ağ bloğunu engellemeniz gerekebilir. Özellikle belirli ülkelerden veya veri merkezlerinden gelen toplu saldırılarda bu yöntem çok işe yarar.
# Bir ağ bloğunu engelle (CIDR notasyonu)
iptables -A INPUT -s 10.10.0.0/16 -j DROP
# 203.0.113.0/24 bloğunu engelle
iptables -A INPUT -s 203.0.113.0/24 -j DROP
# Birden fazla IP'yi aynı anda eklemek için iprange modülü kullan
iptables -A INPUT -m iprange --src-range 192.168.1.50-192.168.1.100 -j DROP
Gerçek dünya senaryosu: Bir e-ticaret sitesi yönetiyorsunuz ve belirli bir IP bloğundan gelen bot trafiği veritabanı sunucunuzu yoruyor. Web sunucusu loglarını analiz edip şüpheli IP bloklarını tespit ettikten sonra şu şekilde toplu engelleme yapabilirsiniz:
#!/bin/bash
# ban_ips.sh - Toplu IP engelleme scripti
# Engellenmesi gereken IP listesi
BLOCKED_IPS=(
"185.220.101.0/24"
"194.165.16.0/24"
"45.155.205.0/24"
)
for ip in "${BLOCKED_IPS[@]}"; do
echo "Engelleniyor: $ip"
iptables -A INPUT -s "$ip" -j DROP
done
echo "Toplam engellenen ağ: ${#BLOCKED_IPS[@]}"
MAC Adresi ile Engelleme
MAC adresi filtreleme, özellikle yerel ağ güvenliğinde çok değerli bir araçtır. Bir IP değiştirilse bile MAC adresi (genellikle) sabit kalır. Ancak şunu belirtmek gerekir: MAC adresi filtreleme sadece aynı ağ segmentinde, yani Layer 2 seviyesinde çalışır. İnternetten gelen trafikte router’ın MAC adresini görürsünüz, gerçek kaynağı değil.
MAC adresi engelleme için mac modülünü kullanırız:
# Belirli bir MAC adresinden gelen trafiği engelle
iptables -A INPUT -m mac --mac-source AA:BB:CC:DD:EE:FF -j DROP
# MAC adresine göre kabul et (whitelist yaklaşımı)
iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT
# MAC + IP kombinasyonu ile daha güçlü kural
iptables -A INPUT -s 192.168.1.50 -m mac --mac-source AA:BB:CC:DD:EE:FF -j DROP
Ofis ağı senaryosu: Şirket içi bir sunucunuz var ve sadece belirli bilgisayarların erişmesini istiyorsunuz. IP bazlı kısıtlama yeterli değil çünkü çalışanlar IP değiştirebilir. MAC adresi bazlı whitelist oluşturabilirsiniz:
#!/bin/bash
# office_mac_filter.sh - Ofis MAC adresi whitelist
# Önce varsayılan politikayı DROP olarak ayarla
iptables -P INPUT DROP
# Loopback'e izin ver
iptables -A INPUT -i lo -j ACCEPT
# Mevcut bağlantılara izin ver
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Yetkili MAC adreslerine izin ver
ALLOWED_MACS=(
"00:1A:2B:3C:4D:5E" # Muhasebe bilgisayarı
"11:22:33:44:55:66" # IT departmanı
"AA:BB:CC:DD:EE:FF" # Yönetici laptop
)
for mac in "${ALLOWED_MACS[@]}"; do
iptables -A INPUT -m mac --mac-source "$mac" -j ACCEPT
done
echo "MAC filtresi uygulandı"
Protokol ve Port Kombinasyonuyla Gelişmiş Engelleme
Sadece IP veya MAC engellemek bazen yeterli olmaz. Belirli bir IP’nin sadece belirli bir portuna erişimi engellemek veya tam tersi izin vermek gerekebilir.
# Belirli IP'nin SSH portuna erişimini engelle
iptables -A INPUT -s 203.0.113.50 -p tcp --dport 22 -j DROP
# IP bloğunun HTTP/HTTPS dışında her şeye erişimini engelle
iptables -A INPUT -s 10.0.0.0/8 -p tcp ! --dport 80 -j DROP
iptables -A INPUT -s 10.0.0.0/8 -p tcp ! --dport 443 -j DROP
# UDP trafiğini belirli kaynaktan engelle
iptables -A INPUT -s 192.168.5.0/24 -p udp -j DROP
# ICMP (ping) trafiğini belirli IP'den engelle
iptables -A INPUT -s 192.168.1.200 -p icmp -j DROP
Kural Sıralaması ve Öncelik Yönetimi
iptables kuralları yukarıdan aşağıya doğru işlenir ve ilk eşleşen kural uygulanır. Bu nedenle kural sırası kritik öneme sahiptir.
# Kuralları satır numarasıyla görüntüle
iptables -L INPUT -n --line-numbers
# Belirli bir konuma kural ekle (2. sıraya ekle)
iptables -I INPUT 2 -s 192.168.1.100 -j DROP
# En başa kural ekle
iptables -I INPUT 1 -s 10.0.0.1 -j ACCEPT
# Kuralların sırasını değiştirmek için önce sil, sonra ekle
iptables -D INPUT -s 192.168.1.100 -j DROP
iptables -I INPUT 1 -s 192.168.1.100 -j DROP
Önemli senaryo: Bir IP’yi hem engellemek hem de o IP’nin bir alt kümesine izin vermek istiyorsunuz. Mesela 192.168.1.0/24 bloğunu engelleyeceksiniz ama 192.168.1.10 adresine izin vereceksiniz:
# ÖNCE istisnayı ekle (sıra önemli!)
iptables -A INPUT -s 192.168.1.10 -j ACCEPT
# SONRA genel engeli ekle
iptables -A INPUT -s 192.168.1.0/24 -j DROP
Eğer engeli önce eklerseniz 192.168.1.10 da engellenecektir çünkü kural kontrolü en baştan yapılır ve ilk eşleşmede durur.
Kuralları Kalıcı Hale Getirme
iptables kuralları varsayılan olarak geçicidir ve sistem yeniden başlatıldığında kaybolur. Kuralları kalıcı hale getirmenin birkaç yolu vardır.
Debian/Ubuntu sistemlerde:
# iptables-persistent paketini kur
apt-get install iptables-persistent
# Mevcut kuralları kaydet
netfilter-persistent save
# Manuel kaydetme
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
# Kayıtlı kuralları yükle
iptables-restore < /etc/iptables/rules.v4
CentOS/RHEL sistemlerde:
# Kuralları kaydet
service iptables save
# veya
iptables-save > /etc/sysconfig/iptables
# Servisi yeniden başlat
systemctl restart iptables
# Sistem açılışında otomatik yüklensin
systemctl enable iptables
Alternatif olarak rc.local kullanımı:
# /etc/rc.local dosyasına ekle
echo "iptables-restore < /etc/iptables/rules.v4" >> /etc/rc.local
chmod +x /etc/rc.local
Otomatik IP Engelleme: fail2ban ile iptables Entegrasyonu
Manuel IP engelleme yetersiz kalır. Brute force saldırılarını otomatik olarak tespit edip engellemek için fail2ban harika bir çözümdür ve iptables ile mükemmel çalışır.
# fail2ban kurulumu
apt-get install fail2ban # Debian/Ubuntu
yum install fail2ban # CentOS/RHEL
# fail2ban'ın oluşturduğu iptables zincirlerini görüntüle
iptables -L -n | grep fail2ban
# fail2ban tarafından engellenen IP'leri listele
fail2ban-client status sshd
# Belirli bir IP'yi fail2ban üzerinden engelle
fail2ban-client set sshd banip 192.168.1.100
# fail2ban üzerinden engeli kaldır
fail2ban-client set sshd unbanip 192.168.1.100
fail2ban kendi iptables zincirlerini oluşturur ve engelleme işlemlerini otomatik yönetir. Bu sayede log dosyalarını izleyerek belirli sayıda başarısız giriş denemesinden sonra ilgili IP’yi otomatik engeller.
Özel Zincir Oluşturma ile Modüler Engelleme
Karmaşık güvenlik politikaları için özel zincirler oluşturmak kuralları düzenli tutmanızı sağlar:
#!/bin/bash
# modular_firewall.sh - Modüler güvenlik duvarı yapısı
# Eski kuralları temizle
iptables -F
iptables -X
# Özel zincirler oluştur
iptables -N BLOCKED_IPS
iptables -N BLOCKED_MACS
iptables -N TRUSTED_HOSTS
# BLOCKED_IPS zincirine engellenecek IP'leri ekle
iptables -A BLOCKED_IPS -s 192.168.100.0/24 -j DROP
iptables -A BLOCKED_IPS -s 10.20.30.0/24 -j DROP
iptables -A BLOCKED_IPS -s 172.16.50.100 -j DROP
iptables -A BLOCKED_IPS -j RETURN # Eşleşme yoksa geri dön
# BLOCKED_MACS zincirine engellenecek MAC'leri ekle
iptables -A BLOCKED_MACS -m mac --mac-source DE:AD:BE:EF:00:01 -j DROP
iptables -A BLOCKED_MACS -m mac --mac-source DE:AD:BE:EF:00:02 -j DROP
iptables -A BLOCKED_MACS -j RETURN
# TRUSTED_HOSTS zincirine güvenilir IP'leri ekle
iptables -A TRUSTED_HOSTS -s 10.0.0.1 -j ACCEPT
iptables -A TRUSTED_HOSTS -s 10.0.0.2 -j ACCEPT
iptables -A TRUSTED_HOSTS -j RETURN
# Ana INPUT zincirine zincir çağrıları ekle
iptables -A INPUT -j TRUSTED_HOSTS # Önce güvenilirleri kontrol et
iptables -A INPUT -j BLOCKED_IPS # Sonra engellileri kontrol et
iptables -A INPUT -j BLOCKED_MACS # MAC engellerini kontrol et
# Loopback ve established bağlantılara izin ver
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "Modüler güvenlik duvarı yapılandırıldı"
Log Tutma ve İzleme
Engellenen bağlantıları izlemek güvenlik açısından kritik öneme sahiptir. Saldırı kaynaklarını analiz etmek ve güvenlik politikalarını iyileştirmek için log tutmalısınız:
# Engellenmeden önce log tut
iptables -A INPUT -s 192.168.1.100 -j LOG --log-prefix "BLOCKED-IP: " --log-level 4
iptables -A INPUT -s 192.168.1.100 -j DROP
# MAC adresi engellemeleri için log
iptables -A INPUT -m mac --mac-source AA:BB:CC:DD:EE:FF -j LOG --log-prefix "BLOCKED-MAC: " --log-level 4
iptables -A INPUT -m mac --mac-source AA:BB:CC:DD:EE:FF -j DROP
# Log limitini belirle (log flooding önleme)
iptables -A INPUT -s 203.0.113.0/24 -m limit --limit 5/min --limit-burst 10 -j LOG --log-prefix "SUSPICIOUS-TRAFFIC: "
iptables -A INPUT -s 203.0.113.0/24 -j DROP
Logları izlemek için:
# iptables loglarını gerçek zamanlı izle
tail -f /var/log/kern.log | grep "BLOCKED-IP"
# veya syslog
tail -f /var/log/syslog | grep "iptables"
# Engellenen IP istatistiklerini göster
iptables -L INPUT -v -n | grep DROP
Yaygın Hatalar ve Dikkat Edilmesi Gerekenler
Sistem yöneticilerinin iptables kullanırken sık yaptığı hataları bilmek önemlidir:
- Kendini kilitlemek: Uzak sunucuda çalışırken yanlış kural eklediğinizde SSH erişiminizi kaybedebilirsiniz. Her zaman mevcut bağlantıları koruyun:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- Kural sırasını göz ardı etmek: DROP kuralını ACCEPT kuralından önce eklerseniz istisna çalışmaz.
- Kalıcılığı unutmak: Kurallar test aşamasında geçici tutulabilir ama ürün ortamında mutlaka kalıcı hale getirilmelidir.
- MAC spoofing riskini küçümsemek: MAC adresleri değiştirilebilir. MAC filtreleme tek başına güvenlik katmanı olmamalı, IP ve port filtrelemeyle birlikte kullanılmalıdır.
- IPv6’yı unutmak: iptables sadece IPv4 için geçerlidir. IPv6 trafiği için ip6tables ayrıca yapılandırılmalıdır.
# IPv6 için aynı kuralları uygula
ip6tables -A INPUT -s 2001:db8::/32 -j DROP
# IPv6 kurallarını kaydet
ip6tables-save > /etc/iptables/rules.v6
Sonuç
iptables ile IP ve MAC adresi engelleme, Linux güvenlik altyapısının temel taşlarından biridir. Basit tek IP engellemelerinden başlayarak özel zincirlerle oluşturulmuş modüler güvenlik politikalarına kadar çok geniş bir yelpazeyi kapsar.
Pratik önerilerimi şöyle özetleyeyim: Üretim sunucularında kural eklemeden önce mutlaka test ortamında deneyin. Her önemli değişiklik öncesinde mevcut kuralları yedekleyin: iptables-save > backup_$(date +%Y%m%d).rules. Karmaşık kurallar için özel zincirler kullanın, böylece hem okunabilirlik artar hem de yönetim kolaylaşır. Son olarak iptables kurallarını tek başına değil, fail2ban ve diğer güvenlik araçlarıyla birlikte katmanlı bir güvenlik stratejisi çerçevesinde kullanın.
Güvenlik duvarı yönetimi sürekli güncellenmesi gereken bir süreçtir. Log analizlerini düzenli yapın, yeni tehdit kaynaklarını takip edin ve güvenlik politikalarınızı dinamik tutun. iptables’ın gücü esnekliğinde yatar, bu esnekliği doğru kullandığınızda sistemleriniz çok daha güvenli bir hale gelir.