iptables Zincir ve Tablo Yapısı: INPUT Zinciri Rehberi

Linux sistemlerde ağ güvenliğini yönetmek, bir sistem yöneticisinin günlük rutininin ayrılmaz bir parçasıdır. iptables, bu alanda yıllardır en güvenilir araçlardan biri olarak öne çıkmaktadır. Ancak pek çok sysadmin, özellikle işin başındakiler, iptables’ın zincir ve tablo yapısını tam olarak kavramadan komutları kopyala-yapıştır yöntemiyle kullanır. Bu yaklaşım kısa vadede işe yarasa da bir gün ciddi bir güvenlik açığına ya da beklenmedik bir servis kesintisine yol açabilir. Bu yazıda, özellikle INPUT zinciri üzerine odaklanarak iptables’ın iç yapısını derinlemesine inceleyeceğiz.

iptables Nedir ve Neden Hala Önemlidir?

iptables, Linux çekirdeğinin netfilter framework’ü üzerinde çalışan bir paket filtreleme aracıdır. nftables ve firewalld gibi daha modern alternatiflerin ortaya çıkmasına rağmen, iptables hala milyonlarca üretim sunucusunda aktif olarak kullanılmaktadır. Özellikle eski sistemlerle çalışan ekipler, Docker ve Kubernetes altyapıları ve bazı bulut sağlayıcılarının arka planda hala iptables kullandığını düşününce bu aracı iyi anlamanın önemi ortaya çıkar.

iptables’ın çalışma mantığını anlamak için önce iki temel kavramı netleştirmek gerekir: tablolar ve zincirler.

Tablolar: Paketin Amacına Göre Ayrışma

iptables’ta her kural, belirli bir tabloya aittir. Her tablonun farklı bir görevi vardır ve paketler farklı aşamalarda farklı tablolardan geçer.

Dört ana tablo şunlardır:

  • filter: Varsayılan tablodur. Paketlerin kabul edilip edilmeyeceğine karar verir. INPUT, OUTPUT ve FORWARD zincirleri burada bulunur.
  • nat: Ağ adresi çevirimi (NAT) işlemleri için kullanılır. PREROUTING, POSTROUTING ve OUTPUT zincirleri içerir.
  • mangle: Paket başlıklarını değiştirmek için kullanılır. TTL, TOS gibi alanlar burada manipüle edilir.
  • raw: Bağlantı takibinden (connection tracking) muaf tutulacak paketler için kullanılır.

Günlük operasyonlarda en çok filter tablosuyla çalışırız. Bir kural yazarken -t parametresiyle tablo belirtmezseniz, iptables otomatik olarak filter tablosunu kullanır.

Zincirler: Paketin Yolculuğu

Bir paket sisteminize geldiğinde, kernel içinde belirli kontrol noktalarından geçer. Bu kontrol noktaları zincirleri oluşturur. filter tablosundaki üç temel zincir şunlardır:

  • INPUT: Sisteme gelen ve yerel bir işleme (local socket) yönelen paketler bu zincirden geçer.
  • OUTPUT: Sistemden çıkan paketler bu zincirden geçer.
  • FORWARD: Sisteminiz üzerinden başka bir hedefe yönlendirilen paketler bu zincirden geçer. Router olarak çalışan sistemlerde önemlidir.

Paketin yolculuğunu şöyle özetleyebiliriz: Dışarıdan bir paket gelir, önce PREROUTING (nat tablosunda) aşamasından geçer, ardından kernel paketi nereye göndereceğine karar verir. Eğer paket yerel bir servise aitse INPUT zincirine girer. Eğer başka bir hedefe yönlendirilecekse FORWARD zincirine girer.

INPUT Zinciri: Gelen Trafiğin Bekçisi

INPUT zinciri, sunucunuzun dışarıdan aldığı tüm bağlantıların geçtiği kapıdır. Web sunucunuza gelen HTTP istekleri, SSH bağlantı talepleri, veritabanı sorguları… hepsi önce bu zincirden geçer.

Mevcut INPUT kurallarınızı görmek için:

iptables -L INPUT -v -n --line-numbers

Bu komuttaki parametreler:

  • -L INPUT: Sadece INPUT zincirini listele
  • -v: Verbose mod, paket ve byte sayaçlarını göster
  • -n: IP adreslerini ve portları sayısal formatta göster (DNS çözümlemesi yapma)
  • –line-numbers: Kural numaralarını göster

Çıktı şuna benzer bir şey olacaktır:

Chain INPUT (policy ACCEPT)
num  pkts bytes target     prot opt in     out     source               destination
1     156  12480 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
2    1823 145840 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
3     412  33200 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80

Default Policy: Her Şeyin Temeli

INPUT zincirinin en kritik özelliği default policy‘dir. Bu, hiçbir kuralla eşleşmeyen paketlere ne yapılacağını belirler. İki seçenek vardır: ACCEPT veya DROP.

# Varsayılan politikayı DROP olarak ayarla (güvenli yaklaşım)
iptables -P INPUT DROP

# Varsayılan politikayı ACCEPT olarak ayarla
iptables -P INPUT ACCEPT

Üretim sunucularında altın kural şudur: Önce izin vereceklerinizi tanımlayın, sonra default policy’yi DROP yapın. Tersi sırayla yaparsanız, kendinizi sunucudan kitleyebilirsiniz. Bu hatayı bir kez yaşayan sysadmin bir daha yaşamaz, çünkü genellikle gece 2’de veri merkezine fiziksel erişim sağlamak zorunda kalır.

Gerçek Dünya Senaryosu: Yeni Bir Web Sunucusu Güvenliğe Almak

Diyelim ki yeni bir Ubuntu/CentOS sunucusu kurdunuz ve üzerine Nginx deploy edeceksiniz. Sunucuya sadece belirli portlardan erişilmesini istiyorsunuz. Adım adım gidelim.

1. Adım: Mevcut kuralları temizle

# Tüm zincirlerdeki kuralları temizle
iptables -F

# Özel zincirleri sil
iptables -X

# Sayaçları sıfırla
iptables -Z

2. Adım: Temel güvenli kuralları ekle

# Loopback arayüzüne tam erişim ver (localhost trafiği)
iptables -A INPUT -i lo -j ACCEPT

# Mevcut ve ilişkili bağlantılara izin ver (stateful firewall)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH erişimine izin ver (sadece belirli IP'den)
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT

# 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) için izin ver, ama rate limit uygula
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# Default policy'yi DROP yap
iptables -P INPUT DROP

Bu kural setinin mantığı şudur: Önce güvenilir olan her şeye kapıyı açıyoruz (loopback, established bağlantılar, gerekli servisler), sonra “tanımadığım her şeyi reddet” diyoruz.

Kural Sırası: Asla Göz Ardı Etme

iptables kuralları sırayla işlenir. İlk eşleşen kuralda işlem durur. Bu yüzden kural sırası kritiktir.

# Kural numarasına göre belirli bir pozisyona ekle
# 3. sıraya yeni kural ekle
iptables -I INPUT 3 -p tcp --dport 8080 -j ACCEPT

# Sona ekle (-A: append)
iptables -A INPUT -p tcp --dport 9090 -j ACCEPT

# Belirli bir kuralı sil (numara ile)
iptables -D INPUT 3

# Belirli bir kuralı sil (kural tanımıyla)
iptables -D INPUT -p tcp --dport 8080 -j ACCEPT

Kural sırasının önemini şöyle açıklayayım: Diyelim ki önce tüm TCP trafiğini DROP eden bir kural koydunuz, sonra SSH’a izin veren bir kural eklediniz. SSH kuralı hiçbir zaman işlenmez çünkü paket daha önce DROP kuralıyla eşleşir.

Module Kullanımı: iptables’ın Gücünü Artırın

iptables’ı gerçekten güçlü kılan şeylerden biri modülleridir. -m parametresiyle modüller yüklenebilir.

Connection State Modülü

En sık kullanılan modüldür. Paketin bağlantı durumuna göre işlem yapmanıza olanak tanır.

# Stateful firewall kuralı
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP

Durum değerleri:

  • NEW: Yeni bir bağlantı başlatıyor
  • ESTABLISHED: Var olan bir bağlantıya ait paket
  • RELATED: Var olan bir bağlantıyla ilgili yeni bir bağlantı (FTP data bağlantısı gibi)
  • INVALID: Hiçbir bağlantıya ait olmayan, tanımsız paket

Limit Modülü: Brute Force Koruması

# SSH brute force saldırısına karşı koruma
# Dakikada 5'ten fazla yeni SSH bağlantısını engelle
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 5/min --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP

Multiport Modülü: Birden Fazla Port

# Tek kuralla birden fazla port için izin ver
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080,8443 -j ACCEPT

Recent Modülü: Gelişmiş Rate Limiting

# Belirli bir IP'den gelen bağlantı sayısını takip et
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH_TRACK
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 10 --name SSH_TRACK -j DROP

LOG Hedefi: Olayları Kayıt Altına Almak

Güvenlik olaylarını kayıt altına almak, özellikle bir saldırı sonrasında forensic analiz için hayat kurtarır.

# DROP etmeden önce logla
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 --name SSH_TRACK -j LOG --log-prefix "SSH-BRUTE-FORCE: " --log-level 4
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 --name SSH_TRACK -j DROP

# Genel olarak reddedilen paketleri logla
iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " --log-level 4
iptables -A INPUT -j DROP

Log kayıtları genellikle /var/log/syslog veya /var/log/kern.log dosyasına düşer. dmesg komutuyla da anlık olarak takip edebilirsiniz.

Gerçek Dünya Senaryosu: DDoS Koruması

Bir gün sabah erkenden alarmınız çalar. Sunucunuza yönelik bir DDoS saldırısı var ve sistem neredeyse yanıt vermez hale gelmiş. Aşağıdaki kural seti bu tür durumlarda ilk müdahale olarak kullanılabilir.

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

# Geçersiz paketleri düşür
iptables -A INPUT -m state --state INVALID -j DROP

# Parçalanmış paketleri düşür (genellikle saldırı aracı)
iptables -A INPUT -f -j DROP

# Nul paketleri düşür
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# Xmas paketleri düşür
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# Belirli bir IP'yi tamamen engelle
iptables -I INPUT 1 -s 185.220.101.0/24 -j DROP

Kuralları Kalıcı Hale Getirme

iptables kuralları varsayılan olarak bellekte tutulur ve sunucu yeniden başlatıldığında kaybolur. Kuralları kalıcı hale getirmek için:

Debian/Ubuntu sistemlerde:

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

# Mevcut kuralları kaydet
netfilter-persistent save

# Veya manuel olarak
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

RHEL/CentOS sistemlerde:

# Kuralları kaydet
service iptables save

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

# Servis durumunu kontrol et
systemctl status iptables

Kuralları geri yüklemek için:

iptables-restore < /etc/iptables/rules.v4

Özel Zincirler: Kuralları Modülerleştirme

Kural sayınız arttıkça yönetimi kolaylaştırmak için özel zincirler oluşturabilirsiniz.

# Özel bir zincir oluştur
iptables -N SSH_RULES

# Bu zincire kurallar ekle
iptables -A SSH_RULES -s 192.168.1.0/24 -j ACCEPT
iptables -A SSH_RULES -s 10.0.0.0/8 -j ACCEPT
iptables -A SSH_RULES -j DROP

# INPUT zincirinden bu özel zincire yönlendir
iptables -A INPUT -p tcp --dport 22 -j SSH_RULES

Bu yaklaşım özellikle karmaşık kural setlerinde okunabilirliği artırır ve yönetimi kolaylaştırır. Bir değişiklik yapmak istediğinizde sadece ilgili özel zinciri düzenlemeniz yeterlidir.

iptables ile Docker: Beklenmedik Etkileşim

Pek çok sysadmin, Docker yükledikten sonra iptables kurallarının beklenmedik şekilde değiştiğini fark eder. Docker kendi NAT ve FORWARD kurallarını iptables’a ekler. Bu durum, bazı güvenlik kurallarını bypass edebilir.

# Docker tarafından oluşturulan kuralları görmek için
iptables -L -v -n
iptables -t nat -L -v -n

# Docker'ın iptables'ı değiştirmesini engelle (docker daemon konfigürasyonu)
# /etc/docker/daemon.json dosyasına ekle:
# { "iptables": false }

Ancak Docker’ın iptables yönetimini tamamen kapatmak, konteyner ağ bağlantısını etkileyebilir. Bu konuda dengeli bir yaklaşım benimsemek gerekir.

Kural Setini Test Etme

Yeni kural seti uygulamadan önce test etmek kritiktir. Özellikle uzak bir sunucuya bağlı çalışırken kendinizi kitlememeniz için şu yaklaşımı kullanabilirsiniz:

# Kuralları uygula ama 30 saniye sonra otomatik geri al
# Eğer her şey yolundaysa bu süre içinde onaylamanız gerekir
(sleep 30 && iptables-restore < /etc/iptables/rules.v4.backup) &
iptables-restore < /etc/iptables/rules.v4.new

# Her şey yolundaysa arka planda çalışan geri alma komutunu iptal et
kill %1

Bu teknik, “eğer SSH bağlantısı kesilirse 30 saniye sonra eski kurallar geri yüklenir” güvencesi sağlar. Yıllarca beni birçok kriz durumundan kurtaran bir yaklaşım.

Performans Konuları

Kural sayısı arttıkça performans düşüşü yaşanabilir. Her paket, eşleşme bulana kadar tüm kuralları sırayla kontrol eder. Performans için:

  • En sık eşleşen kuralları listeye öne koyun
  • ipset modülünü kullanarak büyük IP listelerini daha verimli yönetin
  • Gereksiz kuralları düzenli olarak temizleyin
# ipset ile büyük IP bloklama listesi oluştur
ipset create BLACKLIST hash:net
ipset add BLACKLIST 185.220.101.0/24
ipset add BLACKLIST 45.142.212.0/24

# Bu listeyi iptables kuralına bağla
iptables -A INPUT -m set --match-set BLACKLIST src -j DROP

Sonuç

iptables’ın zincir ve tablo yapısını, özellikle INPUT zincirini derinlemesine anlamak, bir sistem yöneticisi olarak ağ güvenliği konusunda çok daha bilinçli kararlar almanızı sağlar. Sadece komutları bilmek yetmez; paketin kernel içindeki yolculuğunu, zincirlerin nasıl işlendiğini ve kural sırasının neden önemli olduğunu kavramak gerekir.

Günlük pratikte şu ilkelere sadık kalmak iyi bir başlangıç noktası oluşturur: Default policy’yi DROP olarak ayarla, gerçekten ihtiyaç duyduğun trafiğe izin ver, her şeyi logla ve kuralları düzenli olarak gözden geçir. Yedek almadan kural değişikliği yapma ve mutlaka bir geri alma planın olsun.

nftables ve firewalld gibi araçlar giderek daha yaygın hale gelse de iptables bilgisi hala değerini korumaktadır. Çünkü bu araçların birçoğu arka planda iptables veya netfilter kullanmaktadır. Temeli iyi anlayan biri, üst katman araçlarını da çok daha etkili kullanır.

Son olarak şunu söylemeliyim: En iyi güvenlik duvarı, doğru yapılandırılmış ve düzenli olarak denetlenen güvenlik duvarıdır. Ne kadar karmaşık kural yazarsanız yazın, eğer yılda bir kez bile olsa gözden geçirmezseniz, zamanla gereksiz kurallar birikir ve gerçek güvenlik açıkları gözden kaçabilir. Kural setinizi canlı tutun, belgelendirin ve ekibinizle paylaşın.

Yorum yapın