İçeriğe geç

AğGüvenlik duvarları

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
  1. Başlamadan önce
  2. 1. adım: Kural setini yazın
  3. 2. adım: Sözdizimini kontrol edin
  4. 3. adım: Bir güvenlik ağıyla uygulayın
  5. 4. adım: Bir portu adreslerinizle sınırlayın
  6. 5. adım: Daha fazla port açın
  7. Düşürülenleri kaydedin
  8. Sorun giderme
  9. Sonraki adımlar

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) önce sudo ufw disable ile 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:

Bash
sudo nano /etc/nftables.conf

İçeriğini şununla değiştirin:

Text
#!/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

Bash
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:

Bash
sudo systemd-run --on-active=5min /usr/sbin/nft flush ruleset
sudo nft -f /etc/nftables.conf

Yeni 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:

Bash
sudo systemctl enable nftables

Doğrulama:

Bash
sudo nft list ruleset

4. 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:

Text
tcp dport 22 ip saddr @admin_hosts accept

Tüm dosyayı yeniden yüklemeden, çalışma anında adres ekleyin veya kaldırın:

Bash
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:

Text
udp dport 51820 accept
tcp dport 25565 accept
Bash
sudo nft -c -f /etc/nftables.conf
sudo nft -f /etc/nftables.conf

Düşü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:

Text
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

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

Şifre Oluştur

Lütfen onaylayın