Debian’da Firewall Kurallarını Kalıcı Hale Getirme

Sunucuya bağlandın, iptables kurallarını ayarladın, her şey mükemmel çalışıyor. Sonra sunucuyu yeniden başlatıyorsun ve tüm kurallar uçup gidiyor. Bu klasik Debian firewall acısını yaşamamış sysadmin az bulunur. Sorun şu: iptables kuralları varsayılan olarak bellekte tutulur ve sistem yeniden başladığında sıfırlanır. Bu yazıda Debian sistemlerde firewall kurallarını kalıcı hale getirmenin birden fazla yolunu, gerçek dünya senaryolarıyla birlikte ele alacağız.

iptables ve Kalıcılık Sorunu

Debian, iptables’ı varsayılan olarak kurulu getiriyor ancak kuralların otomatik yüklenmesi için herhangi bir mekanizma sunmuyor. Bu bilinçli bir tasarım kararı aslında; farklı kullanım senaryoları için farklı çözümler mevcut.

Kalıcılık sorununun temelini anlamak için önce mevcut kurallarına bakman gerekiyor:

sudo iptables -L -n -v
sudo iptables -L -n -v --line-numbers

Eğer sistemi yeniden başlattıktan sonra kuralların gittiğini doğrulamak istiyorsan, basit bir test yapabilirsin. Bir kural ekle, kaydet, sistemi yeniden başlat ve kontrol et. Ama bunu production sunucuda yapma, lütfen.

Yöntem 1: iptables-persistent ile Kalıcı Kurallar

En yaygın ve önerilen yöntem iptables-persistent paketidir. Debian’da kurulumu oldukça basit:

sudo apt update
sudo apt install iptables-persistent

Kurulum sırasında sihirbaz sana mevcut IPv4 ve IPv6 kurallarını kaydetmek isteyip istemediğini soracak. Eğer halihazırda kuralların varsa “Yes” demeni öneririm.

Paket kurulduktan sonra kurallar şu dosyalara kaydedilir:

  • /etc/iptables/rules.v4: IPv4 kuralları
  • /etc/iptables/rules.v6: IPv6 kuralları

Kuralları Manuel Kaydetmek

iptables-persistent kurulu olduğunda yeni bir kural eklediğinde veya değiştirdiğinde bu değişiklik otomatik olarak dosyaya yazılmaz. Manuel olarak kaydetmen gerekir:

sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6

Ya da netfilter-persistent servisini kullanabilirsin:

sudo netfilter-persistent save
sudo netfilter-persistent reload

Gerçek Dünya Senaryosu: Web Sunucusu Güvenliği

Diyelim ki bir web sunucusu kuruyorsun ve şu kuralları uygulamak istiyorsun: SSH sadece belirli IP’den erişilebilsin, HTTP ve HTTPS herkese açık olsun, diğer her şey engellensin.

# Önce mevcut kuralları temizle
sudo iptables -F
sudo iptables -X

# Varsayılan politikaları ayarla
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# Loopback arayüzüne izin ver
sudo iptables -A INPUT -i lo -j ACCEPT

# Mevcut bağlantılara izin ver
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SSH sadece yönetim IP'sinden (örnek: 192.168.1.100)
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT

# HTTP ve HTTPS herkese açık
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Kuralları kaydet
sudo iptables-save > /etc/iptables/rules.v4

Bu kuralları uyguladıktan sonra sistemi yeniden başlatsan bile kurallar yüklü gelecek.

Yöntem 2: iptables-restore ile Özel Script

Bazen daha fazla kontrol istiyorsun. Özellikle kuralların belirli bir sırayla yüklenmesi veya sistem başlarken ek işlemler yapılması gerektiğinde bu yöntem işe yarıyor.

Önce kurallarını bir dosyaya kaydet:

sudo iptables-save > /etc/iptables/myrules.v4

Şimdi bu kuralları sistem başlangıcında yükleyecek bir systemd servisi oluştur:

sudo nano /etc/systemd/system/iptables-restore.service

Dosyanın içeriği şöyle olmalı:

[Unit]
Description=Restore iptables firewall rules
Before=network-pre.target
Wants=network-pre.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables/myrules.v4
ExecStart=/sbin/ip6tables-restore /etc/iptables/rules.v6
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Servisi etkinleştir ve başlat:

sudo systemctl daemon-reload
sudo systemctl enable iptables-restore.service
sudo systemctl start iptables-restore.service

Bu yöntemin avantajı, kural dosyasının tam yolunu kontrol edebilmen ve servisi kolayca devre dışı bırakabilmendir. Özellikle farklı ortamlar için farklı kural setleri yönetiyorsan çok kullanışlı.

Yöntem 3: UFW ile Basitleştirilmiş Yönetim

UFW (Uncomplicated Firewall) aslında iptables’ın üzerine oturan bir soyutlama katmanı. Kuralları kalıcı hale getirmek UFW’da varsayılan olarak gelir. Eğer karmaşık kurallara ihtiyacın yoksa ve hızlı bir çözüm istiyorsan UFW ideal seçim.

sudo apt install ufw

UFW’u etkinleştirmeden önce SSH’ı engellememe konusunda dikkatli ol:

# SSH'a izin ver (bağlantını kesmemek için önce bunu yap)
sudo ufw allow 22/tcp

# HTTP ve HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# UFW'u etkinleştir
sudo ufw enable

# Durumu kontrol et
sudo ufw status verbose

UFW’u etkinleştirdiğinde kurallar otomatik olarak kalıcı hale gelir ve sistem yeniden başladığında otomatik yüklenir. Bu en büyük avantajı.

UFW ile Uygulama Profilleri

UFW’un güzel özelliklerinden biri uygulama profillerini desteklemesi. Nginx veya Apache kurduğunda bunların profilleri otomatik olarak ekleniyor:

sudo ufw app list
sudo ufw allow 'Nginx Full'
sudo ufw allow 'Apache Full'

UFW’da Gelişmiş Kurallar

UFW basit görünse de karmaşık kuralları da destekliyor:

# Belirli IP aralığına SSH izni
sudo ufw allow from 192.168.1.0/24 to any port 22

# Port aralığına izin ver
sudo ufw allow 8000:8080/tcp

# Belirli bir arayüzden gelen trafiğe izin ver
sudo ufw allow in on eth0 to any port 80

# Kural sil
sudo ufw delete allow 80/tcp

Yöntem 4: nftables ile Modern Yaklaşım

Debian 10 Buster’dan itibaren nftables, iptables’ın yerini almaya başladı. Debian 11 Bullseye ve sonrasında nftables varsayılan olarak geliyor. Eğer yeni bir sistem kuruyorsan nftables’ı tercih etmeni öneririm.

nftables kurulumu ve temel yapılandırma:

sudo apt install nftables
sudo systemctl enable nftables
sudo systemctl start nftables

nftables kural dosyası /etc/nftables.conf içinde tutuluyor ve systemd servisi aracılığıyla otomatik yükleniyor. İşte basit bir web sunucusu yapılandırması:

sudo nano /etc/nftables.conf
#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

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

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

        # ICMP (ping)
        icmp type echo-request accept
        icmpv6 type echo-request accept

        # SSH sadece belirli IP'den
        ip saddr 192.168.1.100 tcp dport 22 accept

        # HTTP ve HTTPS
        tcp dport { 80, 443 } accept

        # Reddedilen paketleri logla
        log prefix "nftables drop: " drop
    }

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

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

Yapılandırmayı test et ve uygula:

sudo nft -c -f /etc/nftables.conf
sudo systemctl restart nftables
sudo nft list ruleset

nftables’ın güzel yanı, kural dosyasını doğrudan düzenleyip servisi yeniden başlatman yeterli. Kurallar otomatik olarak kalıcı.

Kapsamlı Bir Senaryo: Database Sunucusu Güvenliği

Gerçek bir durumu ele alalım. Bir PostgreSQL veritabanı sunucusu kuruyorsun ve şu gereksinimlerin var:

  • SSH sadece yönetim ağından erişilebilsin (10.0.0.0/24)
  • PostgreSQL sadece uygulama sunucularından erişilebilsin (10.0.1.0/24)
  • HTTP/HTTPS kapalı (bu bir veritabanı sunucusu)
  • Monitorlama için ICMP açık
  • Tüm bunlar yeniden başlatmadan sonra da çalışsın
#!/bin/bash
# db-firewall.sh - Veritabani sunucusu firewall kurulumu

# Mevcut kuralları temizle
iptables -F
iptables -X
iptables -Z

# Varsayılan politikalar
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopback
iptables -A INPUT -i lo -j ACCEPT

# Mevcut bağlantılar
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# ICMP (monitoring için)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# SSH - sadece yönetim ağından
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT

# PostgreSQL - sadece uygulama sunucularından
iptables -A INPUT -p tcp --dport 5432 -s 10.0.1.0/24 -j ACCEPT

# Rate limiting - SSH brute force koruması
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP

# Loglama
iptables -A INPUT -j LOG --log-prefix "iptables-drop: " --log-level 4

# Kuralları kaydet
iptables-save > /etc/iptables/rules.v4

echo "Firewall kuralları uygulandı ve kaydedildi."
echo "Mevcut kurallar:"
iptables -L -n -v

Bu scripti çalıştırılabilir yap ve uygula:

sudo chmod +x db-firewall.sh
sudo ./db-firewall.sh

Kuralların Doğrulanması ve Test Edilmesi

Kuralları uyguladıktan sonra çeşitli yöntemlerle test etmelisin.

Kural Listesini Kontrol Etmek

# Detaylı liste
sudo iptables -L -n -v --line-numbers

# Sadece INPUT zinciri
sudo iptables -L INPUT -n -v

# Kural sayılarını sıfırla ve tekrar test et
sudo iptables -Z
# Bir süre bekle, trafik oluştur
sudo iptables -L -n -v

Yeniden Başlatma Sonrası Doğrulama

Kuralların gerçekten kalıcı olduğunu doğrulamak için sistemi yeniden başlatman gerekiyor. Ama bunu yapmadan önce şunları kontrol et:

  • SSH kuralın doğru ve aktif
  • Kendini kilitlemeyeceğinden emin ol
  • Bir backup bağlantı yolu var (console erişimi gibi)
# Yeniden başlatmadan önce kontrol
sudo iptables -L -n | grep "22"

# Yeniden başlat
sudo reboot

# Geri döndükten sonra kontrol
sudo iptables -L -n -v

Log Monitoring

Engellenen paketleri izlemek için:

# Gerçek zamanlı log takibi
sudo tail -f /var/log/syslog | grep "iptables-drop"

# Veya journald ile
sudo journalctl -f | grep "iptables"

Sık Yapılan Hatalar ve Çözümleri

Kendini kilitlemek: En klasik hata. INPUT zincirini DROP yapmadan önce SSH kuralını eklemeyi unutmak. Çözüm: Her zaman önce izin kurallarını ekle, sonra varsayılan politikayı değiştir.

iptables-persistent kurulu değil: Kurallar ekleniyor, kaydedilmiyor zannediliyor. Kontrol et:

dpkg -l | grep iptables-persistent
systemctl status netfilter-persistent

IPv6 kuralları unutulmak: IPv4 kurallarını kaydettin ama IPv6 kurallarını unuttun. Her zaman her ikisini birlikte kaydet:

sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6

Kural sırası: iptables kuralları sırayla işlenir. Eğer genel bir ACCEPT kuralı özel bir DROP kuralından önce geliyorsa DROP hiç çalışmaz. Kurallarını mantıksal sıraya dikkat ederek oluştur.

UFW ve iptables çakışması: UFW kullanırken aynı zamanda doğrudan iptables komutları çalıştırmak beklenmedik sonuçlar doğurabilir. Birini seç ve ona sadık kal.

Yedekleme ve Versiyon Kontrolü

Firewall kurallarını yedeklemek ve versiyonlamak iyi bir pratiktir:

# Tarihli yedek al
sudo iptables-save > /etc/iptables/rules.v4.backup.$(date +%Y%m%d)

# Git ile versiyonlama (önerilir)
cd /etc/iptables
sudo git init
sudo git add .
sudo git commit -m "Initial firewall rules"

Bir değişiklik yapmadan önce:

# Mevcut kuralları yedekle
sudo iptables-save > /tmp/iptables-before-change.rules

# Değişiklikleri yap
# ...

# Sorun olursa geri yükle
sudo iptables-restore < /tmp/iptables-before-change.rules

Sonuç

Debian’da firewall kurallarını kalıcı hale getirmenin birden fazla yolu var ve doğru yöntemi seçmek kullanım senaryona bağlı. Eğer hızlı ve basit bir çözüm istiyorsan UFW en iyi seçenek. Daha fazla kontrol ve esneklik istiyorsan iptables-persistent ile birlikte iptables kullanmak mantıklı. Yeni bir sistem kuruyorsan ve modern bir yaklaşım istiyorsan nftables kesinlikle değerlendirmeye almalısın.

Her yöntemde ortak olan nokta şu: Kuralları uyguladıktan sonra mutlaka kaydet, yeniden başlatma sonrası doğrula ve değişiklik yapmadan önce yedek al. Bu üç alışkanlığı edindiğinde firewall yönetimi seni artık uykusuz bırakmaz.

Son olarak, production sistemlerde değişiklik yapmadan önce test ortamında dene. Kendini sunucudan kilitlemenin en kötü zamanı, önemli bir deployment sırasındadır. Console erişimin yoksa bir kural hatası saatlerce süren bir kesintiye dönüşebilir. Dikkatli ol, yedekle, doğrula.

Yorum yapın