Ağ Araçları
TEKNİK REHBER AĞ ARAÇLARI GÜVENLİK DUVARI 2026

iptables & nftables
linux güvenlik duvarı.

Netfilter üzerine inşa edilmiş iki farklı arayüz — biri 25 yıllık savaş testinden geçmiş, diğeri modern ve esnek. İkisini de bil.

00 Netfilter mimarisi — zincirler ve tablolar

iptables, Linux kernel'ında yaşayan Netfilter framework'ünün kullanıcı alanı arayüzüdür. Netfilter, paketlerin kernel ağ yığınından geçtiği noktalara hook'lar yerleştirir.

Tablolar

filter
Varsayılan tablo. Paketleri kabul et, reddet, düşür. INPUT, OUTPUT, FORWARD zincirleri içerir.
nat
Ağ adresi çevirisi. PREROUTING, OUTPUT, POSTROUTING zincirleri. Her akış için yalnızca ilk paket değerlendirilir.
mangle
Paket header'larını değiştir — TTL, TOS, DSCP işaretleme. QoS ve policy routing için kullanılır.
raw
Connection tracking'den önce çalışır. Yüksek performanslı kurallarda CT bypass için.
security
SELinux gibi MAC sistemleri için. Nadiren doğrudan kullanılır.

Paket akış diyagramı

  Gelen paket (NIC)
       ↓
  [PREROUTING]  ← nat, mangle, raw
       ↓
  Routing kararı
     /     \
    ↓       ↓
 [INPUT]  [FORWARD]  ← filter, mangle
    ↓       ↓
  Yerel   [POSTROUTING]  ← nat, mangle
 Süreç        ↓
    ↓       Giden NIC
  [OUTPUT]
    ↓
  [POSTROUTING]
    

Zincirler

INPUT
Bu host'a gelen ve yerel sürece iletilecek paketler. SSH, HTTP, DNS gelen trafiği burada.
OUTPUT
Yerel süreçten çıkan paketler. Sistemin dışarıya açtığı bağlantılar.
FORWARD
Bu host üzerinden geçen (route edilen) paketler. Router/NAT senaryolarında kullanılır.
PREROUTING
Routing kararından önce — DNAT için kullanılır.
POSTROUTING
Routing kararından sonra — SNAT/MASQUERADE için kullanılır.

01 iptables temel komutlar

iptables'ın CRUD operasyonlarını öğren — kural ekle, listele, sil, zincir politikasını ayarla.

bash
# Kuralları listele (verbose, sayısal)
sudo iptables -L -v -n
sudo iptables -L INPUT -v -n --line-numbers  # satır numarasıyla

# nat tablosunu listele
sudo iptables -t nat -L -v -n

# Kural ekle: INPUT zincirinin SONUNA ekle (-A = append)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Kural ekle: INPUT zincirinin BAŞINA ekle (-I = insert, pozisyon 1)
sudo iptables -I INPUT 1 -s 192.168.1.0/24 -j ACCEPT

# Kural sil: satır numarasıyla
sudo iptables -D INPUT 3

# Kural sil: kural içeriğini belirterek (-D = delete)
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT

# Zincirdeki tüm kuralları sil (-F = flush)
sudo iptables -F INPUT
sudo iptables -F        # tüm zincirleri temizle

# Varsayılan politika ayarla (-P = policy)
sudo iptables -P INPUT DROP      # whitelist modeli: önce hepsini düşür
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

Hedef türleri (-j)

ACCEPT
Paketi kabul et, işlemeye devam et.
DROP
Paketi sessizce düşür — gönderene hiçbir yanıt dönmez. Güvenlik için tercih edilir.
REJECT
Paketi reddet ve gönderene ICMP hata mesajı gönder. Hata ayıklamayı kolaylaştırır ama port durumunu açığa çıkarır.
LOG
Paketi kernel log'a yaz (dmesg/syslog). Sonraki kural uygulanmaya devam eder.
RETURN
Mevcut zincirden çık, çağıran zincire dön.
özel zincir adı
Kendi oluşturduğun bir zincire dal. Modüler kural organizasyonu için.
DİKKAT — DROP vs REJECT

DROP ile bağlantı denemeleri timeout'a kadar bekler. REJECT anında hata döner. Güvenli bir sunucuda DROP tercih edilir çünkü port tarayıcısının sonuç almasını yavaşlatır. Embedded geliştirmede REJECT daha pratiktir — hataları hemen görürsün.

02 Kural yazımı — eşleştirme kriterleri

iptables kuralları eşleştirme kriterlerinin kombinasyonundan oluşur. Ne kadar spesifik olursa o kadar güvenli.

bash
# Kaynak IP (-s = source)
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT
sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT ! -s 10.0.0.0/8 -j DROP  # 10.0.0.0/8 dışından gelenler

# Hedef IP (-d = destination)
sudo iptables -A OUTPUT -d 8.8.8.8 -j ACCEPT

# Protokol ve port
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8000:8080 -j ACCEPT  # port aralığı
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT

# Interface (-i = input, -o = output)
sudo iptables -A INPUT -i lo -j ACCEPT     # loopback'e gelen her şey
sudo iptables -A OUTPUT -o eth0 -j ACCEPT

# Connection state ile akıllı kural (-m state)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Bu kural: dışarıdan sen açtığın bağlantılara gelen yanıtları kabul eder
# OUTPUT DROP modunda bile mevcut bağlantıların yanıtları geçer

# Birden fazla port için -m multiport
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

# LOG ile önce kaydet, sonra DROP
sudo iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH_ATTEMPT: "
sudo iptables -A INPUT -p tcp --dport 22 -j DROP

Connection state açıklaması

NEW
Yeni bağlantı başlatma paketi (SYN). İlk kez görülen akış.
ESTABLISHED
Zaten kurulmuş bağlantının devam paketi. Handshake tamamlanmış.
RELATED
Mevcut bağlantıyla ilişkili yeni akış. FTP data kanalı, ICMP hata mesajları gibi.
INVALID
Hiçbir akışa ait olmayan paket. Genellikle DROP edilmeli.

03 NAT — MASQUERADE, SNAT, DNAT

NAT (Network Address Translation), embedded router, IoT gateway ve geliştirme VM'lerinde kaçınılmazdır.

IP forwarding aktif etme

bash
# Anlık olarak aç
echo 1 > /proc/sys/net/ipv4/ip_forward

# sysctl ile
sysctl -w net.ipv4.ip_forward=1

# Kalıcı hale getir
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p

MASQUERADE — dinamik IP ile NAT (ev/embedded router)

bash
# eth1 = WAN (internet bağlantısı), eth0 = LAN (yerel ağ)
# LAN'dan gelen trafiği WAN üzerinden internete çıkar
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

# FORWARD zinciri izin vermeli
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -m state \
             --state ESTABLISHED,RELATED -j ACCEPT

SNAT — statik çıkış IP'si

bash
# WAN IP'si sabit olduğunda MASQUERADE yerine SNAT kullan (daha hızlı)
sudo iptables -t nat -A POSTROUTING -o eth1 \
             -j SNAT --to-source 203.0.113.5

DNAT — port forwarding / yük dağıtma

bash
# WAN'dan gelen port 80 trafiğini iç sunucuya yönlendir
sudo iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
             -j DNAT --to-destination 192.168.1.10:8080

# SSH port değiştir: dışarıdan 2222 → içeride 22
sudo iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 2222 \
             -j DNAT --to-destination 192.168.1.20:22

# DNAT sonrası FORWARD'a da izin ver
sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 8080 -j ACCEPT

04 Kalıcı kurallar — save ve restore

iptables kuralları varsayılan olarak bellekte tutulur ve reboot'ta sıfırlanır. Kalıcılık için birkaç yöntem var.

bash
# Mevcut kuralları dosyaya kaydet
sudo iptables-save > /etc/iptables/rules.v4

# IPv6 kurallarını kaydet
sudo ip6tables-save > /etc/iptables/rules.v6

# Kaydedilen kuralları geri yükle
sudo iptables-restore < /etc/iptables/rules.v4

Debian/Ubuntu — iptables-persistent

bash
apt-get install iptables-persistent
# Kurulum sırasında mevcut kuralları kaydetmek ister
# Sonradan kaydetmek için:
sudo netfilter-persistent save
# Servis reboot'ta otomatik yükler

systemd servisi (minimal embedded için)

/etc/systemd/system/iptables-restore.service
[Unit]
Description=Restore iptables rules
Before=network-pre.target
Wants=network-pre.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
bash
sudo systemctl enable iptables-restore
sudo systemctl start iptables-restore

05 nftables — modern alternatif

nftables, Linux 3.13'ten itibaren kernel'da mevcut. iptables/ip6tables/arptables/ebtables'ı tek bir framework'te birleştirir.

iptables vs nftables farkları

Özellikiptablesnftables
SözdizimiKomut tabanlıKural dili (DSL)
IPv4 + IPv6Ayrı araçlarTek framework
Atomik güncellemeHayırEvet (transaction)
PerformansLineer aramaMaps/sets (hash)
UyumlulukHer distroKernel ≥ 3.13
Araçiptablesnft

nft temel komutlar

bash
# Tüm kuralları listele
sudo nft list ruleset

# Tablo oluştur (ip = IPv4, inet = IPv4+IPv6)
sudo nft add table ip filter
sudo nft add table inet my_fw

# Zincir oluştur (type filter, hook input, öncelik 0)
sudo nft add chain ip filter INPUT \
  '{ type filter hook input priority 0; policy drop; }'

# Kural ekle
sudo nft add rule ip filter INPUT tcp dport 22 accept
sudo nft add rule ip filter INPUT ct state established,related accept
sudo nft add rule ip filter INPUT iif lo accept

# Kural numarasıyla sil
sudo nft list chain ip filter INPUT  # handle numaralarını göster
sudo nft delete rule ip filter INPUT handle 5

# Tüm tabloyu sil
sudo nft delete table ip filter

nftables sets — performanslı IP listesi

bash
# Whitelist set oluştur
sudo nft add set ip filter allowed_ips '{ type ipv4_addr; }'
sudo nft add element ip filter allowed_ips '{ 192.168.1.10, 192.168.1.20 }'

# Set üyeliğini kural içinde kullan
sudo nft add rule ip filter INPUT ip saddr @allowed_ips accept

06 nftables tam ruleset örneği

Minimalist ama production-ready bir nftables güvenlik duvarı. Dosyaya yaz, nft -f ile yükle.

/etc/nftables.conf
#!/usr/sbin/nft -f

# Mevcut tüm kuralları temizle
flush ruleset

table inet firewall {

  # Engellenen IP'ler için set
  set blocklist {
    type ipv4_addr
    flags dynamic, timeout
    timeout 1h
  }

  chain inbound {
    type filter hook input priority 0; policy drop;

    # Loopback her zaman kabul
    iif lo accept

    # Geçersiz paketleri düşür
    ct state invalid drop

    # Kurulu bağlantılar — yanıt trafiği
    ct state { established, related } accept

    # ICMP (ping, traceroute)
    ip protocol icmp accept
    ip6 nexthdr icmpv6 accept

    # SSH — sadece yerel ağdan
    tcp dport 22 ip saddr 192.168.0.0/16 accept

    # HTTP ve HTTPS
    tcp dport { 80, 443 } accept

    # Engelli IP'leri düşür
    ip saddr @blocklist drop

    # Kalan her şeyi logla ve düşür
    limit rate 5/minute log prefix "nft_drop: " level info
    drop
  }

  chain outbound {
    type filter hook output priority 0; policy accept;
    # Output açık — tüm giden trafiğe izin ver
  }

  chain forward {
    type filter hook forward priority 0; policy drop;
    # Router değilsek forward'a izin verme
  }
}
bash
# Ruleset'i yükle
sudo nft -f /etc/nftables.conf

# Sözdizimi kontrolü (uygulamadan)
sudo nft -c -f /etc/nftables.conf

# systemd servisi
sudo systemctl enable nftables
sudo systemctl start nftables

07 Embedded güvenlik duvarı

Embedded router veya IoT gateway'de minimal ama etkili bir güvenlik duvarı kurmak için strateji.

Embedded sistemde güvenlik duvarının amacı: sadece gerekli servislere erişim izni ver, geri kalanı düşür. Saldırı yüzeyini minimize et.

bash — embedded router firewall script
#!/bin/sh
# /etc/firewall.sh — embedded router için minimal firewall

# Tüm mevcut kuralları temizle
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# Varsayılan politikalar
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopback
iptables -A INPUT -i lo -j ACCEPT

# Kurulu bağlantılar
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Yönetim arayüzü: sadece LAN'dan SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

# ICMP — ping ve traceroute çalışsın
iptables -A INPUT -p icmp -j ACCEPT

# DNS (dnsmasq cihazda çalışıyorsa)
iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT

# NAT — LAN'ı WAN'a çıkar (eth0=LAN, eth1=WAN)
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state \
         --state ESTABLISHED,RELATED -j ACCEPT
BUSYBOX IPTABLES

Busybox iptables modüler değildir — bazı match modülleri (-m state, -m multiport) desteklenmeyebilir. Hangi modüllerin mevcut olduğunu iptables -m state --state NEW -j ACCEPT deneyerek kontrol et. Desteklenmiyorsa basit port/protocol kurallarıyla yetinmek zorunda kalırsın.

08 ebtables — Ethernet bridge filtreleme

ebtables, Layer 2 (Ethernet) seviyesinde çalışır. Embedded switch veya Linux bridge kullanan sistemlerde iptables'ın yetersiz kaldığı durumlar için tasarlanmıştır.

Linux bridge (br0) oluşturulduğunda paketler IP seviyesine çıkmadan bridge üzerinden geçer. iptables bu trafiği göremez — ebtables görür.

bash
# ebtables kurulumu
apt-get install ebtables

# Bridge oluştur (eth0 ve eth1 köprüle)
ip link add name br0 type bridge
ip link set eth0 master br0
ip link set eth1 master br0
ip link set br0 up

# ebtables kuralları listele
sudo ebtables -L

# Belirli MAC adresinden gelen trafiği düşür
sudo ebtables -A FORWARD -s aa:bb:cc:dd:ee:ff -j DROP

# ARP paketleri filtrele (ARP spoofing önleme)
sudo ebtables -A FORWARD -p ARP --arp-ip-src ! 192.168.1.0/24 -j DROP

# Broadcast sınırlama — ARP storm önleme
sudo ebtables -A FORWARD -d Broadcast --limit 100/second -j ACCEPT
sudo ebtables -A FORWARD -d Broadcast -j DROP

# Sadece belirli protocol'lere izin ver (IPv4, ARP dışında engelle)
sudo ebtables -A FORWARD -p IPv4 -j ACCEPT
sudo ebtables -A FORWARD -p ARP -j ACCEPT
sudo ebtables -P FORWARD DROP
BROUTE TABLE

ebtables'ın broute tablosu, bridge'den geçen belirli paketleri Layer 3'e (routable) yönlendirmeye yarar. Hibrit bridge+router senaryolarında kullanılır — örneğin bridge'deki VLAN trafiğini seçici olarak route et.