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ış.
