Yıllarca iptables ile çalışmış biri olarak şunu söyleyeyim: ilk kez bir nftables kural dosyasına baktığımda “bu ne biçim sözdizimi?” diye düşünmüştüm. Ama birkaç hafta içinde geri dönmek istemediğimi fark ettim. Eğer siz de hâlâ iptables ile uğraşıyorsanız, bu yazı tam size göre. Hem aralarındaki temel farkları hem de geçişi nasıl sorunsuz yapacağınızı ele alacağız.
iptables ve nftables: Temelden Bir Bakış
iptables, 1998 yılından bu yana Linux güvenlik duvarlarının omurgasını oluşturdu. Kernel’deki netfilter çerçevesiyle çalışır ve onlarca yıldır sistem yöneticilerinin güvendiği, belki de sevmediği ama güvendiği bir araçtır. Neden sevmediğimizden başlayalım.
iptables’ın en büyük sorunu, aynı işin birden fazla araçla yapılma zorunluluğu. IPv4 için iptables, IPv6 için ip6tables, köprü kuralları için ebtables, ARP filtreleme için arptables kullanmak zorundaydınız. Bunların hepsini ayrı ayrı yönetmek hem yorucu hem de hata yaratmaya açık bir süreçti.
nftables ise 2014’te kernel 3.13 ile hayatımıza girdi ve tüm bu araçları tek çatı altında topladı. Bugün Debian 10+, Ubuntu 20.04+, RHEL 8+, Fedora 18+ gibi modern dağıtımlarda varsayılan güvenlik duvarı çözümü nftables’tır.
Temel Farklar
Araç Birliği
iptables dünyasında şöyle bir tablo vardı kafanızda:
- iptables: IPv4 paket filtreleme
- ip6tables: IPv6 paket filtreleme
- ebtables: Ethernet bridge filtreleme
- arptables: ARP protokol filtreleme
nftables’da bunların hepsini tek araçla, tek kural tabanında yönetiyorsunuz. nft komutu her şeyi hallediyor.
Sözdizimi Farkı
iptables kuralları lineer ve bazen okunması güçtü:
# iptables ile SSH'a izin verme
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# IPv6 için aynısını tekrar yazmak gerekirdi
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
ip6tables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
nftables’da aynı işlemi çok daha temiz yapabilirsiniz:
# nft ile SSH'a izin verme - hem IPv4 hem IPv6
nft add rule inet filter input tcp dport 22 ct state new,established accept
nft add rule inet filter output tcp sport 22 ct state established accept
inet ailesi kullandığınızda tek satır hem IPv4 hem IPv6’yı kapsıyor. Bu fark, büyük kural setlerinde ciddi zaman kazandırıyor.
Set ve Map Yapıları
Bu, nftables’ın en güçlü özelliklerinden biri. iptables’ta aynı porta veya IP’ye birden fazla kural yazmak zorundaydınız. nftables’ta set tanımlayıp tek satırda hallediyorsunuz.
# nft ile birden fazla porta izin verme - set kullanımı
nft add rule inet filter input tcp dport { 22, 80, 443, 8080 } accept
# Dinamik set tanımlama - bu set runtime'da değiştirilebilir
nft add set inet filter blocked_ips { type ipv4_addr; flags dynamic, timeout; timeout 1h; }
nft add rule inet filter input ip saddr @blocked_ips drop
iptables’ta bu kadar esnek bir yapı kurmak için ya multiport modülünü kullanmak ya da ipset gibi ek araçlara başvurmak gerekiyordu.
Performans
nftables’ın kernel içindeki sanal makine (VM) mimarisi, karmaşık kural setlerinde iptables’a göre belirgin şekilde daha iyi performans sergiler. iptables her paketi sırayla tüm kurallardan geçirirken, nftables’ın set tabanlı eşleştirmesi O(1) karmaşıklıkla çalışabilir. 1000+ kural içeren ortamlarda bu fark gerçekten hissedilir.
Kural Kaydetme ve Yükleme
iptables’ta kuralları kaydetmek için ayrı araçlar gerekiyordu:
# iptables - kuralları kaydetme
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
# Yükleme
iptables-restore < /etc/iptables/rules.v4
ip6tables-restore < /etc/iptables/rules.v6
nftables’ta her şey tek dosyada:
# nftables kurallarını kaydetme
nft list ruleset > /etc/nftables.conf
# Yükleme
nft -f /etc/nftables.conf
Geçiş Rehberi: Adım Adım
1. Mevcut iptables Kurallarını Kaydedin
Geçişe başlamadan önce mevcut kural setinizi mutlaka yedekleyin. Üretim ortamında bu adımı atlamak felakete davet çıkarmaktır.
# Mevcut kuralları belgele
iptables-save > /root/iptables_backup_$(date +%Y%m%d).rules
ip6tables-save > /root/ip6tables_backup_$(date +%Y%m%d).rules
# Kuralları gözden geçir
iptables -L -n -v
ip6tables -L -n -v
2. Otomatik Dönüştürme Araçlarını Kullanın
iptables-translate ve ip6tables-translate araçları iptables kurallarını nftables sözdizimine çeviriyor. Tek satır çeviri için idealdir:
# Tek kural çevirisi
iptables-translate -A INPUT -p tcp --dport 80 -j ACCEPT
# Çıktı: nft add rule ip filter INPUT tcp dport 80 counter accept
# Tüm kural setini çevir
iptables-restore-translate -f /root/iptables_backup.rules > /etc/nftables_converted.conf
ip6tables-restore-translate -f /root/ip6tables_backup.rules >> /etc/nftables_converted.conf
Önemli uyarı: Bu araçların ürettiği kural seti her zaman mükemmel değildir. Özellikle karmaşık modül kullanımlarında manuel düzenleme gerekebilir. Çıktıyı mutlaka gözden geçirin.
3. Temel nftables Yapısını Anlayın
nftables’ta hiyerarşi şu şekildedir: tablo > zincir > kural
# Yeni bir tablo oluşturma
nft add table inet my_firewall
# Tabloya zincir ekleme
nft add chain inet my_firewall input { type filter hook input priority 0 ; policy drop ; }
nft add chain inet my_firewall forward { type filter hook forward priority 0 ; policy drop ; }
nft add chain inet my_firewall output { type filter hook output priority 0 ; policy accept ; }
# Temel kuralleri ekleme
nft add rule inet my_firewall input ct state established,related accept
nft add rule inet my_firewall input iif lo accept
nft add rule inet my_firewall input tcp dport 22 accept
4. Tam Bir nftables Konfigürasyon Dosyası
Gerçek bir sunucu için kullanabileceğiniz, production’a hazır bir nftables.conf örneği:
#!/usr/sbin/nft -f
# Mevcut kuralları temizle
flush ruleset
# Ana filtre tablosu - inet hem IPv4 hem IPv6 kapsar
table inet filter {
# Engellenen IP'ler için set
set blacklist_v4 {
type ipv4_addr
flags interval
elements = { 192.168.100.0/24, 10.0.0.0/8 }
}
# İzin verilen yönetim IP'leri
set admin_ips {
type ipv4_addr
elements = { 192.168.1.10, 192.168.1.11, 203.0.113.5 }
}
chain input {
type filter hook input priority 0; policy drop;
# Loopback her zaman açık
iif "lo" accept
# Kurulu bağlantılar ve ilişkili paketler
ct state established,related accept
# Geçersiz paketleri düşür
ct state invalid drop
# ICMP - ping'e izin ver ama flood'u engelle
ip protocol icmp icmp type { echo-request } limit rate 10/second accept
ip6 nexthdr icmpv6 icmpv6 type { echo-request } limit rate 10/second accept
# Blacklist'teki IP'leri engelle
ip saddr @blacklist_v4 drop
# SSH - sadece yönetim IP'lerinden
tcp dport 22 ip saddr @admin_ips accept
# Web sunucu portları
tcp dport { 80, 443 } accept
# Log ve düşür
log prefix "nft-dropped: " flags all
drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
# NAT tablosu
table inet nat {
chain prerouting {
type nat hook prerouting priority -100;
}
chain postrouting {
type nat hook postrouting priority 100;
# İnternet çıkışı için masquerade
oif "eth0" masquerade
}
}
Bu dosyayı /etc/nftables.conf olarak kaydedin.
5. Konfigürasyonu Test Edin ve Uygulayın
# Sözdizimi kontrolü - gerçekten uygulamadan önce
nft -c -f /etc/nftables.conf
# Kural setini uygula
nft -f /etc/nftables.conf
# Mevcut kuralları görüntüle
nft list ruleset
# Belirli bir tabloyu görüntüle
nft list table inet filter
# Belirli bir zinciri görüntüle
nft list chain inet filter input
6. Servisi Etkinleştirin
# nftables servisini başlat
systemctl start nftables
systemctl enable nftables
# Durum kontrolü
systemctl status nftables
# iptables servisini devre dışı bırak (varsa)
systemctl stop iptables
systemctl disable iptables
systemctl stop ip6tables
systemctl disable ip6tables
Gerçek Dünya Senaryoları
Senaryo 1: Web Sunucusu Rate Limiting
DDoS ve brute force saldırılarına karşı hız sınırlama, nftables ile çok daha zarif bir şekilde yapılabiliyor:
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# HTTP/HTTPS rate limiting - kaynak IP başına
tcp dport { 80, 443 } ct state new
limit rate over 100/minute
log prefix "rate-limit: " drop
# SSH brute force koruması
tcp dport 22 ct state new
limit rate 5/minute
log prefix "ssh-limit: " drop
tcp dport 22 ct state new accept
tcp dport { 80, 443 } ct state new accept
ct state established,related accept
iif lo accept
}
}
Senaryo 2: Port Yönlendirme
Klasik bir NAT senaryosu, örneğin dışarıdan gelen 8080 trafiğini iç sunucuya yönlendirme:
table inet nat {
chain prerouting {
type nat hook prerouting priority -100;
# Dışarıdan gelen 8080'i iç web sunucusuna yönlendir
iif "eth0" tcp dport 8080
dnat ip to 192.168.1.100:80
# RDP yönlendirmesi
iif "eth0" tcp dport 3389
dnat ip to 192.168.1.50:3389
}
chain postrouting {
type nat hook postrouting priority 100;
ip saddr 192.168.0.0/16 oif "eth0" masquerade
}
}
Senaryo 3: Dinamik Blocklist Yönetimi
Fail2ban benzeri bir mantıkla, çalışma zamanında IP ekleme ve çıkarma:
# Set'i dinamik ve timeout'lu tanımla
nft add set inet filter bruteforce { type ipv4_addr; flags dynamic,timeout; timeout 24h; }
# Kuralı ekle
nft add rule inet filter input ip saddr @bruteforce drop
# Saldırılan IP'yi manuel engelle
nft add element inet filter bruteforce { 1.2.3.4 }
# Belirli bir süre sonra otomatik kalkar, ama erken kaldırmak isterseniz
nft delete element inet filter bruteforce { 1.2.3.4 }
# Set içeriğini görüntüle
nft list set inet filter bruteforce
Bu yapıyı bir log parser scriptiyle birleştirip otomatik bir engelleme sistemi kurabilirsiniz. Fail2ban’ın nftables backend desteği de zaten bunu yapıyor.
iptables Uyumluluk Katmanı
Bazı eski sistemlerde veya iptables kullanan uygulamalar (Docker eski versiyonları gibi) için geçici bir köprü gerekebilir. iptables-nft paketi tam da bu iş için var:
# Debian/Ubuntu'da kurulum
apt install iptables-nft
# Alternatif iptables backend olarak nft'yi seç
update-alternatives --set iptables /usr/sbin/iptables-nft
update-alternatives --set ip6tables /usr/sbin/ip6tables-nft
# Artık iptables komutları nftables üzerinde çalışır
iptables -L # Aslında nft kurallarını gösterir
Dikkat: Bu katman, eski uygulamaların çalışmasını sağlar ama karışık kural setleri yaratabilir. Geçici bir çözüm olarak kullanın, uzun vadede uygulamaları native nftables’a geçirin.
Sorun Giderme İpuçları
# Paket sayaçlarını izle - hangi kural ne kadar trafik görüyor
nft list ruleset | grep -E "packets|bytes"
# Kuralları handle numaralarıyla listele (silmek için gerekli)
nft list chain inet filter input -a
# Belirli bir kuralı handle numarasıyla sil
nft delete rule inet filter input handle 5
# Tüm sayaçları sıfırla
nft reset counters table inet filter
# Log'ları izle
journalctl -f | grep "nft-dropped"
# veya
tail -f /var/log/kern.log | grep nft
Geçiş Yaparken Dikkat Edilecekler
- Docker ve Kubernetes: Eski Docker versiyonları iptables kullanır. Docker 20.10+ nftables uyumlu iptables backend’ini destekler. Geçiş sırasında container network’lerin etkilenmediğini kontrol edin.
- UFW: Ubuntu’da UFW hâlâ arka planda iptables kullanıyor. UFW’yi nftables’a taşımak için
ufw-nftablespaketi veya UFW’yi tamamen kaldırıp native nftables kullanmak seçenekleriniz arasında.
- firewalld: RHEL/CentOS ekosisteminde firewalld, nftables’ı backend olarak kullanabiliyor.
firewall-backend=nftablesayarıyla bu geçişi yapabilirsiniz.
- Kural sırası: nftables’ta priority değerleri önemli. Aynı hook’a bağlı birden fazla zincir varsa priority değeri düşük olan önce çalışır.
- Kernel versiyonu: nftables’ın tüm özelliklerinden yararlanmak için kernel 4.1+ önerilir. Bazı gelişmiş özellikler (flowtable, vmap gibi) daha yeni kernel’ler gerektirir.
Sonuç
nftables’a geçiş, başlangıçta göz korkutucu görünebilir ama bir kez adapte olduğunuzda geri dönmek istemiyorsunuz. Tek araç, daha temiz sözdizimi, set/map yapılarıyla güçlü kural yönetimi ve daha iyi performans, bu geçişi zamanınıza değer kılıyor.
Geçiş için önerim: önce bir test ortamında mevcut kural setinizi iptables-restore-translate ile dönüştürün, çıktıyı inceleyin ve optimize edin, sonra production’a aşamalı olarak geçin. Kesinlikle aceleden kaçının, özellikle remote erişimle yönettiğiniz sunucularda kendi kendinizi kilitleyebilirsiniz. Her zaman bir konsol erişiminiz veya en kötü ihtimalle 5 dakika sonra kuralları sıfırlayacak bir cron job’ınız olsun geçiş sırasında.
iptables 25 yılı aşkın süredir işimize yaradı, ama nftables onun yerini almak için tasarlandı ve gerçekten daha iyi bir iş çıkarıyor. Geçişi ne kadar erken yaparsanız, o kadar az teknik borç biriktirirsiniz.