İptables ile Ağ Güvenliği: Temel Kurulum ve Yapılandırma Rehberi
- Murat Akpınar
- Linux , Network
- 3 Ağustos 2024
İçindekiler
Uzaktaki bir sunucuda iptables ile ilk kuralınızı yazdığınız an, aynı zamanda kendinizi o sunucudan kilitleyebileceğiniz andır. Kural yanlış sırada eklendiğinde ya da SSH portu farkında olmadan kapatıldığında hata mesajı almazsınız — oturumunuz donar ve bir daha bağlanamazsınız.
Bu yazıda iptables’ın nasıl çalıştığını, kuralların sırasının neden her şeyden önemli olduğunu ve temel komutları kendinizi dışarıda bırakmadan nasıl kullanacağınızı göreceğiz.
Aşağıdaki komutları uzaktan bağlandığınız bir sunucuda denemeyin. Önce bir sanal makinede veya konsol erişiminiz olan bir sistemde çalışın.
iptables Ne Yapar: Zincir, Kural, Hedef
iptables, Linux çekirdeğindeki paket filtreleme ve NAT mekanizmasının komut satırı arayüzüdür. Çalışma mantığı üç kavrama dayanır:
- Zincir (chain) — paketin nerede yakalandığı.
INPUTsunucuya gelen,OUTPUTsunucudan çıkan,FORWARDsunucu üzerinden geçen trafiktir. Bir yönlendirici kurmuyorsanız işiniz neredeyse tamamenINPUTiledir. - Kural (rule) — hangi paketin eşleşeceğini tarif eden koşullar: protokol, kaynak adres, hedef port.
- Hedef (target) — eşleşen pakete ne yapılacağı:
ACCEPTgeçirir,DROPsessizce yutar,REJECTise karşı tarafa “kapalı” cevabı döner. Aradaki fark önemlidir:DROPbağlantıyı zaman aşımına düşürür,REJECTanında hata verir.
Bir kural şu yapıyı izler:
iptables [SEÇENEK] [ZİNCİR] [KOŞULLAR] -j [HEDEF]
# örnek: 80 portuna gelen TCP paketlerini kabul et
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Paket işaretleme (-j MARK) ile trafik şekillendirmeye de girdi hazırlanabilir, ama şekillendirmenin kendisini tc yapar; iptables burada bant genişliğini sınırlamaz, yalnızca hangi paketin hangi sınıfa gireceğini belirler.
Kuralların Sırası Her Şeyi Belirler
iptables bir zincirdeki kuralları yukarıdan aşağıya, tek tek dener ve eşleşen ilk kuralda durur. Altındaki kurallar o paket için hiç çalışmaz. Bu yüzden aynı iki kural, sırası değiştiğinde tamamen zıt sonuç verir:
# Bu sırayla: 192.168.1.100 SSH'a bağlanabilir.
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# Bu sırayla: kimse bağlanamaz — ACCEPT kuralına sıra hiç gelmez.
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
-A kuralı listenin sonuna ekler. Bu yüzden zaten geniş bir DROP kuralınız varsa, sonradan -A ile eklediğiniz izin kuralı hiçbir işe yaramaz; o kuralın yukarıya girmesi gerekir ve bunun yolu -I‘dır.
Kurulum: Zaten Kurulu — Asıl Sorun firewalld ve nftables
iptables neredeyse tüm dağıtımlarda kurulu gelir; ayrıca kurmanız gerekmez. Yoksa:
sudo apt install iptables # Debian/Ubuntu
sudo dnf install iptables # RHEL 8+/Rocky/AlmaLinux/Fedora (eski sürümlerde: yum)
İki noktayı bilmekte fayda var:
- RHEL 7 ve sonrasında varsayılan güvenlik duvarı
firewalld‘dir. iptables kurallarını doğrudan yazacaksanızfirewalld‘yi durdurup devre dışı bırakmanız gerekir; ikisi aynı anda aynı tabloyu yönetirse kurallarınız beklenmedik anlarda silinir. - Modern dağıtımlarda
iptableskomutu aslında nftables’a yazar. Debian 11+, RHEL 8+ ve Ubuntu 20.04+ sürümlerindeiptablesbir uyumluluk katmanıdır (iptables-nft);iptables -Vçıktısındaki(nf_tables)ibaresi bunu gösterir. Komutlar aynı çalışır, amanft list rulesetçıktısında kurallarınızı farklı biçimde görürsünüz.
Temel Komutlar: Listele, Ekle, Sil
Kurallar Listeleme: Mevcut iptables kurallarını görmek için aşağıdaki komutu kullanabilirsiniz:
sudo iptables -L
Kurallar Ayrıntılı Listeleme: Kuralları numaralarıyla, isim çözümlemesi yapmadan ve eşleşme sayaçlarıyla birlikte listeler:
sudo iptables -n -L -v --line-numbers
-n DNS çözümlemesini kapatır (komut anında döner), -v her kurala kaç paketin takıldığını gösterir, --line-numbers ise silmek için gereken numarayı verir. Sayaçlar sorun giderirken en değerli bilgidir: bir kuralın sayacı sıfırsa o kurala hiç sıra gelmiyor demektir — büyük ihtimalle üstünde eşleşen başka bir kural vardır.
Tüm Kuralları Silme: Tüm kuralları veya belirtilen zincirdeki kuralları temizler.
sudo iptables -F
Dikkat:
-Fyalnızca kuralları siler, zincir politikalarını (-P) sıfırlamaz. PolitikanızDROPise kuralları temizlemek sistemi güvenli hâle getirmez; aksine tüm izin kurallarını silip her şeyi engeller ve uzaktaki bağlantınız o anda kopar. Politikayı da açmak için:sudo iptables -P INPUT ACCEPT
Kural Silme: Mevcut bir kuralı silmek için kural numarasını belirleyip aşağıdaki komutu kullanabilirsiniz:
sudo iptables -D INPUT 1
Örnek: 22 portundan gelen istekleri engellerken 80 portuna gelen istekleri kabul eder.
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Bu iki satırı uzaktaki bir sunucuda çalıştırmayın. İlk satır SSH portunu kapatır ve komutu yazdığınız oturum dahil hiç kimse bir daha bağlanamaz. Uzaktan çalışıyorsanız SSH’ı önce açıkça izinli hâle getirin ve yalnızca kendi IP’nize açın:
sudo iptables -I INPUT 1 -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
Parametre Özeti
Yukarıdaki komutlarda geçen seçenekler bir arada:
| Seçenek | Anlamı | Not |
|---|---|---|
-A |
Kuralı zincirin sonuna ekler | Üstte eşleşen bir DROP varsa bu satır hiç çalışmaz |
-I |
Kuralı belirtilen konuma ekler (-I INPUT 1 → en üste) |
Konum yazılmazsa başa gider. Mevcut kuralları silmez, aşağı kaydırır |
-R |
Belirtilen numaradaki kuralı değiştirir | -I araya girer, -R üzerine yazar — karıştırılır |
-D |
Kuralı siler (-D INPUT 1) |
Silince alttaki numaralar kayar; art arda silerken büyükten küçüğe gidin |
-P |
Zincirin varsayılan politikası (-P INPUT DROP) |
Hiçbir kural eşleşmezse bu uygulanır. -F bunu sıfırlamaz |
-p |
Protokol (tcp, udp, icmp) |
--dport/--sport yalnızca -p tcp/-p udp ile birlikte kullanılabilir |
-s / -d |
Kaynak / hedef adres | Tek adres ya da ağ: -s 192.168.1.0/24 |
-j |
Hedef (ACCEPT, DROP, REJECT, MARK) |
Verilmezse kural yalnız sayaç tutar, pakete bir şey yapmaz |
Kurallar Yeniden Başlatmada Kaybolur
Yazdığınız kurallar çekirdeğin belleğinde durur; sunucu yeniden başladığında hepsi silinir. Bu, ilk bakışta eksiklik gibi görünse de yeni başlayanlar için bir güvenlik ağıdır: kendinizi kilitlerseniz sunucuyu yeniden başlatmak kuralları sıfırlar.
Kuralları kalıcı hâle getirmek Debian/Ubuntu’da şöyle yapılır:
sudo apt install iptables-persistent
sudo netfilter-persistent save # /etc/iptables/rules.v4 dosyasına yazar
RHEL ailesinde iptables-services paketi aynı işi görür. Elle almak isterseniz:
sudo iptables-save > /etc/iptables/rules.v4 # kaydet
sudo iptables-restore < /etc/iptables/rules.v4 # geri yükle
Kalıcı hâle getirmeden önce mutlaka test edin. Yanlış bir kuralı kalıcı yaparsanız yeniden başlatmak artık sizi kurtarmaz.
Sonuç
- Sıra, kuralın kendisinden önemlidir. iptables eşleşen ilk kuralda durur;
-Asona,-Ibaşa ekler. Bir kural beklediğiniz gibi çalışmıyorsa önceiptables -n -L -v --line-numbersile sayaçlara bakın — sayacı sıfır olan kurala hiç sıra gelmiyordur. - Kendinizi kilitlememenin yolu, SSH’ı önce açıkça izinli yapmaktır. Uzaktaki bir sunucuda ilk komut
-I INPUT 1ile SSH iznini en üste koymak olmalı; kısıtlayıcı kurallar ondan sonra gelir. - Kurallar yeniden başlatmada uçar, kalıcılık ayrı bir adımdır. Bu aynı zamanda güvenlik ağınızdır: kalıcı hâle getirmeden önce yeni kural setiyle bağlantı kurabildiğinizi doğrulayın.
Ağ tarafında devam etmek için: Veri merkezinde BT yedekliliği — ağ, depolama, küme.