nftables ile Modern Güvenlik Duvarı Yapılandırması

Linux güvenlik duvarı dünyası uzun yıllar boyunca iptables’ın gölgesinde kaldı. Ancak modern sistemlerin ihtiyaçları değişti, ağ yapıları karmaşıklaştı ve iptables’ın mimari kısıtlamaları giderek daha fazla hissedilir oldu. İşte tam bu noktada nftables sahneye çıktı. Netfilter projesinin modern çözümü olan nftables, Linux kernel 3.13 ile birlikte sisteme entegre edildi ve bugün itibariyle pek çok dağıtımda varsayılan güvenlik duvarı altyapısı haline geldi. Bu yazıda nftables’ı sıfırdan yapılandırmayı, gerçek dünya senaryolarını ve production ortamlarında işe yarayacak pratik konfigürasyonları ele alacağız.

nftables Neden iptables’tan Daha İyi?

Önce şunu söyleyelim: iptables kötü bir araç değildi. Yıllarca milyonlarca sunucuyu korudu. Ama bazı yapısal sorunları vardı. En büyük problem, her protokol için ayrı araç kullanma zorunluluğuydu. IPv4 için iptables, IPv6 için ip6tables, köprü trafiği için ebtables, ARP için arptables kullanmak zorundaydınız. Bu durum kural yönetimini ciddi ölçüde zorlaştırıyordu.

nftables’ın getirdiği avantajlar:

  • Tek araç, tüm protokoller: IPv4, IPv6, ARP, köprü trafiği hepsi tek çatı altında
  • Atomik kural güncellemeleri: Tüm kural setini tek seferde, kesintisiz uygulayabilirsiniz
  • Gelişmiş set ve map desteği: IP adresi listelerini çok daha verimli yönetebilirsiniz
  • Daha az kernel çağrısı: Performans açısından belirgin iyileşme
  • Okunabilir sözdizimi: Kural dosyaları insan tarafından çok daha kolay anlaşılır
  • JIT derleyici desteği: Kural işleme hızını artıran bytecode optimizasyonu

Kurulum ve İlk Adımlar

Debian/Ubuntu tabanlı sistemlerde nftables genellikle önceden yüklü gelir. Değilse kurulum oldukça basit:

# Debian/Ubuntu
apt install nftables

# RHEL/CentOS/Rocky Linux
dnf install nftables

# Servisi başlat ve etkinleştir
systemctl enable --now nftables

# Mevcut kural setini görüntüle
nft list ruleset

Eğer sisteminizde hâlâ iptables aktifse ve nftables’a geçiş yapıyorsanız, her ikisinin aynı anda çalışmaması gerektiğini unutmayın. Modern dağıtımlarda iptables zaten nft backend’ini kullanıyor olabilir:

# iptables'ın hangi backend'i kullandığını kontrol et
iptables --version
# Çıktı: iptables v1.8.7 (nf_tables) ise nft backend kullanıyor demektir

# Eski iptables servislerini devre dışı bırak
systemctl disable --now iptables ip6tables

Temel Kavramlar: Table, Chain ve Rule

nftables’ı anlamak için üç temel kavramı oturtmak gerekiyor.

Table (Tablo): Zincirleri ve kuralları gruplayan en üst düzey yapı. Her tablonun bir ailesi vardır: ip, ip6, inet, arp, bridge, netdev. Günlük kullanımda genellikle inet ailesini tercih edersiniz çünkü hem IPv4 hem IPv6 trafiğini birlikte yönetir.

Chain (Zincir): Kuralların sıralandığı yapı. İki tip zincir vardır: base chain ve regular chain. Base chain’ler Netfilter hook’larına bağlanır (prerouting, input, forward, output, postrouting). Regular chain’ler ise diğer chain’lerden çağrılan yardımcı yapılardır.

Rule (Kural): Trafiği eşleştiren ve bir aksiyon belirleyen ifade. accept, drop, reject, log, jump gibi aksiyonlar kullanılır.

Temel Sunucu Güvenlik Duvarı Yapılandırması

Şimdi işe yarar bir şeyler yazalım. Tipik bir web sunucusu için başlangıç konfigürasyonu:

#!/usr/sbin/nft -f

# Mevcut tüm kuralları temizle
flush ruleset

# inet ailesi için ana tablo
table inet firewall {

    # Gelen trafiği kontrol eden zincir
    chain input {
        type filter hook input priority filter; policy drop;

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

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

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

        # ICMP ve ICMPv6'ya izin ver
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept

        # SSH erişimine izin ver
        tcp dport 22 accept

        # HTTP ve HTTPS trafiğine izin ver
        tcp dport { 80, 443 } accept
    }

    # Yönlendirme zinciri - bu sunucu router değil, kapalı
    chain forward {
        type filter hook forward priority filter; policy drop;
    }

    # Giden trafiği kontrol eden zincir
    chain output {
        type filter hook output priority filter; policy accept;
    }
}

Bu konfigürasyonu /etc/nftables.conf dosyasına kaydedip uygulayabilirsiniz:

# Konfigürasyonu test et (syntax kontrolü)
nft -c -f /etc/nftables.conf

# Uygula
nft -f /etc/nftables.conf

# Veya servisi yeniden başlat
systemctl restart nftables

Set’ler ile Akıllı IP Yönetimi

nftables’ın en güçlü özelliklerinden biri set’ler. Birden fazla IP adresini ya da port numarasını tek bir yapıda gruplandırıp kurallarınızda kullanabilirsiniz. Bu, yönetimsel açıdan büyük kolaylık sağlar.

table inet firewall {

    # Yönetim erişimine izin verilen IP adresleri
    set admin_ips {
        type ipv4_addr
        flags interval
        elements = {
            192.168.1.0/24,
            10.10.0.100,
            203.0.113.50
        }
    }

    # Kara listedeki IP adresleri
    set blocklist {
        type ipv4_addr
        flags dynamic, timeout
        timeout 1h
        size 65536
    }

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

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

        # Kara listedeki IP'lerden gelen trafiği düşür
        ip saddr @blocklist drop

        # SSH sadece yönetim IP'lerinden
        ip saddr @admin_ips tcp dport 22 accept

        # Web trafiği herkese açık
        tcp dport { 80, 443 } accept

        # Port scan tespiti: 60 saniyede 15'ten fazla bağlantı denemesi
        tcp flags syn tcp dport != { 80, 443, 22 } 
            limit rate over 15/minute 
            add @blocklist { ip saddr timeout 1h }
    }
}

Dinamik set özelliği inanılmaz derecede kullanışlı. Kötü niyetli IP’leri çalışma zamanında otomatik olarak listeye ekleyebilirsiniz:

# Manuel olarak IP ekle
nft add element inet firewall blocklist { 198.51.100.1 }

# IP'yi listeden çıkar
nft delete element inet firewall blocklist { 198.51.100.1 }

# Set içeriğini görüntüle
nft list set inet firewall blocklist

Rate Limiting ile DDoS Koruması

Gerçek dünyada en sık karşılaştığımız sorunlardan biri brute force ve DDoS saldırıları. nftables’ın rate limiting özellikleri bu konuda oldukça etkili:

table inet firewall {

    set ssh_bruteforce {
        type ipv4_addr
        flags dynamic, timeout
        timeout 15m
        size 10000
    }

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

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

        # SSH brute force koruması
        # Daha önce yakalanmış IP'leri reddet
        tcp dport 22 ip saddr @ssh_bruteforce reject with tcp reset

        # Yeni SSH bağlantılarını say, 3'ü geçince engelle
        tcp dport 22 ct state new 
            limit rate over 3/minute burst 5 packets 
            add @ssh_bruteforce { ip saddr } 
            log prefix "SSH-BRUTEFORCE: " 
            drop

        tcp dport 22 ct state new accept

        # SYN flood koruması
        tcp flags & (fin|syn|rst|ack) == syn 
            limit rate over 1000/second burst 2000 packets 
            drop

        # HTTP/HTTPS için connection limit
        tcp dport { 80, 443 } ct state new 
            limit rate over 100/second burst 200 packets 
            accept

        tcp dport { 80, 443 } accept

        ip protocol icmp icmp type echo-request 
            limit rate 10/second accept
        ip protocol icmp drop
    }
}

Logging ve İzleme

Güvenlik duvarı kurallarının işe yarayıp yaramadığını anlamak için log almak şart. nftables’ta log yapılandırması oldukça esnek:

table inet firewall {

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

        iif lo accept
        ct state established,related accept

        # Reddedilen trafiği logla (rate limit ile log flooding önle)
        ct state invalid 
            limit rate 5/second burst 10 packets 
            log prefix "INVALID-PKT: " flags all 
            drop

        tcp dport 22 accept
        tcp dport { 80, 443 } accept

        # Tüm reddedilen bağlantıları logla
        tcp flags syn 
            limit rate 10/second 
            log prefix "DROPPED-SYN: " 
            drop

        # Genel drop log
        limit rate 3/second 
            log prefix "DROPPED: " level warn
    }
}

Log çıktılarını izlemek için:

# Gerçek zamanlı log takibi
journalctl -f | grep -E "DROPPED|INVALID|BRUTEFORCE"

# Kernel log üzerinden
dmesg -w | grep "DROPPED"

# Son 100 güvenlik duvarı olayı
journalctl -n 100 --no-pager | grep "nft"

NAT Yapılandırması

Bir ağ geçidi ya da router olarak yapılandırılmış Linux sunucularında NAT kaçınılmaz. nftables ile NAT konfigürasyonu:

table ip nat {

    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;

        # Dışarıdan gelen HTTP trafiğini iç web sunucusuna yönlendir
        iif eth0 tcp dport 80 dnat to 192.168.1.10:80

        # HTTPS trafiğini yönlendir
        iif eth0 tcp dport 443 dnat to 192.168.1.10:443

        # Belirli portları farklı sunuculara yönlendir
        iif eth0 tcp dport 3306 dnat to 192.168.1.20:3306
    }

    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;

        # İç ağdan çıkan trafiği masquerade et
        oif eth0 masquerade

        # Belirli subnet için SNAT
        ip saddr 192.168.1.0/24 oif eth0 
            snat to 203.0.113.1
    }
}

table inet firewall {

    chain forward {
        type filter hook forward priority filter; policy drop;

        # Kurulmuş bağlantılara izin ver
        ct state established,related accept

        # İç ağdan dışarıya çıkışa izin ver
        iif eth1 oif eth0 accept

        # Dışarıdan yönlendirilen trafiğe izin ver
        iif eth0 ct state new 
            ip daddr 192.168.1.10 
            tcp dport { 80, 443 } accept
    }
}

Production Ortamı için Tam Konfigürasyon

Şimdiye kadar anlattıklarımızı birleştiren, gerçek bir production web sunucusu için kapsamlı konfigürasyon:

#!/usr/sbin/nft -f

flush ruleset

define WAN_IF = eth0
define LAN_IF = eth1
define MGMT_NET = 10.10.10.0/24
define WEB_PORTS = { 80, 443 }

table inet filter {

    set admin_hosts {
        type ipv4_addr
        flags interval
        elements = { $MGMT_NET }
    }

    set blocked_ips {
        type ipv4_addr
        flags dynamic, timeout
        timeout 24h
        size 65536
    }

    set port_scanners {
        type ipv4_addr
        flags dynamic, timeout
        timeout 6h
        size 10000
    }

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

        # Loopback
        iif lo accept comment "Loopback trafiğine izin ver"

        # Kurulmuş bağlantılar
        ct state vmap {
            established : accept,
            related     : accept,
            invalid     : drop
        }

        # Engelli IP'leri düşür
        ip saddr @blocked_ips 
            log prefix "BLOCKED-IP: " drop

        # Port scanner'ları düşür
        ip saddr @port_scanners drop

        # ICMP rate limiting
        ip protocol icmp icmp type {
            echo-request, echo-reply,
            destination-unreachable,
            time-exceeded
        } limit rate 10/second accept

        ip6 nexthdr icmpv6 accept

        # SSH yönetim ağından
        ip saddr @admin_hosts tcp dport 22 
            ct state new 
            limit rate 5/minute 
            accept comment "SSH mgmt"

        # SSH dışarıdan denemeyi logla ve engelle
        tcp dport 22 ct state new 
            add @blocked_ips { ip saddr timeout 1h } 
            log prefix "SSH-SCAN: " drop

        # Web trafiği
        tcp dport $WEB_PORTS ct state new accept

        # Port scan tespiti
        ct state new tcp flags != syn 
            add @port_scanners { ip saddr } 
            log prefix "PORT-SCAN: " drop

        # Genel reddi logla
        limit rate 5/second 
            log prefix "FW-DROP: " level info
    }

    chain forward {
        type filter hook forward priority filter; policy drop;
    }

    chain output {
        type filter hook output priority filter; policy accept;

        # Giden bağlantılara genel izin, sadece geçersizleri düşür
        ct state invalid drop
    }
}

Kural Yönetimi ve Hata Ayıklama

Günlük yönetim sırasında işinize yarayacak komutlar:

# Tüm kural setini 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

# Kural sayaçlarını görüntüle (kural başına istatistik)
nft list ruleset | grep -A2 "counter"

# Çalışma zamanında kural ekle
nft add rule inet filter input 
    ip saddr 203.0.113.100 drop

# Handle numarasıyla kural sil
nft list ruleset -a  # Handle numaralarını göster
nft delete rule inet filter input handle 15

# Konfigürasyonu yedekle
nft list ruleset > /etc/nftables-backup-$(date +%Y%m%d).conf

# Yedekten geri yükle
nft -f /etc/nftables-backup-20240115.conf

Bir sorun yaşandığında güvenlik duvarını geçici olarak devre dışı bırakmak yerine, sadece politikayı değiştirin:

# Acil durum: tüm trafiğe izin ver (zincir politikasını değiştir)
nft chain inet filter input '{ policy accept; }'

# Sonra normal politikaya geri dön
nft chain inet filter input '{ policy drop; }'

Otomatik Yedekleme ve Servis Entegrasyonu

Production sistemlerde konfigürasyon değişikliklerini otomatik olarak yedeklemek iyi bir alışkanlık:

#!/bin/bash
# /usr/local/bin/nftables-backup.sh

BACKUP_DIR="/var/backups/nftables"
DATE=$(date +%Y%m%d-%H%M%S)
MAX_BACKUPS=30

mkdir -p "$BACKUP_DIR"
nft list ruleset > "$BACKUP_DIR/nftables-$DATE.conf"

# Eski yedekleri temizle
ls -t "$BACKUP_DIR"/*.conf | tail -n +$((MAX_BACKUPS + 1)) | xargs rm -f 2>/dev/null

echo "Yedekleme tamamlandi: $BACKUP_DIR/nftables-$DATE.conf"

Bu scripti cron’a ekleyin:

# /etc/cron.d/nftables-backup
0 */6 * * * root /usr/local/bin/nftables-backup.sh >> /var/log/nftables-backup.log 2>&1

nftables’ın sistem başlangıcında otomatik yüklenmesi için /etc/nftables.conf dosyasını güncel tutun ve servisi etkinleştirdiğinizden emin olun:

systemctl enable nftables
systemctl status nftables

# Konfigürasyonu geçerli durumda kaydet
nft list ruleset > /etc/nftables.conf

Sonuç

nftables, modern Linux sistemleri için güvenlik duvarı yönetiminde gerçek anlamda bir paradigma değişikliği sunuyor. Tek bir araçla tüm protokolleri yönetmek, atomik güncellemeler yapabilmek ve güçlü set/map yapılarını kullanabilmek; özellikle karmaşık ağ topolojilerinde işleri dramatik ölçüde kolaylaştırıyor.

Pratik olarak şunu önerebilirim: Eğer hâlâ iptables kullanıyorsanız, mevcut sistemlerinizi bir gecede geçirmeye çalışmayın. Önce test ortamında nftables’ı derinlemesine öğrenin, production dışı bir sunucuda gerçek senaryolar üzerinde pratik yapın. nftables’ın sözdizimini kavramak birkaç saat alıyor ama bir kez oturtunca iptables’a geri dönmek istemiyorsunuz.

Özellikle dikkat etmeniz gereken nokta şu: Güvenlik duvarı kuralları ne kadar güçlü olursa olsun, tek başına yeterli değil. nftables’ı fail2ban, ossec gibi araçlarla entegre etmek, log izlemeyi ihmal etmemek ve kural setlerinizi düzenli olarak gözden geçirmek, sağlam bir güvenlik duruşu için şart. İyi yapılandırılmış bir nftables kurulumu, sisteminizin güvenlik katmanlarından birini sağlam temele oturtmanızı sağlar; geri kalan katmanları da aynı özenle inşa etmek size kalmış.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir