nftables ile Linux Güvenlik Duvarı Kurulumu: iptables'ten Geçiş ve İleri Düzey Yapılandırma

nftables kurulumu, iptables'tan geçiş, hız sınırlama, coğrafi engelleme ve Fail2ban entegrasyonu dahil üretime hazır güvenlik duvarı yapılandırmalarını adım adım öğrenin.

Giriş: iptables Dönemi Kapanıyor, nftables Çağı Başlıyor

Yıllarca Linux güvenlik duvarı denilince akla iptables geldi. Kurallarını ezbere bilen sistem yöneticileri bile var — ben de o dönemden geçtim. Ama gerçek şu ki iptables artık bakım modunda; yeni özellik eklenmeyecek, yalnızca kritik yamalar gelecek. Debian 10, Ubuntu 20.04, RHEL 8, Fedora 18 ve sonraki tüm büyük dağıtımlar varsayılan güvenlik duvarı arka ucu olarak nftables'a geçti. Kubernetes bile v1.35 itibarıyla kube-proxy'de IPVS yerine nftables'ı benimsemeye başladı.

Peki neden bu geçiş? Çünkü iptables'ın mimarisi 2000'li yılların başından kalma. Her paket tüm kuralları sırayla (O(n)) geziyor, IPv4 ve IPv6 için ayrı araçlar gerekiyor, atomik kural güncellemesi yok ve büyük kural setlerinde performans ciddi şekilde düşüyor. nftables ise hash tabanlı set aramaları (O(1)), tek bir nft komutuyla tüm protokol aileleri yönetimi, atomik kural değişiklikleri ve çekirdek içi sanal makine mimarisiyle bu sorunların hepsini çözüyor. Açıkçası, farkı ilk kez büyük bir kural seti üzerinde test ettiğimde etkilendiğimi itiraf etmeliyim.

Bu rehberde nftables'ı sıfırdan kuracak, üretim ortamı için güvenli yapılandıracak, iptables kurallarınızı taşıyacak ve hız sınırlama, coğrafi engelleme, dinamik setler gibi ileri düzey özellikleri uygulayacaksınız. Çekirdek sıkılaştırma rehberimizi okuduysanız, bu makale o temelin üzerine güvenlik duvarı katmanını ekliyor.

1. nftables Nedir ve Neden Geçiş Yapmalısınız?

1.1 nftables ve iptables Karşılaştırması

Karar vermeden önce somut farkları görmek önemli. Dürüst olmak gerekirse, ilk bakışta bu iki araç arasındaki fark göz korkutucu gelebilir — ama aşağıdaki tabloya bir göz atın:

Özellikiptablesnftables
Araç sayısı4 ayrı araç (iptables, ip6tables, arptables, ebtables)Tek araç: nft
IPv4/IPv6 yönetimiAyrı kurallar, ayrı araçlarBirleşik inet ailesi
Performans (kural eşleştirme)O(n) — doğrusal aramaO(1) — hash tabanlı set araması
Atomik güncellemeYok (kural ekleme/silme arası yarış durumu)Var — tek Netlink işlemiyle
Varsayılan tablolar/zincirlerEvet (filter, nat, mangle, raw)Hayır — tamamen özelleştirilebilir
Set/Map desteğiHarici ipset gerekliYerleşik (anonim ve isimli setler)
Tek kuralda çoklu eylemHayırEvet
Hata raporlamaBelirsiz hata mesajlarıSatır ve konum belirten detaylı hatalar

1.2 Çekirdek Mimarisi

nftables'ın performans avantajı, çekirdek içinde çalışan basit bir sanal makineden (VM) gelir. Kullanıcı alanında yazılan kurallar bytecode'a derlenir ve bu VM tarafından yürütülür. Bu mimari; paket verisi okuma, bağlantı izleme (conntrack) verileri denetleme, aritmetik ve bitwise işlemler ve en önemlisi set aramaları yapabilir. Sonuç olarak 200 IP adresini engellemek için 200 kural yazmak yerine tek bir set tanımlayıp O(1) aramayla aynı işi yapabilirsiniz.

Bunu ilk kavradığımda iptables'a olan sabrımın neden bu kadar çabuk tükendiğini de anladım.

2. Kurulum ve Temel Yapılandırma

2.1 Dağıtıma Göre Kurulum

nftables çoğu modern dağıtımda varsayılan olarak gelir. Eksikse kurulum oldukça basit — dağıtımınıza göre aşağıdan ilgili komutu seçin:

# Debian / Ubuntu
sudo apt update && sudo apt install nftables

# RHEL / CentOS / AlmaLinux / Rocky Linux
sudo dnf install nftables

# Arch Linux
sudo pacman -S nftables

# openSUSE
sudo zypper install nftables

# Servisi etkinleştirme ve başlatma
sudo systemctl enable nftables
sudo systemctl start nftables

# Mevcut kuralları kontrol etme
sudo nft list ruleset

2.2 Temel Kavramlar: Tablolar, Zincirler ve Kurallar

iptables'tan farklı olarak nftables'ta önceden tanımlı tablo veya zincir yoktur. Her şeyi siz oluşturursunuz. Bu tam kontrol sağlar — ama aynı zamanda yapınızı baştan kafanızda oturtmanız gerektiği anlamına gelir. Gelin temel kavramlara hızlıca bakalım:

  • Tablo (Table): Zincirleri, kuralları ve setleri barındıran ad alanı. Her tablonun bir adres ailesi vardır: ip (yalnızca IPv4), ip6 (yalnızca IPv6), inet (IPv4 + IPv6), arp, bridge veya netdev.
  • Zincir (Chain): Kuralları gruplandıran yapı. İki türü var: temel zincirler (ağ yığınından gelen paketler için giriş noktası, hook ile bağlanır) ve düzenli zincirler (jump hedefi olarak kullanılır, kuralları düzenlemek için).
  • Kural (Rule): Paketleri eşleştiren ve eylem belirleyen ifadeler. Tek bir kuralda birden fazla eylem tanımlanabilir — iptables'ta bu mümkün değildi.
  • Set / Map: IP adresleri, port numaraları gibi değerleri tutan veri yapıları. Doğrudan kurallar içinde veya isimli olarak tanımlanabilir.

2.3 İlk Güvenlik Duvarı Yapılandırması

Şimdi işler ilginçleşiyor. Aşağıdaki yapılandırma, bir üretim sunucusu için temel güvenlik duvarı iskeletini oluşturur. "Varsayılan olarak reddet" (deny-by-default) politikasını uygular — yalnızca açıkça izin verilen trafik geçer. Bu yaklaşım biraz katı gelecek ama üretimde başka türlü olmaz:

#!/usr/sbin/nft -f
# /etc/nftables.conf — Üretim Sunucusu Temel Yapılandırması

flush ruleset

table inet filter {

    # İzin verilen TCP portları seti
    set allowed_tcp_ports {
        type inet_service
        elements = { 22, 80, 443 }
    }

    # Giriş zinciri — varsayılan politika: drop
    chain input {
        type filter hook input priority 0; policy drop;

        # Loopback arayüzüne izin ver
        iif lo accept

        # Kurulu ve ilişkili bağlantılara izin ver
        ct state established,related accept

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

        # ICMP — ping için hız sınırlı izin
        ip protocol icmp icmp type echo-request limit rate 5/second accept
        ip6 nexthdr icmpv6 icmpv6 type { echo-request, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept

        # İzin verilen portlara erişim
        tcp dport @allowed_tcp_ports accept

        # Diğer her şeyi günlüğe kaydet ve düşür
        log prefix "[nftables-drop] " counter drop
    }

    # Yönlendirme zinciri — sunucu router değilse kapat
    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    # Çıkış zinciri — sunucunun dışarı çıkmasına izin ver
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Bu yapılandırmayı uygulamak ve doğrulamak için aşağıdaki adımları izleyin. Özellikle kuru çalıştırmayı atlamayın — ne kadar tecrübeli olursanız olun bu adım hayat kurtarır:

# Önce doğrulama (kuru çalıştırma)
sudo nft -c -f /etc/nftables.conf

# Uygulama
sudo nft -f /etc/nftables.conf

# Kuralları listeleme
sudo nft list ruleset

# Belirli bir tabloyu görüntüleme
sudo nft list table inet filter

3. iptables'tan nftables'a Geçiş

3.1 Mevcut Kuralları Yedekleme

Geçiş yapmadan önce mevcut kurallarınızı mutlaka yedekleyin. Bir şeyler ters giderse geri dönüş noktanız olsun — bu adımı atlayan sistem yöneticilerinden ibret alın:

# iptables kurallarını yedekleme
sudo iptables-save > ~/iptables-backup-$(date +%Y%m%d).rules
sudo ip6tables-save > ~/ip6tables-backup-$(date +%Y%m%d).rules

# Yedeklerin oluştuğunu doğrulama
ls -la ~/iptables-backup-*.rules

3.2 Otomatik Kural Çevirisi

Netfilter ekibi, geçişi kolaylaştırmak için çeviri araçları sağlıyor. Bu araçlarla mevcut iptables kurallarınızı nftables söz dizimine dönüştürebilirsiniz. Çıktıyı körü körüne kullanmak yerine gözden geçirmenizi öneririm — otomatik çeviri her zaman mükemmel sonuç vermeyebilir:

# Tek bir kuralı çevirme
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Çıktı: nft add rule ip filter INPUT tcp dport 22 counter accept

iptables-translate -A INPUT -s 192.168.1.100 -j DROP
# Çıktı: nft add rule ip filter INPUT ip saddr 192.168.1.100 counter drop

# Tüm kural setini toplu çevirme
iptables-restore-translate -f ~/iptables-backup-$(date +%Y%m%d).rules > ~/nftables-migrated.nft

# IPv6 kurallarını da çevirme
ip6tables-restore-translate -f ~/ip6tables-backup-$(date +%Y%m%d).rules >> ~/nftables-migrated.nft

# Çevrilen kuralları inceleme
cat ~/nftables-migrated.nft

3.3 Arka Ucu Değiştirme

Bazı dağıtımlarda iptables komutu aslında nftables arka ucunu kullanır (iptables-nft katmanı). Bunu fark etmeden iki ayrı sistemi yönettiğinizi sanabilirsiniz — öyle olmadığını doğrulamak için:

# Mevcut iptables arka ucunu kontrol etme
sudo iptables -V
# "nf_tables" içeriyorsa zaten nftables arka ucunu kullanıyorsunuz

# Debian/Ubuntu'da arka ucu değiştirme
sudo update-alternatives --set iptables /usr/sbin/iptables-nft
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-nft

# Eski iptables servisini devre dışı bırakma
sudo systemctl disable --now iptables
sudo systemctl enable --now nftables

Uyarı: iptables-legacy ve nftables'ı aynı anda kullanmayın. İki farklı güvenlik duvarı arka ucu beklenmedik kural çakışmalarına ve güvenlik açıklarına yol açabilir. Docker veya Kubernetes gibi konteyner araçları kullanıyorsanız, geçiş sonrası ağ bağlantılarını test etmeyi kesinlikle unutmayın.

4. Üretim Ortamı İçin İleri Düzey Yapılandırmalar

4.1 İsimli Setler ile IP Yönetimi

nftables'ın en güçlü özelliklerinden biri yerleşik set desteğidir. IP adresleri, port numaraları veya alt ağları bir sete ekleyip kurallardan referans verebilirsiniz. iptables'ta bunun için harici ipset aracı gerekiyordu — bu fark günlük operasyonlarda gerçekten hissedilir:

# Güvenilir IP adresleri seti
table inet filter {
    set trusted_ips {
        type ipv4_addr
        flags interval
        elements = {
            10.0.0.0/8,
            172.16.0.0/12,
            192.168.1.0/24
        }
    }

    set blocked_ips {
        type ipv4_addr
        flags timeout
        timeout 24h
    }

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

        # Güvenilir IP'lerden gelen trafiğe izin ver
        ip saddr @trusted_ips accept

        # Engelli IP'lerden gelen trafiği düşür
        ip saddr @blocked_ips drop

        # ... diğer kurallar
    }
}

# Dinamik olarak IP ekleme/çıkarma
sudo nft add element inet filter blocked_ips { 203.0.113.50 timeout 1h }
sudo nft add element inet filter blocked_ips { 198.51.100.0/24 timeout 6h }
sudo nft delete element inet filter blocked_ips { 203.0.113.50 }

# Set içeriğini görüntüleme
sudo nft list set inet filter blocked_ips

4.2 Hız Sınırlama (Rate Limiting)

Brute-force ve DDoS saldırılarına karşı hız sınırlama kritik bir savunma katmanıdır. nftables, token bucket filtresi ile hem paket hem de byte bazında sınırlama yapabilir. Ayrıca meter mekanizmasıyla kaynak IP başına dinamik sınırlama mümkündür — bu özelliği ilk kullandığımda neden yıllarca ipset ile uğraştığımı sorguladım açıkçası:

table inet filter {

    # Kaba kuvvet saldırısı tespit seti
    set ssh_bruteforce {
        type ipv4_addr
        flags dynamic, timeout
        timeout 5m
    }

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

        iif lo accept
        ct state established,related accept
        ct state invalid drop

        # SSH — dakikada 5 yeni bağlantıyla sınırla
        tcp dport 22 ct state new limit rate 5/minute accept

        # SSH kaba kuvvet koruması — 1 dakikada 10'dan fazla
        # bağlantı kurmaya çalışan IP'leri otomatik engelle
        tcp dport 22 ct state new add @ssh_bruteforce { ip saddr limit rate over 10/minute } drop

        # HTTP/HTTPS — saniyede 50 istek sınırı (per-IP)
        tcp dport { 80, 443 } ct state new meter http_limit { ip saddr limit rate 50/second burst 100 packets } accept
        tcp dport { 80, 443 } ct state new drop

        # ICMP flood koruması
        ip protocol icmp limit rate 10/second burst 20 packets accept

        log prefix "[nftables-drop] " counter drop
    }
}

4.3 Coğrafi Engelleme (Geo-Blocking)

Sunucunuzun yalnızca belirli ülkelerden erişilebilir olması gerekiyorsa veya belirli bölgeleri engellemek istiyorsanız, nftables setleriyle coğrafi engelleme uygulayabilirsiniz. Bunun için IP bloklarını coğrafi veritabanlarından indiren araçlar kullanılır. Kurulumu biraz zahmetli ama bir kez otomasyona bağladınız mı çok temiz çalışıyor:

# nft-geo-filter aracını kurma (GitHub üzerinden)
git clone https://github.com/rpthms/nft-geo-filter.git
cd nft-geo-filter

# Belirli ülkelerin IP bloklarını nftables setine ekleme
# Örnek: Yalnızca Türkiye (TR) ve Almanya (DE) IP'lerine izin verme
sudo python3 nft-geo-filter.py -t inet -T geo_filter \
    --allow TR DE \
    -4

# Oluşturulan coğrafi seti kurallarla entegre etme
# /etc/nftables.conf dosyanıza ekleyin:
table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

        iif lo accept
        ct state established,related accept

        # Coğrafi filtre tablosundaki setlerden geçen
        # trafiğe izin ver (geo_filter tablosu ayrı çalışır)

        # SSH erişimini yalnızca belirli ülkelerle sınırla
        tcp dport 22 ip saddr @geo_allowed_v4 accept

        tcp dport { 80, 443 } accept
    }
}

# Coğrafi IP listelerini güncel tutmak için cron görevi
# Her hafta Pazar günü saat 03:00'te güncelle
echo "0 3 * * 0 root /opt/nft-geo-filter/update-geo.sh" | \
    sudo tee /etc/cron.d/nft-geo-update

Not: Coğrafi engelleme tek başına yeterli bir güvenlik çözümü değildir. VPN ve proxy kullanan saldırganlar bu kısıtlamayı aşabilir. Coğrafi engellemeyi, derinlemesine savunma stratejisinin bir parçası olarak diğer güvenlik katmanlarıyla birlikte kullanın.

4.4 Verdict Map ile Akıllı Yönlendirme

Verdict map'ler, farklı port veya protokollere göre farklı zincir ya da eylemlere yönlendirme yapmanızı sağlar. Bu sayede kurallarınızı modüler ve okunabilir tutabilirsiniz. Gelin şimdi bunu pratikte nasıl kullandığımıza bakalım:

table inet filter {

    # Port bazlı verdict map
    map port_policy {
        type inet_service : verdict
        elements = {
            22 : jump ssh_rules,
            80 : jump http_rules,
            443 : jump http_rules,
            25 : drop,
            587 : jump smtp_rules
        }
    }

    chain input {
        type filter hook input priority 0; policy drop;
        iif lo accept
        ct state established,related accept
        ct state invalid drop

        # Tek bir kuralla tüm port yönlendirmesini yap
        tcp dport vmap @port_policy

        log prefix "[nftables-drop] " counter drop
    }

    chain ssh_rules {
        # SSH için özel kurallar
        ip saddr 10.0.0.0/8 accept
        limit rate 3/minute accept
    }

    chain http_rules {
        # HTTP/HTTPS için özel kurallar
        accept
    }

    chain smtp_rules {
        # SMTP için özel kurallar
        ip saddr @trusted_ips accept
    }
}

5. Fail2ban ile nftables Entegrasyonu

Fail2ban, log dosyalarını izleyerek kaba kuvvet saldırılarını tespit eden ve saldırgan IP'leri otomatik engelleyen bir araçtır. nftables ile entegrasyonu oldukça kolaydır ve nftables'ın set yapısı sayesinde performans açısından iptables entegrasyonundan çok daha verimlidir. Bunu bir kez kurup çalıştırdıktan sonra log'lara bakıp kaç IP'nin otomatik engellendiğini görmek garip bir tatmin duygusu veriyor:

# Fail2ban kurulumu
sudo apt install fail2ban   # Debian/Ubuntu
sudo dnf install fail2ban   # RHEL/CentOS

# nftables arka ucunu yapılandırma
# /etc/fail2ban/jail.local dosyası oluşturun:
sudo tee /etc/fail2ban/jail.local << 'JAILEOF'
[DEFAULT]
# nftables arka ucunu kullan
banaction = nftables-multiport
banaction_allports = nftables-allports

# Temel ayarlar
bantime = 30m
findtime = 15m
maxretry = 5

# Tekrarlayan ihlaller için artan süre
bantime.increment = true
bantime.factor = 4
bantime.maxtime = 1w

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
JAILEOF

# Fail2ban servisini yeniden başlatma
sudo systemctl restart fail2ban

# Durum kontrolü
sudo fail2ban-client status sshd

# nftables'taki Fail2ban setlerini görüntüleme
sudo nft list ruleset | grep -A 5 f2b

6. Yapılandırma Yönetimi ve En İyi Uygulamalar

6.1 Modüler Yapılandırma

Büyük kural setlerini tek bir dosyada tutmak zamanla yönetilemez hale gelir — bunu genellikle o dosyanın 300 satırı geçtiğinde anlarsınız. nftables, include deyimiyle dosya dahil etmeyi destekler; kurallarınızı mantıksal olarak bölebilirsiniz:

# /etc/nftables.conf — Ana yapılandırma dosyası
#!/usr/sbin/nft -f

flush ruleset

# Temel tablo tanımı
table inet filter {
    # Setler ayrı dosyada
    include "/etc/nftables.d/sets.nft"

    # Giriş zinciri
    include "/etc/nftables.d/input.nft"

    # Yönlendirme zinciri
    include "/etc/nftables.d/forward.nft"

    # Çıkış zinciri
    include "/etc/nftables.d/output.nft"
}

# NAT kuralları (gerekiyorsa)
include "/etc/nftables.d/nat.nft"

# Coğrafi engelleme kuralları
include "/etc/nftables.d/geo-block.nft"

6.2 Yedekleme ve Geri Yükleme

Kural değişikliği yapmadan önce yedek almayı alışkanlık haline getirin. Basit ama ihmal edildiğinde pişmanlık garantili:

# Mevcut kuralları yedekleme
sudo nft list ruleset > /root/nftables-backup-$(date +%Y%m%d-%H%M).conf

# Yedekten geri yükleme
sudo nft -f /root/nftables-backup-20260302-1430.conf

# Değişiklik öncesi doğrulama (kuru çalıştırma)
sudo nft -c -f /etc/nftables.conf
# Hata yoksa çıktı boş olur — bu iyi bir işaret

6.3 İzleme ve Hata Ayıklama

Bir şeyler beklendiği gibi çalışmıyorsa paniklemeden önce şu araçlara başvurun. nft monitor trace özellikle paketlerin nerede takıldığını anlamak için inanılmaz kullanışlı:

# Kural eşleşmelerini gerçek zamanlı izleme
watch -n 1 'sudo nft list chain inet filter input'

# Paket izleme (nftrace) etkinleştirme
sudo nft add rule inet filter input meta nftrace set 1
sudo nft monitor trace

# İzlemeyi kapatma (kuralı kaldırma)
sudo nft -a list chain inet filter input
# handle numarasını not alın, örneğin handle 15
sudo nft delete rule inet filter input handle 15

# Bağlantı durumlarını kontrol etme
sudo conntrack -L

# Belirli bir porta gelen trafiği yakalama
sudo tcpdump -i eth0 port 22 -nn

6.4 Ansible ile Otomasyon

Çok sayıda sunucu yönetiyorsanız, nftables kurallarını Ansible gibi yapılandırma yönetim araçlarıyla dağıtmak tutarlılık sağlar. "Her sunucuya tek tek gir, kuralı elle yaz" dönemini geride bırakmak istiyorsanız bu yaklaşım zorunlu hale gelir:

# ansible/roles/nftables/tasks/main.yml
---
- name: nftables paketini kur
  package:
    name: nftables
    state: present

- name: nftables yapılandırmasını dağıt
  template:
    src: nftables.conf.j2
    dest: /etc/nftables.conf
    owner: root
    group: root
    mode: '0644'
    validate: 'nft -c -f %s'
  notify: nftables reload

- name: nftables servisini etkinleştir
  systemd:
    name: nftables
    enabled: yes
    state: started

# ansible/roles/nftables/handlers/main.yml
---
- name: nftables reload
  systemd:
    name: nftables
    state: reloaded

7. Web Sunucusu İçin Tam Üretim Yapılandırması

Aşağıda, bir web sunucusu (Nginx/Apache + SSH) için üretime hazır, kapsamlı bir nftables yapılandırması bulunuyor. Bu yapılandırmayı kendi ihtiyaçlarınıza göre uyarlayabilirsiniz — özellikle izin verilen SSH IP aralıklarını ve log prefix değerlerini ortamınıza göre düzenlemeyi unutmayın:

#!/usr/sbin/nft -f
# /etc/nftables.conf — Üretim Web Sunucusu Yapılandırması
# Son güncelleme: 2026

flush ruleset

table inet filter {

    # ---- SETLER ----

    set allowed_ssh_ips {
        type ipv4_addr
        flags interval
        comment "SSH erişimine izin verilen IP adresleri"
        elements = {
            10.0.0.0/8,
            192.168.1.0/24
        }
    }

    set blocked_ips {
        type ipv4_addr
        flags timeout, dynamic
        timeout 24h
        comment "Otomatik engellenen IP adresleri"
    }

    set ssh_bruteforce {
        type ipv4_addr
        flags dynamic, timeout
        timeout 5m
        comment "SSH kaba kuvvet tespit seti"
    }

    # RFC1918 özel ağ adresleri (WAN'dan gelmemeli)
    set rfc1918 {
        type ipv4_addr
        flags interval
        elements = {
            10.0.0.0/8,
            172.16.0.0/12,
            192.168.0.0/16
        }
    }

    # ---- GİRİŞ ZİNCİRİ ----

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

        # 1. Loopback trafiği
        iif lo accept

        # 2. Kurulu bağlantılar
        ct state established,related accept

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

        # 4. Engelli IP'leri düşür
        ip saddr @blocked_ips counter drop

        # 5. ICMPv4 — hız sınırlı
        ip protocol icmp icmp type {
            echo-request,
            destination-unreachable,
            time-exceeded
        } limit rate 10/second burst 20 packets accept

        # 6. ICMPv6 — IPv6 bağlantısı için gerekli
        ip6 nexthdr icmpv6 icmpv6 type {
            echo-request,
            echo-reply,
            nd-neighbor-solicit,
            nd-neighbor-advert,
            nd-router-solicit,
            nd-router-advert,
            mld-listener-query,
            destination-unreachable,
            packet-too-big,
            time-exceeded,
            parameter-problem
        } accept

        # 7. SSH — yalnızca güvenilir IP'ler + kaba kuvvet koruması
        tcp dport 22 ip saddr @allowed_ssh_ips accept
        tcp dport 22 ct state new add @ssh_bruteforce {
            ip saddr limit rate over 5/minute
        } log prefix "[nft-ssh-brute] " drop
        tcp dport 22 ct state new limit rate 3/minute accept

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

        # 9. Diğer tüm trafiği günlüğe kaydet ve düşür
        log prefix "[nftables-input-drop] " flags all counter drop
    }

    # ---- YÖNLENDİRME ZİNCİRİ ----

    chain forward {
        type filter hook forward priority 0; policy drop;
        # Sunucu router değilse bu zincir kapalı kalır
    }

    # ---- ÇIKIŞ ZİNCİRİ ----

    chain output {
        type filter hook output priority 0; policy accept;
        # Sunucunun dışarıya iletişim kurmasına izin ver
        # (güncellemeler, DNS sorguları, vb.)
    }
}

8. Sık Yapılan Hatalar ve Çözümleri

8.1 iptables ve nftables'ı Aynı Anda Kullanmak

En yaygın hata, iptables-legacy ve nftables kurallarını aynı anda yönetmeye çalışmaktır. Bu durum öngörülemeyen kural etkileşimlerine ve güvenlik açıklarına yol açar. Çözüm net: Tek bir arka uç seçin ve diğerini tamamen devre dışı bırakın.

8.2 Kendini Kilitleme

Uzak bir sunucuya SSH üzerinden bağlıyken güvenlik duvarı kurallarını değiştirirken SSH erişiminizi kaybedebilirsiniz. Bu, her sistem yöneticisinin en az bir kez yaşadığı o meşhur andır. Bunu önlemek için:

# Güvenlik ağı: 5 dakika sonra kuralları sıfırlayan bir zamanlayıcı
sudo nft -f /etc/nftables.conf && \
    echo "Bağlantınız aktif mi? 5 dakika içinde onaylayın..." && \
    sleep 300 && \
    sudo nft flush ruleset && \
    sudo nft -f /etc/nftables-backup.conf

# Daha iyi yöntem: at komutuyla geri dönüş zamanla
echo "nft -f /etc/nftables-backup.conf" | sudo at now + 5 minutes
sudo nft -f /etc/nftables.conf
# Her şey yolundaysa zamanlayıcıyı iptal edin:
sudo atrm $(atq | tail -1 | awk '{print $1}')

8.3 Docker/Podman Uyumluluk Sorunları

Docker, kendi iptables kurallarını otomatik oluşturur. nftables'a geçiş sonrası konteyner ağ bağlantılarının çalıştığını mutlaka doğrulayın. Docker 26+ sürümü nftables ile daha iyi uyum sağlar, ancak yine de dikkatli olmanız gerekir — bu konuda acı tecrübeleri olan epey sistem yöneticisi var.

8.4 nftables Bir L7 Güvenlik Duvarı Değildir

nftables ağ katmanında (L3/L4) çalışır — uygulama katmanı (L7) denetimi yapmaz. Bir saldırgan, TCP 443 (HTTPS) veya UDP 53 (DNS) üzerinden ters kabuk (reverse shell) tünelleyebilir. Uygulama katmanı filtrelemesi için web proxy (Squid, HAProxy) ve IPS (Suricata, Snort) gibi ek araçlarla destekleyin. nftables güçlüdür ama her derde deva değildir.

Sıkça Sorulan Sorular (SSS)

nftables ve iptables arasında hangisini kullanmalıyım?

2026 itibarıyla kesinlikle nftables kullanmalısınız. iptables bakım modunda olup yeni özellik almayacak. Tüm büyük Linux dağıtımları (Debian 10+, Ubuntu 20.04+, RHEL 8+) varsayılan olarak nftables'a geçmiş durumda. Yeni kurulumlar için doğrudan nftables ile başlayın, mevcut sistemlerde ise iptables-translate aracıyla kademeli geçiş yapın.

nftables kuralları sistem yeniden başlatıldığında kaybolur mu?

Eğer nftables servisini etkinleştirdiyseniz (systemctl enable nftables), /etc/nftables.conf dosyasındaki kurallar her açılışta otomatik yüklenir. Dinamik olarak eklediğiniz kuralları (örneğin nft add rule... ile) kalıcı yapmak için nft list ruleset > /etc/nftables.conf komutuyla kaydetmeyi unutmayın.

UFW veya firewalld kullanıyorum, nftables'a geçmeli miyim?

UFW ve firewalld aslında arka planda zaten nftables kullanır (modern dağıtımlarda). Bu araçlar basit yapılandırmalar için yeterlidir. Ancak karmaşık NAT, çoklu arayüz yönlendirme, gelişmiş set/map kullanımı veya büyük ölçekli konteyner ağları gibi senaryolarda doğrudan nftables kullanmak çok daha fazla esneklik ve performans sağlar.

nftables ile coğrafi IP engellemesi ne kadar etkili?

Coğrafi engelleme, saldırı yüzeyini azaltmak için etkili bir ek katmandır — özellikle yalnızca belirli bölgelerden erişim beklenen hizmetler (yönetim panelleri, VPN) için. Ancak tek başına yeterli değildir; VPN ve proxy kullanan saldırganlar bu kısıtlamayı aşabilir. Coğrafi engellemeyi Fail2ban, IDS ve güçlü kimlik doğrulama ile birlikte kullanın.

nftables performansı gerçekten iptables'tan daha iyi mi?

Evet, özellikle büyük kural setlerinde fark belirgindir. iptables her paketi tüm kurallar üzerinden doğrusal olarak (O(n)) geçirirken, nftables hash tabanlı set ve map aramaları sayesinde sabit zamanlı (O(1)) eşleştirme yapabilir. Ayrıca atomik kural güncelleme desteği sayesinde büyük kural setlerini değiştirirken yarış durumu (race condition) riski yoktur ve Linux çekirdeği 6.18/6.19 ile gelen pipapo optimizasyonları dinamik kural setlerinde silme işlemlerini daha da hızlandırmıştır.

Yazar Hakkında Editorial Team

Our team of expert writers and editors.