Sunucu Yönetimi & Linux

    iptables ile Güvenlik Duvarı Kuralları

    iptables ile paket filtreleme kurallarını yazma, port açma ve kuralları kalıcı hale getirmenin rehberi.

    13 dk okuma Güncellendi: 10 Temmuz 2026

    Bir sunucuya güvenlik duvarı kurmak, aslında "hangi pakete izin veriyorum, hangisini geri çeviriyorum" sorusuna verilen kuralların bütünüdür. Linux'ta bu kararların verildiği katman çekirdeğin içindeki netfilter'dır; onu komut satırından yönetmenin en klasik yolu da iptables'tır. Modern araçların çoğu (UFW, firewalld, Docker, Fail2ban) arka planda tam olarak buraya kural yazar. Dolayısıyla iptables kurallarını okuyup yazabilmek, hangi ön yüzü kullanırsanız kullanın, sunucunuzda ağ trafiğine gerçekte ne olduğunu görebilmenizi sağlar.

    Bu rehber, iptables'ı kavramsal olarak "nedir" diye anlatmaktan çok, pratikte kural nasıl yazılır sorusuna odaklanır. Bir kuralın tek tek parçalarını, INPUT/OUTPUT/FORWARD zincirlerini, ACCEPT ile DROP arasındaki farkı, porta ve IP'ye göre filtrelemeyi, established/related bağlantı durumunun neden hayati olduğunu, kural sıralamasının sonucu nasıl değiştirdiğini, kuralları yeniden başlatmaya dayanıklı hale getiren iptables-save/iptables-restore mekanizmasını ve son olarak NAT ile port yönlendirmenin temellerini gerçek komut örnekleriyle göreceksiniz. Uzaktan bağlı bir sunucuda çalıştığınızı varsayarak, kendinizi SSH oturumundan kilitlememenin yollarını da özellikle vurgulayacağım.

    Bir iptables Kuralını Parça Parça Okumak#

    iptables komutlarının gözünüzü korkutmasının tek sebebi, tek bir satıra çok fazla bayrağın sığdırılmasıdır. Oysa her kural aynı iskeleti izler: hangi zincire, nereye ekleneceği, hangi paketle eşleşeceği ve eşleştiğinde ne yapılacağı. Şu örneği parçalayalım:

    iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    
    • -A INPUT → kuralı INPUT zincirinin sonuna ekle (append). -I INPUT 1 deseydik en başa eklerdi; sıralama sonucu değiştirdiği için bu ayrım önemlidir.
    • -p tcp → yalnızca TCP protokolündeki paketlerle eşleş.
    • --dport 443 → hedef portu 443 (HTTPS) olan paketleri seç.
    • -j ACCEPT → eşleşen pakete uygulanacak hedef (jump); burada "kabul et".

    Bu dört bileşeni tanıdığınızda, en karmaşık kural bile okunabilir hale gelir. Kaynak IP eklemek için -s, hedef IP için -d, ağ arayüzü belirtmek için -i (gelen) ve -o (giden) bayraklarını kullanırsınız. Örneğin yalnızca belirli bir ofisten SSH'a izin vermek:

    iptables -A INPUT -p tcp -s 203.0.113.10 --dport 22 -j ACCEPT
    

    Bu satır "kaynağı 203.0.113.10 olan, 22 portuna TCP ile gelen paketleri kabul et" anlamına gelir. Kural yazarken her zaman kendinize "bu paket hangi özellikleriyle diğerlerinden ayrılıyor?" diye sorun; kuralın gövdesi bu cevaptan doğar.

    INPUT, OUTPUT ve FORWARD Zincirleri#

    filter tablosundaki üç yerleşik zincir, bir paketin sunucuya göre konumunu temsil eder. Doğru zincire yazmak, kuralın işe yaramasının ön koşuludur:

    • INPUT — hedefi bu sunucu olan gelen paketler. Biri 22, 80 ya da 443 portunuza bağlanmaya çalıştığında paket buradan geçer. Sunucu sertleştirmenin neredeyse tamamı bu zincirde olur, çünkü dışarıdan size kimin erişebileceğini burası belirler.
    • OUTPUT — kaynağı bu sunucu olan giden paketler. apt update çalıştırıp paket indirdiğinizde ya da dış bir API'ye istek attığınızda paket buradan çıkar. Çoğu senaryoda giden trafiği kısıtlamak gereksiz zorluk çıkarır, bu yüzden genellikle serbest bırakılır.
    • FORWARD — sunucudan geçip başka bir yere giden paketler. Yalnızca makineniz yönlendirici, VPN geçidi ya da konteyner ağı ana makinesi gibi davrandığında devreye girer. Sıradan bir web sunucusunda bu zinciri çoğu zaman kapalı bırakırsınız.

    Her zincirin bir de varsayılan politikası vardır: hiçbir kural eşleşmezse ne olacağını söyler. Yeni bir sistemde tüm politikalar ACCEPT'tir, yani "aksi söylenmedikçe her şeye izin ver". Güvenli bir yapılandırmada bunu tersine çeviririz — bir sonraki bölümlerde göreceğimiz "önce hepsini reddet, sonra gerekeni aç" stratejisinin özü budur. Yeni bir sunucu kurulumunda bu zincir mantığını ilk günden oturtmak, sonradan ortaya çıkacak birçok erişim sorununu baştan önler.

    ACCEPT, DROP ve REJECT Arasındaki Fark#

    Bir kural eşleştiğinde pakete ne olacağını -j (jump / hedef) belirler. Günlük kullanımda üç hedef yeterlidir ve aralarındaki fark yalnızca teknik değil, güvenlik açısından da anlamlıdır:

    HedefNe yaparGönderene dönen
    ACCEPTPaketin geçmesine izin verirNormal yanıt (bağlantı kurulur)
    DROPPaketi sessizce düşürürHiçbir şey; bağlantı zaman aşımına uğrar
    REJECTPaketi reddeder"Bağlantı reddedildi" (ICMP hata mesajı)

    DROP ile REJECT arasındaki seçim çoğu kişinin gözden kaçırdığı bir ayrımdır. DROP paketi sessizce yok eder; port tarayan bir saldırgan, kapalı bir port ile filtrelenmiş bir portu ayırt edemez, bağlantı zaman aşımına düşene kadar bekler. Bu, internete açık INPUT kuralları için tercih edilendir çünkü saldırgana en az bilgiyi verir. REJECT ise dürüst bir "hayır" döndürür; bu, yerel ağ içindeki hizmetler ya da bir uygulamanın hızlı hata alması gereken durumlar için daha kullanışlıdır, ama açık portun varlığını ele verir.

    Pratik bir örnek — belirli bir IP bloğunu tamamen sessizce dışarıda tutmak:

    iptables -A INPUT -s 198.51.100.0/24 -j DROP
    

    Bu satır, 198.51.100.0/24 ağından gelen tüm paketleri, portu ne olursa olsun düşürür. Kaynak IP saldırıları, kötü niyetli tarama ağları ya da tekrar eden istismar denemeleri için bu tür bir engelleme, bir DDoS koruma katmanının önündeki ilk basit savunma hattı olarak iş görür.

    Porta ve IP'ye Göre Kural Yazmak#

    Gerçek dünyadaki güvenlik duvarı yapılandırmalarının büyük kısmı, "şu portu şu kaynağa aç, gerisini kapat" cümlelerinden oluşur. Tipik bir web sunucusunu düşünelim: SSH'ı yalnızca sizin IP'nize açmak, HTTP ve HTTPS'i herkese açmak, geri kalan her şeyi düşürmek istiyoruz.

    # Loopback (yerel iç iletişim) her zaman serbest olmalı
    iptables -A INPUT -i lo -j ACCEPT
    
    # SSH: yalnızca yönetim IP'nizden
    iptables -A INPUT -p tcp -s 203.0.113.10 --dport 22 -j ACCEPT
    
    # Web trafiği: herkese açık
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    

    Birden fazla portu tek satırda açmak için multiport eşleştiricisini kullanabilirsiniz; bu hem kuralı kısaltır hem de listeyi okunaklı tutar:

    iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
    

    Bir port aralığı için --dport 6000:6010 yazımı geçerlidir. IP tarafında ise -s bayrağı hem tek adres (203.0.113.10) hem de CIDR bloğu (10.0.0.0/8) alır. Bir kuralı geri almak isterseniz, eklerken kullandığınız -A'yı -D ile değiştirip birebir aynı satırı yazmanız yeterlidir; iptables o kuralı bulup siler. Kural yazarken portlardan emin değilseniz, açık portları listeleyip sunucuda gerçekte hangi hizmetlerin dinlediğini görmek iyi bir başlangıç noktasıdır — var olmayan bir hizmet için port açmak, gereksiz saldırı yüzeyi demektir.

    Şimdiye kadar yazdığımız kurallarda kritik bir eksik var. INPUT politikasını DROP yapıp yalnızca 80 ve 443'ü açtığınızı düşünün. Sunucunuz apt update için dışarı bir istek attığında, karşıdan gelen cevap paketleri de INPUT zincirinden geçer — ve hiçbir kural onlarla eşleşmediği için düşürülür. Sonuç: sunucu internete "çıkabilir" ama cevapları alamaz, her şey zaman aşımına uğrar.

    Çözüm, netfilter'ın bağlantı takibi (connection tracking, conntrack) yeteneğini kullanmaktır. Bir paketin yeni bir bağlantı mı yoksa var olan bir bağlantının parçası mı olduğunu ayırt edebiliriz:

    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    

    Bu tek satır, "sunucunun kendisinin başlattığı ya da izin verdiği bir bağlantının devamı olan paketleri kabul et" der. ESTABLISHED, kurulmuş bir bağlantıya ait paketleri; RELATED ise mevcut bağlantıyla ilişkili yeni bağlantıları (örneğin FTP veri kanalı) kapsar. Bu kural neredeyse her güvenlik duvarı yapılandırmasının ilk sırasında yer alır, çünkü onsuz yalnızca en dar hizmetler çalışır. Doğru sıralanmış tam bir INPUT bloğu şöyle görünür:

    iptables -P INPUT DROP
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -p tcp -s 203.0.113.10 --dport 22 -j ACCEPT
    iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    

    Buradaki -P INPUT DROP satırını en sona ya da tüm izin kurallarını yazdıktan sonra çalıştırdığınızdan emin olun; politikayı önce DROP'a çevirip sonra kural eklerseniz ve SSH kuralınızı unutursanız, çalışan oturumunuz düşmese de yeni bağlantı kuramazsınız.

    Kural Sıralaması: İlk Eşleşen Kazanır#

    iptables kuralları bir listeyi yukarıdan aşağıya tarar ve ilk eşleşen kuralın hedefi uygulanır; ACCEPT, DROP ya da REJECT ise denetim orada biter. Bu "ilk eşleşen kazanır" ilkesi, iptables'ta en sık yapılan hataların da kaynağıdır. Şu iki satırın sırasını karşılaştırın:

    # YANLIŞ sıralama
    iptables -A INPUT -p tcp --dport 22 -j DROP
    iptables -A INPUT -p tcp -s 203.0.113.10 --dport 22 -j ACCEPT
    

    Bu dizilimde ikinci satır hiçbir zaman çalışmaz: 22 portuna gelen her paket önce ilk kuralla eşleşip düşürülür, altındaki "izin ver" kuralına sıra gelmez. Doğru mantık her zaman daha özel (dar) kuralları üste, daha genel (geniş) kuralları alta koymaktır:

    # DOĞRU sıralama
    iptables -A INPUT -p tcp -s 203.0.113.10 --dport 22 -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -j DROP
    

    Kuralları satır numaralarıyla görmek ve doğru yere eklemek için listeyi numaralı biçimde yazdırın:

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

    Bu komut her kuralın sırasını, eşleştiği paket/bayt sayacını (-v sayesinde) ve kaynak/hedef bilgisini gösterir. Yeni bir kuralı belirli bir konuma sokmak isterseniz -I INPUT 3 ... yazımıyla üçüncü sıraya ekleyebilirsiniz. Bir kuralın hiç sayaç biriktirmediğini görüyorsanız, muhtemelen üstündeki daha genel bir kural onu gölgeliyordur — bu, sıralama hatalarını ayıklamanın en pratik yoludur.

    Kuralları Kalıcı Yapmak: iptables-save ve restore#

    iptables kuralları çekirdeğin bellekte tuttuğu canlı bir listedir; sunucu yeniden başlatıldığında hepsi silinir. Bu yüzden kurallarınızı diske yazıp önyüklemede geri yüklemeniz gerekir. Bunun en taşınabilir yolu iptables-save ve iptables-restore ikilisidir.

    iptables-save mevcut tüm kuralları metin biçiminde standart çıktıya döker; onu bir dosyaya yönlendirirsiniz:

    iptables-save > /etc/iptables/rules.v4
    

    Geri yükleme ise tam tersidir; dosyayı iptables-restore'a besleyerek tüm kural setini tek seferde belleğe yazarsınız:

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

    Debian ve Ubuntu tarafında bu döngüyü otomatikleştiren iptables-persistent paketi vardır; kurulumda mevcut kuralları kaydetmeyi teklif eder ve her önyüklemede rules.v4/rules.v6 dosyalarını geri yükler:

    apt install iptables-persistent
    netfilter-persistent save    # değişiklikten sonra kaydetmek için
    

    RHEL, AlmaLinux ve Rocky ailesinde ise iptables-services paketi service iptables save komutuyla aynı işi görür. IPv6 kurallarınız varsa onları ip6tables-save ile ayrı bir dosyaya (rules.v6) kaydetmeyi unutmayın — modern sunucuların çoğu çift yığın (dual stack) çalışır ve yalnızca IPv4'ü korumak, IPv6 üzerinden açık bir kapı bırakır. Kritik kural setlerini bir yapılandırma yedeğiyle birlikte saklamak, bir felaket kurtarma senaryosunda size zaman kazandırır; düzenli yedekleme rutininize bu dosyaları da eklemenizi öneririm.

    NAT Temelleri: Port Yönlendirme ve Maskeleme#

    Şimdiye kadar hep filter tablosunda çalıştık. Sunucunuz bir yönlendirici, konteyner ana makinesi ya da ağ geçidi rolü üstlendiğinde ise nat tablosu devreye girer. NAT (Network Address Translation), paketlerin kaynak ya da hedef adresini değiştirmenizi sağlar. İki tipik senaryo vardır.

    Kaynak NAT / maskeleme (masquerade): iç ağdaki makinelerin sunucunun genel IP'si üzerinden internete çıkmasını sağlar. VPN geçitlerinde ve konteyner ağlarında en sık kullanılan kalıptır:

    # eth0, dış (genel) arayüz olsun
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    echo 1 > /proc/sys/net/ipv4/ip_forward
    

    İkinci satır, çekirdekte paket yönlendirmeyi açar; bunu kalıcı yapmak için /etc/sysctl.conf içinde net.ipv4.ip_forward=1 satırını etkinleştirin.

    Hedef NAT / port yönlendirme (DNAT): dışarıdan gelen bir portu, arkadaki başka bir makineye ya da porta yönlendirir. Örneğin genel IP'nizin 8080 portuna gelen isteği, iç ağdaki bir web sunucusunun 80 portuna iletmek:

    iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.0.0.5:80
    iptables -A FORWARD -p tcp -d 10.0.0.5 --dport 80 -j ACCEPT
    

    Dikkat: DNAT kuralını nat tablosunun PREROUTING zincirine yazmanız yeterli değildir; yönlendirilen paketin FORWARD zincirinden de geçmesine izin vermelisiniz, yoksa filter katmanı onu düşürür. NAT konusu tek başına geniş bir alandır ve üretim ortamında yanlış yapılandırılmış bir yönlendirme, dışa açık istenmeyen kapılar yaratabilir; karmaşık senaryolarda uzman desteği almak için sunucu yönetimi hizmetimiz devreye girebilir. Yüksek trafikli ya da yönlendirme yapan yapılar için kaynakları esnek bir VDS sunucu üzerinde çalıştırmak, iptables kurallarınıza nefes alma payı bırakır.

    UFW Aslında iptables'ı Sarmalar#

    Birçok kullanıcı UFW ya da firewalld'yi "iptables'ın alternatifi" sanır; oysa bunlar birer ön yüztür. UFW'de ufw allow 443/tcp yazdığınızda, arka planda tam olarak bizim yukarıda elle yazdığımız türden iptables kuralları üretilir. Bunu kendiniz görebilirsiniz:

    ufw allow 443/tcp
    iptables -L -n    # UFW'nin ürettiği zincirleri (ufw-user-input vb.) burada görürsünüz
    

    Bu yüzden iptables mantığını öğrenmek boşa değildir: UFW'nin neden bir kuralı beklediğiniz gibi uygulamadığını, Docker'ın neden UFW kurallarınızı atlayıp doğrudan iptables'a yazdığını ya da Fail2ban'in bir IP'yi nasıl anında engellediğini ancak bu alt katmanı bildiğinizde anlarsınız. Günlük yönetimde çoğu sunucu için UFW ile güvenlik duvarı kullanmak hem hızlı hem de hata riski düşük bir yaklaşımdır; ham iptables ise size gereken ince ayarı verir. İkisi arasında seçim yaparken kural şu kadar basit: karmaşık NAT/yönlendirme yoksa UFW ile başlayın, özel senaryolar çıktığında iptables'a inin. Güvenlik duvarı yapılandırması, sunucu güvenliğinin temelleri içinde tek bir halkadır — SSH sertleştirme, otomatik güncelleme ve izleme ile birlikte anlam kazanır.

    Sıkça Sorulan Sorular#

    iptables mi nftables mı kullanmalıyım?#

    Yeni bir sistem kuruyorsanız ve dağıtımınız destekliyorsa nftables daha modern ve okunabilir bir sözdizimi sunar. Ancak iptables komutları o kadar yaygındır ki çoğu güncel dağıtımda iptables çağrıları arka planda nftables'a çevrilerek çalışır (iptables-nft uyumluluk katmanı). Pratikte iptables sözdizimini öğrenmek hâlâ en getirili yatırımdır, çünkü internetteki dokümanların, betiklerin ve araçların büyük kısmı bu dili konuşur.

    Yanlış kural yazıp SSH'tan kilitlenirsem ne yaparım?#

    Panik yapmadan önce, aktif SSH oturumunuz ESTABLISHED durumda olduğu için genellikle hemen düşmez; asıl risk yeni bağlantı kuramamaktır. Bu yüzden riskli değişikliklerden önce zamanlanmış bir güvenlik ağı kurun: at now + 5 minutes -f /root/reset-fw.sh gibi bir komutla, beş dakika içinde kuralları temizleyen bir betik planlayın. Erişiminizi tümüyle kaybederseniz, hosting panelindeki konsol/VNC ya da kurtarma modu üzerinden makineye girip iptables -F ile tüm kuralları temizleyebilirsiniz.

    iptables -F komutu tam olarak ne yapar?#

    iptables -F (flush) mevcut tüm kuralları siler ama varsayılan politikaları değiştirmez. Eğer daha önce -P INPUT DROP demişseniz, tüm kuralları temizledikten sonra politika hâlâ DROP olduğu için sunucu erişilemez kalabilir. Bu yüzden acil bir sıfırlamada önce politikaları iptables -P INPUT ACCEPT ile açık konuma alıp sonra -F çalıştırmak daha güvenlidir. Flush işlemi yalnızca bellekteki kuralları etkiler; diske kaydedilmiş rules.v4 dosyanız yerinde kalır.

    DROP mı REJECT mi tercih etmeliyim?#

    İnternete açık INPUT kuralları için genellikle DROP tercih edilir, çünkü saldırgana en az bilgiyi verir; port taraması yapan biri açık ile filtrelenmiş portu ayırt edemez ve zaman aşımına kadar bekler. Buna karşılık yerel ağ içindeki hizmetlerde ya da bir istemcinin hızlı hata alması gereken durumlarda REJECT daha kullanıcı dostudur, çünkü bağlantıyı beklemeye almak yerine anında reddeder. Kural olarak, dışarıya bakan yüzeyde DROP, iç ağda REJECT mantıklı bir varsayılandır.

    Kuralları yazdım ama yeniden başlatınca kayboluyor, neden?#

    Çünkü iptables kuralları çekirdeğin bellekte tuttuğu geçici bir listedir ve sunucu kapanınca kaybolur. Kuralları kalıcı hale getirmek için iptables-save > /etc/iptables/rules.v4 ile diske yazmanız ve önyüklemede geri yükleyecek bir mekanizma (Debian/Ubuntu'da iptables-persistent, RHEL ailesinde iptables-services) kurmanız gerekir. Bu adımı atlarsanız kurallarınız yalnızca bir sonraki yeniden başlatmaya kadar yaşar.

    Belirli bir ülkeyi ya da IP bloğunu iptables ile engelleyebilir miyim?#

    Evet, tek tek IP blokları için iptables -A INPUT -s 198.51.100.0/24 -j DROP yeterlidir. Ancak yüzlerce ya da binlerce blok engelleyecekseniz tek tek kural yazmak yerine ipset kullanmalısınız; ipset binlerce adresi tek bir küme (set) olarak tutar ve iptables tek bir kuralla o kümeyi kontrol eder, bu da performansı ciddi biçimde artırır. Coğrafi engelleme için ise güncel ülke IP listelerini bir ipset'e yükleyip tek kuralla eşleştirmek yaygın bir yöntemdir.

    Kapanış#

    iptables ilk bakışta karmaşık bir bayrak yığını gibi görünse de, aslında dört basit soruya dayanır: hangi zincire, hangi pakete, hangi sırada ve ne yapılacak? Bu iskeleti kavradığınızda; port ve IP bazlı filtrelemeden established/related bağlantı takibine, kural sıralamasından iptables-save ile kalıcılığa ve NAT/port yönlendirmeye kadar her şey aynı mantığın uzantısı haline gelir. En önemli iki alışkanlık, "önce reddet sonra gerekeni aç" stratejisini benimsemek ve riskli değişikliklerden önce mutlaka bir kurtarma ağı bırakmaktır.

    Güvenlik duvarı, sağlam bir altyapının yalnızca bir katmanıdır. Sunucularınızı kurallı, izlenen ve yedeklenen bir zemin üzerinde çalıştırmak istiyorsanız Clou.TR'nin yönetilen sunucu çözümleri ve uzman sunucu yönetimi hizmetiyle, iptables'tan DDoS korumasına kadar tüm katmanları sizin yerinize doğru yapılandırabiliriz. Yeni bir projeye başlıyorsanız esnek VDS sunucu paketlerimizi inceleyin; güvenliği ilk günden doğru kuran bir altyapı, ilerideki birçok baş ağrısını baştan önler.

    iptablesGüvenlikLinux

    Uygulamaya geçmeye hazır mısınız?

    NVMe SSD, ücretsiz SSL ve %99.9 uptime garantisiyle Clou.TR hosting ve sunucu çözümleriyle projenizi hayata geçirin.