Bir Linux sunucusunu internete bağladığınız andan itibaren, dünyanın dört bir yanından gelen otomatik taramalar kapınızı yoklamaya başlar. Bu trafiğin hangisinin içeri gireceğine, hangisinin sessizce düşürüleceğine karar veren mekanizma çekirdeğin içindeki netfilter alt sistemidir. Yıllarca bu alt sistemi iptables komutuyla yönettik; ancak modern dağıtımların neredeyse tamamında (Debian 10+, Ubuntu 20.04+, RHEL/AlmaLinux/Rocky 8+) varsayılan araç artık nftables. iptables komutlarını çalıştırdığınızda bile arka planda çeviri katmanı devreye girip aslında nftables'a kural yazar. Yani nftables'ı öğrenmek, gelecekte değil bugün sunucunuzda olan biteni anlamaktır.
Bu rehberde nftables'ı sıfırdan, uygulamalı olarak ele alacağız: table, chain, rule ve set kavramlarının nasıl birbirine bağlandığını, nft komutunun sözdizimini, nftables'ı iptables'tan ayıran somut avantajları ve en önemlisi çalışan bir sunucu güvenlik duvarını adım adım nasıl kuracağınızı göreceğiz. Kuralları /etc/nftables.conf ile kalıcı yapmayı, set ve map ile onlarca IP'yi tek satırda yönetmeyi, sayaç ve loglama ile hata ayıklamayı da işleyeceğiz. Uzaktan bağlandığınız bir sunucuda çalıştığınızı varsayarak, kendinizi SSH'tan kilitlemeden ilerlemenin yollarını özellikle vurgulayacağım. Yeni bir VDS veya sanal sunucu kurduysanız, buradaki adımları ilk yapılandırma listenizin en üstüne koyun.
nftables Nedir ve Neyi Değiştirir?#
nftables, Linux çekirdeğinin paket filtreleme çerçevesi olan netfilter'ı yöneten yeni nesil kullanıcı alanı aracıdır. Tek bir nft komutu ve tek bir tutarlı sözdizimiyle; paket filtreleme, adres çevirisi (NAT), paket manipülasyonu gibi işleri bir çatı altında toplar. Eskiden bu işler iptables, ip6tables, arptables ve ebtables gibi ayrı ayrı komutlara dağılmıştı; nftables hepsini tek arayüzde birleştirir.
En pratik farkı hemen hissedersiniz: eskiden IPv4 için yazdığınız her kuralı IPv6 için ip6tables ile bir kez daha yazmanız gerekirdi. nftables'ta inet adında bir adres ailesi vardır ve tek kural hem IPv4 hem IPv6 trafiğine uygulanır. Kural setiniz yarıya iner, iki protokolün ayrı kalıp birinin unutulması gibi klasik güvenlik açıkları ortadan kalkar.
nftables ayrıca kuralları çekirdeğe atomik olarak yükler. Yani onlarca satırlık bir kural setini tek işlemde uygular; yarısı uygulanıp yarısı uygulanmadan trafik açıkta kalmaz. iptables'ta her kural ayrı bir sistem çağrısıyla eklenirken, nftables tüm dosyayı bir bütün olarak devreye alır. Büyük kural setlerinde bu hem performans hem de tutarlılık anlamına gelir. Güvenlik duvarını daha geniş bir sertleştirme planının parçası olarak görmek isterseniz sunucu güvenliği temelleri rehberimiz iyi bir başlangıç noktasıdır.
Mimari: Table, Chain, Rule ve Set#
nftables'ı anlamanın anahtarı dört kavramdır. Bunları oturttuğunuzda geri kalan her şey yerine oturur.
Table (tablo), kuralları barındıran en dış kaptır ve bir adres ailesine bağlıdır. iptables'taki gibi sabit, önceden tanımlı tablolar yoktur; tabloları siz istediğiniz isimle oluşturursunuz. Adres aileleri şunlardır:
| Aile | Kapsamı |
|---|---|
ip | Yalnızca IPv4 trafiği |
ip6 | Yalnızca IPv6 trafiği |
inet | Hem IPv4 hem IPv6 (çoğu senaryoda tercih edilen) |
arp | ARP paketleri |
bridge | Köprü (bridge) üzerinden geçen çerçeveler |
Chain (zincir), bir tablonun içinde kuralları gruplayan yapıdır. Ancak nftables'ta zincirlerin ikinci bir boyutu daha vardır: bir zincir ya base chain (temel zincir) ya da normal zincir olur. Base chain, çekirdeğin paket işleme yolundaki bir hook'a (kanca) bağlanır ve bir öncelik ile politika taşır. Filtreleme için kritik hook'lar input (sunucuya gelen), output (sunucudan çıkan) ve forward (üzerinden geçen) trafiktir.
Rule (kural), bir zincirin içinde tek bir eşleşme ve karar satırıdır: "kaynak port 22 olan TCP paketini kabul et" gibi. Karar kısmına nftables'ta verdict (hüküm) denir; en sık kullanılanlar accept (kabul et), drop (sessizce düşür), reject (reddet ve haber ver) ve return (üst zincire dön).
Set (küme), nftables'ın en güçlü ve iptables'ta karşılığı zar zor bulunan özelliğidir. Bir set, aynı türden birçok değeri (IP adresleri, portlar, ağ blokları) tek bir isim altında tutar. Yüz tane IP'yi engellemek için yüz kural yazmak yerine, hepsini bir sete koyup tek kuralda referans verirsiniz. Setleri birazdan ayrı bir bölümde ayrıntılı ele alacağız.
nft Komut Sözdizimi ve Temel İşlemler#
nft komutunun genel kalıbı nft [seçenekler] komut nesne özellikler biçimindedir. En sık kullanacağınız komutlar add, list, delete ve flush'tır. Mevcut kural setini tüm ayrıntısıyla görmek için tek bir komut yeterlidir:
sudo nft list ruleset
Sıfırdan başlarken önce bir tablo oluşturursunuz. inet ailesinde filter adında bir tablo açalım:
sudo nft add table inet filter
Ardından bu tablonun içine gelen trafiği denetleyecek bir base chain ekleriz. Buradaki söz diziminde type filter zincirin filtreleme yaptığını, hook input çekirdeğin hangi noktasına bağlandığını, priority 0 önceliği ve policy drop varsayılan politikayı belirtir:
sudo nft add chain inet filter input '{ type filter hook input priority 0 ; policy drop ; }'
Dikkat: policy drop demek, açıkça izin vermediğiniz her şeyin düşürüleceği anlamına gelir. Bu komutu uzaktan çalıştırdıysanız ve henüz SSH'a izin veren bir kural eklemediyseniz, bir sonraki paketinizde bağlantınız kopabilir. Bu yüzden gerçek bir sunucuda kuralları tek tek elle değil, birazdan göstereceğimiz gibi bir dosyadan atomik olarak yüklemek çok daha güvenlidir. Şimdilik kavramı görmek için SSH kuralını ekleyelim:
sudo nft add rule inet filter input tcp dport 22 accept
Bir kuralı silmek için önce onun handle (tanıtıcı) numarasını öğrenmeniz gerekir. Handle'ları görmek için:
sudo nft --handle list chain inet filter input
Çıktıdaki # handle 4 gibi bir numarayla o kuralı silersiniz:
sudo nft delete rule inet filter input handle 4
Bir zinciri veya tabloyu tamamen boşaltmak için flush, kaldırmak için delete kullanılır. Tüm kural setini sıfırlamak (dikkatli olun, güvenlik duvarınız tamamen açık kalır):
sudo nft flush ruleset
nftables ile iptables Farkları ve Avantajları#
İki aracı yan yana koyduğunuzda nftables'ın neden tercih edildiği netleşir. Aşağıdaki tablo günlük kullanımda hissedeceğiniz farkları özetliyor:
| Konu | iptables | nftables |
|---|---|---|
| IPv4/IPv6 | Ayrı komutlar (iptables, ip6tables) | Tek inet ailesiyle birleşik |
| Kural yükleme | Kural kural, ayrı sistem çağrıları | Tüm set atomik yüklenir |
| Toplu IP/port | Her değere ayrı kural | Tek set içinde binlerce değer |
| Sözdizimi | Sabit tablo/zincir, katı bayraklar | Esnek, okunabilir, kendi tablonuz |
| Sayaç | Her kural için varsayılan (yavaş) | İsteğe bağlı counter (hızlı) |
| ipset ihtiyacı | Ayrı ipset aracı gerekir | Yerleşik set ve map |
Somut bir örnekle bakalım. iptables'ta üç IP'yi engellemek için üç ayrı kural yazarsınız. nftables'ta ise bunları bir sete koyup tek kuralla halledersiniz. Ayrıca nftables, birden fazla eşleşmeyi tek satırda birleştirmenize izin verir: tcp dport { 80, 443 } accept gibi. iptables'ta bu iki ayrı kural demektir.
nftables'ın bir başka güçlü yanı, kural setini bir yapılandırma dosyası gibi okunur biçimde yazabilmenizdir. iptables-save çıktısı makine için üretilmiş, gözle takip etmesi zor bir formatken; nftables dosyası girintili, yorumlanabilir ve kendi kendini belgeleyen bir yapıdadır. Bu, altı ay sonra kendi kurallarınıza baktığınızda neyin ne için olduğunu anlamanızı çok kolaylaştırır. Güvenlik duvarını DDoS koruma gibi ağ katmanı önlemlerinizle birlikte düşündüğünüzde, okunabilir ve hızlı güncellenebilir bir kural seti operasyonel bir avantaja dönüşür.
Şunu da netleştirelim: nftables "daha güvenli" değildir, "daha yönetilebilir"dir. Kötü yazılmış bir nftables kuralı da tıpkı kötü yazılmış bir iptables kuralı gibi sizi açıkta bırakır. Avantaj, doğru kuralı yazmayı ve sürdürmeyi kolaylaştırmasındadır.
Adım Adım Sunucu Güvenlik Duvarı Kurmak#
Şimdi tipik bir web sunucusu için baştan sona çalışan bir kural seti kuralım. Amaç şu: SSH (22), HTTP (80) ve HTTPS (443) dışında hiçbir gelen bağlantıya izin verme, ama kurulu bağlantıların ve loopback trafiğinin sorunsuz akmasına izin ver.
Kuralları elle tek tek eklemek yerine bir dosyaya yazıp atomik yüklemek en güvenli yoldur, çünkü policy drop ile SSH kuralı aynı anda devreye girer ve kilitlenme riski ortadan kalkar. Aşağıdaki içeriği bir dosyaya (örneğin /tmp/firewall.nft) yazın:
#!/usr/sbin/nft -f
# Önce eski kuralları temizle
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# Loopback (kendi kendine konuşan) trafiğe izin ver
iif "lo" accept
# Kurulu ve ilişkili bağlantıların dönüş trafiğine izin ver
ct state established,related accept
# Geçersiz paketleri düşür
ct state invalid drop
# ICMP (ping) — teşhis için faydalı, açık bırakmak yaygın
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# SSH, HTTP, HTTPS
tcp dport { 22, 80, 443 } accept
# Geri kalan her şey policy drop ile düşer
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
Bu dosyayı yüklemeden önce sözdizimini kontrol edin — -c bayrağı kuralları uygulamadan yalnızca doğrular:
sudo nft -c -f /tmp/firewall.nft
Hata yoksa gerçek yükleme:
sudo nft -f /tmp/firewall.nft
Yükleme başarılı olursa, mevcut SSH oturumunuzu kapatmadan yeni bir terminalde bağlantıyı test edin:
ssh kullanici@sunucu-ip-adresi
Yeni bağlantı açılıyorsa kurallarınız doğru demektir. Açılmıyorsa hâlâ açık olan ilk oturumdan sudo nft flush ruleset çalıştırıp dosyayı gözden geçirin. Bu "önce test et, sonra güven" alışkanlığı, uzaktaki bir sunucuda kendinizi kilitlememenin altın kuralıdır. SSH'ı standart dışı bir porta taşıdıysanız { 22, 80, 443 } listesindeki 22'yi gerçek portunuzla değiştirmeyi unutmayın; ayrıntı için SSH bağlantısı ve güvenliği rehberimizdeki port değiştirme bölümüne benzer bir mantık geçerlidir.
Kuralların yüklendiğini doğrulamak için:
sudo nft list ruleset
Set ve Map ile Toplu IP Yönetimi#
Gerçek dünyada tek tek IP eklemekle uğraşmazsınız; onlarca güvenilir IP'ye izin verir ya da yüzlerce saldırgan IP'yi engellersiniz. İşte set tam burada devreye girer. Bir set tanımlayıp içine değerler koyar, sonra kuralda tek referansla kullanırsınız.
Örneğin yalnızca ofis ve yönetim IP'lerinin SSH'a erişmesini isteyelim. Önce bir set tanımlayıp içini dolduralım, sonra kuralda kullanalım:
table inet filter {
set yonetici_ip {
type ipv4_addr
elements = { 203.0.113.10, 198.51.100.25 }
}
chain input {
type filter hook input priority 0; policy drop;
iif "lo" accept
ct state established,related accept
# SSH yalnızca setteki IP'lerden
ip saddr @yonetici_ip tcp dport 22 accept
# Web herkese açık
tcp dport { 80, 443 } accept
}
}
Buradaki @yonetici_ip ifadesi "bu setin içindeki herhangi bir adres" anlamına gelir. Yeni bir yönetici IP'si eklemek için tüm dosyayı değiştirmenize gerek yok; canlı olarak sete eleman ekleyebilirsiniz:
sudo nft add element inet filter yonetici_ip { 192.0.2.77 }
Bir saldırgan IP'yi kalıcı olarak engellemek için de aynı mantıkla bir kara liste seti kurabilirsiniz. flags interval sayesinde tek tek adreslerin yanı sıra ağ blokları (CIDR) da tutulabilir:
table inet filter {
set kara_liste {
type ipv4_addr
flags interval
elements = { 45.148.10.0/24, 185.220.101.5 }
}
chain input {
type filter hook input priority 0; policy drop;
ip saddr @kara_liste drop
# ... diğer kurallar
}
}
nftables'ın bir üst seviyesi map'tir: bir değeri başka bir değere veya karara eşler. Örneğin gelen portu doğrudan bir hükme bağlayan bir verdict map ("vmap") yazabilirsiniz. Bu, çok sayıda port kuralını tek, okunabilir bir satıra indirir:
tcp dport vmap { 22 : accept, 80 : accept, 443 : accept, 3306 : drop }
Set ve map'ler dinamik olarak da beslenebilir — örneğin fail2ban'in modern sürümleri yasakladıkları IP'leri doğrudan bir nftables setine yazar. Böylece güvenlik duvarınız, saldırı tespit aracınızla canlı olarak konuşur. Bu tür otomatik savunma katmanlarını sunucu yönetimi hizmetimiz kapsamında sizin adınıza kurup işletebiliriz.
/etc/nftables.conf ile Kuralları Kalıcı Yapmak#
Şimdiye kadar yüklediğiniz her kural yalnızca çekirdeğin belleğindedir. Sunucuyu yeniden başlattığınızda hepsi kaybolur ve güvenlik duvarınız açık kalır. Kuralları kalıcı yapmanın standart yolu, onları /etc/nftables.conf dosyasına yazıp nftables.service sistemd servisini etkinleştirmektir.
Çoğu dağıtımda bu dosya hazır gelir ve servis, açılışta dosyayı okuyup kuralları yükler. Yukarıda /tmp/firewall.nft içinde hazırladığınız çalışan kural setini doğrudan buraya taşıyabilirsiniz:
sudo cp /tmp/firewall.nft /etc/nftables.conf
sudo systemctl enable --now nftables
enable --now hem servisi hemen başlatır hem de sonraki açılışlarda otomatik yüklenmesini sağlar. Dosyanın en üstünde #!/usr/sbin/nft -f satırının bulunması, servisin dosyayı doğru yorumlaması için önemlidir. Değişiklik yaptığınızda servisi yeniden yükleyin:
sudo systemctl reload nftables
Çalışan mevcut kuralları alıp dosyaya dökmek isterseniz (örneğin elle eklediğiniz kuralları kalıcılaştırmak için) list ruleset çıktısını yönlendirebilirsiniz. Ancak bunu sudo altında ve dikkatle yapın, çünkü dosyanın başına flush ruleset ve shebang satırını elle eklemeniz gerekir:
sudo nft list ruleset | sudo tee /etc/nftables.conf
Ubuntu/Debian ile Red Hat ailesi arasında küçük bir fark vardır: bazı sistemlerde eski iptables uyumluluk servisleri hâlâ etkin olabilir ve nftables ile çakışabilir. Temiz bir kurulum için önce iptables/ufw gibi diğer güvenlik duvarı ön yüzlerinin kapalı olduğundan emin olun. UFW zaten arka planda nftables kullanır; ikisini aynı anda elle yönetmeye çalışmak karışıklık yaratır. Bir sunucuda tek bir yönetim yöntemi seçin ve ona sadık kalın.
Loglama, Sayaç ve Hata Ayıklama#
Bir kuralın gerçekten çalışıp çalışmadığını görmenin en iyi yolu ona bir sayaç ve log eklemektir. nftables'ta sayaçlar iptables'ın aksine isteğe bağlıdır — istemediğiniz kurala sayaç koymazsınız, bu da performansı korur. Bir kurala counter eklemek, o kuraldan geçen paket ve bayt sayısını tutar:
sudo nft add rule inet filter input tcp dport 22 counter accept
sudo nft list ruleset çıktısında artık o kuralın yanında kaç paketin geçtiğini görürsünüz. Bu, "bu kural hiç tetikleniyor mu?" sorusunun en net cevabıdır.
Düşürülen paketleri kaydetmek için log ifadesini kullanırsınız. Genellikle drop kuralından hemen önce, bir önek (prefix) ile loglamak teşhis için çok değerlidir:
sudo nft add rule inet filter input log prefix '"nft-drop: "' drop
Bu satırdaki loglar sistem günlüğüne düşer; canlı izlemek için:
sudo journalctl -k -f | grep "nft-drop"
Böylece hangi IP'lerin hangi porta ulaşmaya çalışıp engellendiğini gerçek zamanlı görürsünüz. Yoğun trafik alan sunucularda her düşen paketi loglamak disk ve CPU'yu yorabilir; bu yüzden loglamayı geçici teşhis için açıp sorunu çözünce kapatmak ya da limit rate ile hız sınırlamak iyi bir pratiktir:
sudo nft add rule inet filter input limit rate 5/minute log prefix '"nft-drop: "' drop
Kuralları test ederken sık yaptığınız bir işlemi de not edelim: geçici bir kural ekleyip denedikten sonra flush chain ile temizleyebilir, ana dosyanızı bozmadan deneme yapabilirsiniz. Güvenlik duvarı davranışını dışarıdan bir bakışla doğrulamak isterseniz, sunucunuza port taraması yaparak yalnızca açık bırakmayı düşündüğünüz portların gerçekten açık olduğunu kontrol edebilirsiniz.
Sıkça Sorulan Sorular#
nftables ile iptables aynı anda kullanılabilir mi?#
Teknik olarak ikisi de aynı netfilter alt sistemine yazdığı için aynı çekirdek üzerinde çalışabilirler, ancak aynı sunucuda ikisini birden elle yönetmek şiddetle önerilmez. Kurallar iki farklı araçtan geldiğinde hangi kuralın önce işlendiğini takip etmek zorlaşır ve beklenmedik davranışlar ortaya çıkar. Tek bir araç seçin; modern bir sistemde bu tercih neredeyse her zaman nftables olmalıdır.
iptables kurallarımı nftables'a nasıl taşırım?#
nftables bu iş için hazır bir çeviri aracı sunar. Mevcut kurallarınızı iptables-save > kurallar.txt ile dışa aktarıp iptables-restore-translate -f kurallar.txt komutuyla nftables sözdizimine çevirebilirsiniz. Çıktıyı olduğu gibi kabul etmek yerine gözden geçirmenizi öneririm, çünkü otomatik çeviri çoğu zaman doğru ama sadeleştirilmemiş bir sonuç üretir ve elle iyileştirilebilir.
policy drop koyunca sunucudan kilitlendim, ne yapmalıyım?#
Uzaktaki bir sunucuda SSH kuralı eklemeden policy drop uygularsanız bağlantınız kopar. Eğer hâlâ açık bir oturumunuz varsa hemen sudo nft flush ruleset çalıştırarak tüm kuralları temizleyip erişimi geri alın, sonra doğru sırayla yeniden kurun. Oturumunuz da kapandıysa sağlayıcınızın web tabanlı konsolu (VNC veya seri konsol) üzerinden sunucuya girip aynı komutu çalıştırmanız gerekir; bu yüzden kuralları her zaman dosyadan atomik yükleyin.
nftables kuralları sunucu yeniden başlayınca kayboluyor mu?#
Kuralları yalnızca nft add komutlarıyla eklerseniz evet, yeniden başlatmada kaybolurlar çünkü bu kurallar sadece çekirdek belleğindedir. Kalıcı olması için kural setini /etc/nftables.conf dosyasına yazıp sudo systemctl enable --now nftables ile servisi etkinleştirmeniz gerekir. Bu yapıldığında sunucu her açıldığında kurallar otomatik yüklenir.
inet ailesi ile ip ailesi arasındaki fark nedir?#
ip ailesi yalnızca IPv4 trafiğine, ip6 ailesi yalnızca IPv6 trafiğine uygulanır; inet ailesi ise ikisini birden kapsar. Çoğu sunucuda inet kullanmak en doğru tercihtir çünkü tek kural setiyle her iki protokolü de korursunuz ve IPv6'yı yanlışlıkla açıkta bırakma riskini ortadan kaldırırsınız. Yalnızca IPv6'ya özel bir davranış tanımlamanız gerektiğinde kural içinde ip6 ön ekiyle ayrım yapabilirsiniz.
Sadece belirli ülkelerden trafiğe izin vermek için nftables kullanabilir miyim?#
Doğrudan "ülke" kavramı yoktur, ancak bir ülkeye ait IP bloklarını (CIDR listelerini) bir set içine flags interval ile yükleyerek coğrafi filtreleme benzeri bir sonuç elde edebilirsiniz. Bu listeler büyük ve sürekli değişken olduğundan, güncelliğini otomatik bir betikle korumak gerekir. Kapsamlı ve bakımı yapılan bir coğrafi engelleme ihtiyacında, tek başına nftables setleri yerine bir WAF veya CDN katmanı çoğu zaman daha sürdürülebilir bir çözümdür.
Kapanış#
nftables, karmaşık ve dağınık iptables komutlarının yerine tek, tutarlı ve okunabilir bir güvenlik duvarı dili getirir. Doğru yaklaşım her zaman aynıdır: inet ailesinde bir tablo kurun, base chain'inizin politikasını drop yapın, önce loopback ve kurulu bağlantılara, sonra SSH ve web portlarına izin verin, kuralları dosyadan atomik yükleyip test edin ve son olarak /etc/nftables.conf ile kalıcılaştırın. Set ve map'ler onlarca IP'yi tek satırda yönetmenizi, sayaç ve loglama ise neyin çalıştığını net görmenizi sağlar.
Bu adımları yeni bir VDS veya sanal sunucu kurulumunuzda başlangıç noktanız yapabilir, ardından sunucu güvenliği temelleri ve UFW rehberimizle koruma katmanlarınızı tamamlayabilirsiniz. Güvenlik duvarı yapılandırmasını, güncellemeleri ve izlemeyi kendiniz üstlenmek istemiyorsanız, sunucu yönetimi hizmetimiz kapsamında tüm bu sertleştirme sürecini uzman ekibimize bırakabilirsiniz. Daha güçlü bir donanım altyapısı için sunucu çözümlerimize göz atmayı da unutmayın.