Ana içeriğe geç

iptables temel Linux güvenlik duvarı ayarlama

Bu makalede

iptables— Linux çekirdeğinde ağ trafiğini filtrelemek ve yönetmek için yerleşik çerçevedir. Kurallara dayalı olarak gelen, giden ve geçiş bağlantılarını esnek bir şekilde kontrol etmenizi sağlar.

Not

iptables neredeyse tüm Linux dağıtımlarında önceden kurulu gelir.
Yeni sistemlerde (RHEL 8+, Ubuntu 20.04+), varsayılan nftables (yani nft komutu) olabilir, ancak iptables iptables-legacy arayüzüyle geriye dönük uyumludur.
Bulut veya VPS sunucuları için — iptables ayarlamak güvenlik için kritik öneme sahiptir.

Temel Kavramlar

Üç zincir (chains)

Zincir Amaç
INPUT Sunucuya gelen trafik (SSH, HTTP, vb.)
OUTPUT Sunucudan çıkan trafik (güncellemeler, API istekleri)
FORWARD Sunucu üzerinden geçen trafik (yalnızca yönlendirme/NAT durumunda)

Not

INPUT ile dikkatli olun!
İzin olmadan port 22'yi engellemek sunucudan bağlantınızı kesebilir. Kuralları uygulamadan önce her zaman gözden geçirin.

Nasıl çalışır

  1. Bir paket uygun zincire INPUT, OUTPUT, FORWARD girer.
  2. Kurallar sıra içinde değerlendirilir — eşleşme bulunduğunda belirtilen eylem gerçekleştirilir.
  3. Eşleşme bulunamazsa, varsayılan politika policy uygulanır.

Eylemler (hedefler)

Eylem Davranış Öneri
ACCEPT Paketi kabul et Güvenilen hizmetler için (SSH, HTTP)
DROP Paketi sessizce düşür (cevap yok) Güvenlik için en iyi seçim — portun varlığını gizler
REJECT ICMP hatasıyla (ör. port-unreachable) reddet Geri bildirim gerektiğinde kullanın (ör. hata ayıklama)

Not

Güvenlik kuralı
Varsayılan olarak — her şeyi reddet, ardından yalnızca gerekli olanları kabul et.

Temel komut sözdizimi

iptables [options] CHAIN [criteria] -j ACTION

Ana seçenekler:

Seçenek Amaç
-A Kuralı zincirin sonuna ekle
-I Kuralı başlangıçta ekle (veya belirli bir numarada: -I INPUT 1)
-D Kuralı sil (numara ile veya satırı kopyalayarak)
-L Kuralları listele
-F Zincirdeki tüm kuralları temizle
-P Varsayılan politika ACCEPT, DROP olarak ayarla

Sık kullanılan kriterler:

Seçenek Örnek Açıklama
-p tcp/udp/icmp -p tcp Protokol
--dport N --dport 22 Hedef port
-s IP/MASK -s 192.168.1.5<b-s 203.0.113.0/24 Kaynak (IP veya alt ağ)
-i interface -i eth0 Gelen arayüz
-m state --state NEW,ESTABLISHED -m state --state NEW Bağlantı durumu
-m connlimit --connlimit-above 5 Bağlantı limiti

Görüntüleme ve sorun giderme

Tüm kuralları görüntüle (okunabilir):

sudo iptables -L -n -v --line-numbers
- -n — isimleri çözme (daha hızlı); - -v — ayrıntılı çıktı; - --line-numbers — kural numaralarını göster (silme için faydalı).

Varsayılan politikaları görüntüle:

sudo iptables -S | grep '^:'
# Veya:
sudo iptables -L | head -3

Pratik kural örnekleri

1. Temel güvenlik ayarı (önerilir!)

# 1. Tüm trafiği döngü arayüzüne izin ver
sudo iptables -A INPUT -i lo -j ACCEPT
# 2. Daha önce kurulan bağlantılara izin ver (önemli!)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 3. SSH'ye izin ver (değiştirilmişse 22'yi kendi portunuzla değiştir!)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 4. HTTP/HTTPS'e izin ver
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 5. Diğer her şeyi varsayılan olarak düşür
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT   # ← genellikle çıkışa izin verilir

2. Erişim kısıtlaması

# Sadece bir IP'den MySQL (3306) izin ver
sudo iptables -A INPUT -s 203.0.113.15 -p tcp --dport 3306 -j ACCEPT
# Şüpheli bir IP'den gelen tüm trafiği engelle
sudo iptables -A INPUT -s 198.51.100.77 -j DROP

3. Saldırı Koruması

# Bozuk/geçersiz paketleri engelle
sudo iptables -A INPUT -m state --state INVALID -j DROP
# SYN‑flood'ı engelle
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP
# HTTP bağlantılarını sınırlayın (tek IP'den 20'den fazla eşzamanlı bağlantı yok)
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j DROP

4. Kayıt

# Kapatılmış portlara bağlanma girişimlerini kaydet (dakikada ilk 5)
sudo iptables -A INPUT -p tcp -m multiport --dports 22,3389,5900 \
  -m limit --limit 5/min -j LOG --log-prefix "PORT-SCAN: " --log-level 4

# Sonra engelle
sudo iptables -A INPUT -p tcp -m multiport --dports 22,3389,5900 -j DROP

Yeniden başlatma sonrası kuralların kaydedilmesi

iptables kuralları otomatik olarak kaydedilmez — sadece çekirdek belleğinde bulunur.

RHEL / CentOS 7 ve önceki sürümler için:

sudo /sbin/service iptables save
# veya
sudo iptables-save > /etc/sysconfig/iptables

Debian / Ubuntu için:

Kalıcı paketini kurun:

sudo apt update && sudo apt install iptables-persistent
Kurulum sırasında sistem mevcut kuralları kaydetmenizi isteyecek — "Yes" seçin.

Daha sonra kaydedilen kuralları güncelleyin:

sudo netfilter-persistent save
# veya doğrudan:
sudo iptables-save > /etc/iptables/rules.v4

Not

Yeniden başlatmadan önce kuralları doğrulayın:

sudo iptables-restore -t < /etc/iptables/rules.v4
-t bayrağı yalnızca sözdizimi kontrolü yapar, uygulama yok.

Kuralları Kaldırma

Numara ile sil (bkz --line-numbers):

sudo iptables -D INPUT 3   # INPUT zincirinde #3 kuralını sil

Tam eşleşme ile sil:

sudo iptables -D INPUT -s 198.51.100.77 -j DROP

Bir zinciri boşalt:

sudo iptables -F INPUT      # yalnızca INPUT zincirini boşalt
sudo iptables -F            # tüm zincirler

Varsayılan politikaları sıfırla:

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

Bilgi

  1. Kuralları yerel olarak veya konsol üzerinden test edin (SSH değil!), özellikle INPUT değiştirirken.
  2. screen veya tmux kullanarak hata durumunda oturumu kaybetmemenizi sağlayın.
  3. Daha modern araçlara geçmeyi düşünün:

    • ufwiptables için basitleştirilmiş arayüz (Ubuntu/Debian);
    • firewalld — RHEL/CentOS için dinamik firewall;
    • nftables — Linux çekirdeğinin geleceği (daha verimli ve özlü sözdizimi).