nftables ile sunucu güvenlik duvarı oluşturun
Debian veya Ubuntu sunucu için varsayılan olarak reddeden nftables kural seti yazın: ICMP, SSH, web portları ve izin listeleri, geri alma güvencesiyle.
- Orta
- 20 dk okuma
- Güncellendi
Denendiği sistemler: Debian 12, Debian 13, Ubuntu 24.04 LTS, Ubuntu 26.04 LTS
Bu sayfada
nftables, güncel Linux çekirdeklerinin paket filtreleme altyapısı ve Debian'ın varsayılan güvenlik duvarıdır. Yapılandırması IPv4 ve IPv6'yı kapsayan okunabilir tek bir dosyadır. Bu rehber bir sunucu için varsayılan olarak reddeden bir kural seti yazar, güvenle uygular ve nasıl genişletileceğini gösterir. 198.51.100.7 yerine kendi IP adresinizi yazın.
Başlamadan önce
- sudo kullanıcısıyla giriş yapın ve hizmet sayfanızda görünüyorsa web konsolunu hazır tutun.
- Tek bir güvenlik duvarı aracı kullanın. UFW etkinse (
sudo ufw status) öncesudo ufw disableile kapatın ya da UFW ile devam edin: UFW güvenlik duvarı. - Gerekirse araçları kurun (Debian'da hazırdır; Ubuntu'da
sudo apt install nftablesçalıştırın).
1. adım: Kural setini yazın
/etc/nftables.conf dosyasını açın:
sudo nano /etc/nftables.confİçeriğini şununla değiştirin:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set admin_hosts {
type ipv4_addr
flags interval
elements = { 198.51.100.7 }
}
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto icmp accept
meta l4proto ipv6-icmp accept
tcp dport 22 accept
tcp dport { 80, 443 } accept
counter comment "dropped by policy"
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}Ne yapar: kendi bağlantılarınıza gelen yanıtlara, loopback'e ve ICMP'ye izin verilir, SSH ve web portları açıktır, gelen diğer her şey düşürülür. admin_hosts kümesi izin listeleri için hazırdır (4. adım).
2. adım: Sözdizimini kontrol edin
sudo nft -c -f /etc/nftables.confÇıktı yoksa dosya geçerlidir.
3. adım: Bir güvenlik ağıyla uygulayın
Kuralları yüklemeden önce otomatik bir geri alma zamanlayın. Bir şey bağlantınızı keserse kurallar beş dakika sonra temizlenir:
sudo systemd-run --on-active=5min /usr/sbin/nft flush ruleset
sudo nft -f /etc/nftables.confYeni bir SSH oturumu açın. Çalışıyorsa geri almayı iptal edin: systemctl list-timers zamanlayıcıyı gösterir (adı run- ile başlar) ve sudo systemctl stop ardından bu ad onu iptal eder.
Kural setinin açılışta yüklenmesini sağlayın:
sudo systemctl enable nftablesDoğrulama:
sudo nft list ruleset4. adım: Bir portu adreslerinizle sınırlayın
SSH'ye yalnızca admin_hosts içindeki adreslerden izin vermek için SSH satırını şöyle değiştirin:
tcp dport 22 ip saddr @admin_hosts acceptTüm dosyayı yeniden yüklemeden, çalışma anında adres ekleyin veya kaldırın:
sudo nft add element inet filter admin_hosts { 203.0.113.0/24 }
sudo nft delete element inet filter admin_hosts { 203.0.113.0/24 }Çalışma anındaki değişiklikler yeniden başlatmada kaybolur; bunları /etc/nftables.conf dosyasına da ekleyin. IPv6 yönetici adresleri için type ipv6_addr türünde ikinci bir küme ve ip6 saddr ile eşleşen bir kural oluşturun.
5. adım: Daha fazla port açın
input zincirine her servis için bir satır ekleyin, kontrol edip yeniden yükleyin:
udp dport 51820 accept
tcp dport 25565 acceptsudo nft -c -f /etc/nftables.conf
sudo nft -f /etc/nftables.confDüşürülenleri kaydedin
Düşürülen paketleri görmek için input zincirinin son satırı olarak hız sınırlı bir log kuralı ekleyin:
limit rate 5/minute log prefix "nft-drop: "Kaydı sudo journalctl -k | grep nft-drop ile okuyun.
Sorun giderme
Kuralları yükledikten sonra SSH dondu. Geri alma zamanlayıcısını bekleyin ya da konsolu kullanın: sudo nft flush ruleset. Ardından dosyayı düzeltin. Bkz. güvenlik duvarı değişikliğinden sonra erişimi kaybetmek.
IPv6 çalışmayı durdurdu. ICMPv6 engelleniyor. ipv6-icmp satırını koruyun.
Kurallar yeniden başlatmadan sonra kayboluyor. nftables servisi etkin değil ya da başka bir araç (UFW, Docker, firewalld) kendi kurallarını yüklüyor. systemctl status nftables ile kontrol edin.
output zinciri izin verdiği halde 25 numaralı porttan posta gönderilemiyor. HyperDC VPS'lerde giden 25 numaralı port varsayılan olarak kapalıdır. 3 ay veya daha uzun süreyle satın alınan hizmetlerde bir destek bildirimi açtığınızda talep üzerine açılır. O zamana kadar postayı 587 portu üzerinden bir aktarıcıyla (relay) gönderin.
Docker container'ları ağ erişimini kaybediyor. Docker kendi kurallarını yönetir; flush ruleset onları kaldırır. Yeniden yüklemeden sonra Docker'ı yeniden başlatın ya da belgelerinde anlatıldığı gibi Docker'ın tablolarını temizlemenin dışında tutun.
Sonraki adımlar
- Port yönlendirme ve NAT: portlar ve port yönlendirme.
- Sunucunuzda IPv6: IPv6 kurulumu.
Sık sorulan sorular
nftables mı, UFW mi kullanmalıyım?
UFW yaygın durumlar için daha kolaydır. nftables, okunabilir tek bir dosyada tam kontrol, izin listeleri için kümeler (set) ve NAT sağlar. Birini seçin; kuralları ikisinde birden tutmayın.
IPv6 için ayrı kurallar gerekir mi?
inet ailesinden bir tablo kullanırsanız hayır: kuralları IPv4 ve IPv6'ya uygulanır. IPv6'nın çalışması için gereken ICMPv6'ya izin vermeyi unutmayın.
Kurallarım yeniden başlatmadan sonra korunur mu?
Evet; /etc/nftables.conf içindeyse ve nftables servisi etkinse. Yalnızca nft komutuyla eklenen kurallar yeniden başlatmada kaybolur.
ICMP'ye neden izin vermeliyim?
ICMP, yol MTU keşfi gibi bağlantıların çalışmasını sağlayan hata mesajlarını taşır; IPv6 da komşu keşfi için ICMPv6'ya ihtiyaç duyar. Engellemek, bulunması zor sorunlara yol açar.
Trafiği hangi kuralın engellediğini nasıl görürüm?
Kurala sayaç veya bir log ifadesi ekleyin, örneğin ardından bir metin gelen log prefix, sonra çekirdek kaydını journalctl -k ile okuyun.
Kaynaklar
- wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_…
- wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server
- wiki.nftables.org/wiki-nftables/index.php/Sets
- manpages.debian.org/bookworm/nftables/nft.8.en.html
- wiki.debian.org/nftables
- freedesktop.org/software/systemd/man/latest/systemd-run.html