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
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
01 iptables temel komutlar
iptables'ın CRUD operasyonlarını öğren — kural ekle, listele, sil, zincir politikasını ayarla.
# 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)
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.
# 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ı
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
# 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)
# 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
# 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
# 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.
# 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
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)
[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
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ı
nft temel komutlar
# 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
# 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.
#!/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
}
}
# 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.
#!/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 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.
# 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
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.