Kuralları Kalıcı Hale Getirme: iptables-save ve iptables-restore

Sistem yöneticiliğinde en sinir bozucu anlardan biri şudur: Saatler harcayarak kurduğun firewall kuralları, sunucu yeniden başladığında uçup gider. iptables’ın doğası gereği kurallar varsayılan olarak bellekte tutulur ve sistem kapanınca kaybolur. İşte bu yüzden iptables-save ve iptables-restore araçları her Linux sysadmin’in araç kutusunda olması gereken temel komutlardır.

Bu yazıda iptables kurallarını kalıcı hale getirmenin tüm yöntemlerini ele alacağız. Sadece komutları ezberlemekle kalmayacak, production ortamında nasıl güvenli bir şekilde uygulayacağını da öğreneceksin.

iptables Kuralları Neden Kaybolur?

iptables, Linux çekirdeğinin Netfilter altyapısı üzerinde çalışır. Eklediğin her kural doğrudan kernel’ın bellek yapısına yazılır. Bu son derece hızlı çalışmasını sağlar ama kalıcılık sağlamaz. Sistemi kapattığında veya yeniden başlattığında kernel belleği sıfırlanır, senin özenle yazdığın tüm kurallar da onunla birlikte gider.

Bu durumu test etmek için basit bir senaryo düşün:

# Bir kural ekle
sudo iptables -A INPUT -p tcp --dport 8080 -j DROP

# Kuralı kontrol et
sudo iptables -L INPUT -n --line-numbers

# Sistemi yeniden başlat ve tekrar kontrol et
# sudo reboot
# sudo iptables -L INPUT -n
# Kural yok!

İşte bu yüzden kurallara kalıcılık kazandırmak için ayrı bir mekanizmaya ihtiyaç duyarız.

iptables-save ile Kuralları Dışa Aktarma

iptables-save komutu, mevcut tüm iptables kurallarını standart çıktıya yazar. Bu çıktıyı bir dosyaya yönlendirerek kurallarını saklayabilirsin.

Temel Kullanım

# Tüm tabloları kaydet
sudo iptables-save

# Bir dosyaya kaydet
sudo iptables-save > /etc/iptables/rules.v4

# Sadece belirli bir tabloyu kaydet (-t parametresi)
sudo iptables-save -t filter > /etc/iptables/filter-rules.v4

# IPv6 kuralları için
sudo ip6tables-save > /etc/iptables/rules.v6

iptables-save çıktısı insan tarafından okunabilir bir formattadır ve şuna benzer:

# Generated by iptables-save v1.8.7 on Mon Nov 13 10:30:00 2023
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -i lo -j ACCEPT
COMMIT
# Completed on Mon Nov 13 10:30:00 2023

Bu formatı anlamak önemli. Her tablo *tablo_adı ile başlar ve COMMIT ile biter. Zincir politikaları :ZİNCİR POLİTİKA [paket_sayısı:byte_sayısı] formatında gösterilir.

iptables-save Parametreleri

  • -t: Belirli bir tabloyu kaydet (filter, nat, mangle, raw)
  • -c: Paket ve byte sayaçlarını da dahil et
  • -f: Çıktıyı doğrudan dosyaya yaz (bazı dağıtımlarda desteklenir)

Sayaçları kaydetmek istediğinde:

# Sayaçlarla birlikte kaydet
sudo iptables-save -c > /etc/iptables/rules-with-counters.v4

iptables-restore ile Kuralları Geri Yükleme

iptables-restore komutu, iptables-save formatındaki bir dosyayı okuyarak kuralları yükler.

# Temel kullanım
sudo iptables-restore < /etc/iptables/rules.v4

# IPv6 için
sudo ip6tables-restore < /etc/iptables/rules.v6

# Sayaçları da geri yükle
sudo iptables-restore -c < /etc/iptables/rules-with-counters.v4

# Mevcut kurallara ekle, silme yapma
sudo iptables-restore --noflush < /etc/iptables/additional-rules.v4

iptables-restore Parametreleri

  • -c: Kayıtlı sayaçları da geri yükle
  • –noflush: Mevcut kuralları silmeden yeni kuralları ekle
  • -v: Ayrıntılı çıktı göster
  • -n: Mevcut kurallara dokunma, sadece yenileri ekle (–noflush ile aynı)
  • -t: Belirli bir tabloyu geri yükle

--noflush parametresine dikkat etmek gerekiyor. Varsayılan davranış, geri yükleme öncesinde tüm kuralları temizlemektir. Eğer mevcut kurallara ek olarak yeni kurallar eklemek istiyorsan --noflush kullanmalısın. Aksi takdirde beklenmedik sonuçlarla karşılaşabilirsin.

Kalıcı Hale Getirme Yöntemleri

Farklı dağıtımlar farklı yaklaşımlar kullanır. İşte en yaygın yöntemler:

Yöntem 1: iptables-persistent (Debian/Ubuntu)

Debian tabanlı sistemlerde en temiz çözüm iptables-persistent paketidir.

# Paketi kur
sudo apt-get install iptables-persistent

# Kurulum sırasında mevcut kuralları kaydetmek isteyip istemediğini sorar
# Evet dersen kurallar otomatik kaydedilir

# Kuralları manuel kaydetmek için
sudo netfilter-persistent save

# Kayıtlı kuralların nerede durduğunu görmek için
ls -la /etc/iptables/
# rules.v4 ve rules.v6 dosyalarını göreceksin

Kural değişikliği yaptıktan sonra kaydetmek:

# Yeni kural ekle
sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT

# Kaydet
sudo netfilter-persistent save

# Veya doğrudan
sudo iptables-save > /etc/iptables/rules.v4

Yöntem 2: Systemd Service (Evrensel Yöntem)

Dağıtımdan bağımsız bir çözüm istiyorsan systemd servis dosyası oluşturabilirsin. Bu yöntem hem Debian hem de RHEL tabanlı sistemlerde çalışır.

# Önce kuralları kaydet
sudo mkdir -p /etc/iptables
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6

# Systemd servis dosyası oluştur
sudo nano /etc/systemd/system/iptables-restore.service

Servis dosyasının içeriği:

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

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

[Install]
WantedBy=multi-user.target

Servisi etkinleştir:

# Servisi etkinleştir ve başlat
sudo systemctl daemon-reload
sudo systemctl enable iptables-restore
sudo systemctl start iptables-restore

# Durumu kontrol et
sudo systemctl status iptables-restore

Yöntem 3: RHEL/CentOS/Rocky Linux

Red Hat tabanlı sistemlerde iptables-services paketi kullanılır:

# Paketi kur
sudo yum install iptables-services
# veya Rocky/AlmaLinux için
sudo dnf install iptables-services

# Servisi etkinleştir
sudo systemctl enable iptables
sudo systemctl start iptables

# Kuralları kaydet
sudo service iptables save
# veya
sudo /usr/libexec/iptables/iptables.init save

# Kayıt dosyasının yeri
cat /etc/sysconfig/iptables

Gerçek Dünya Senaryosu: Web Sunucusu Güvenlik Kuralları

Bir production web sunucusu için firewall kuralları oluşturup kalıcı hale getirelim.

#!/bin/bash
# web-firewall.sh - Production web sunucusu için firewall kuralları

# Mevcut kuralları temizle
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

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

# Loopback trafiğine izin ver
iptables -A INPUT -i lo -j ACCEPT

# Kurulu bağlantılara izin ver
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

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

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

# Ping'e izin ver (rate limiting ile)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# Kaydet
iptables-save > /etc/iptables/rules.v4

echo "Firewall kuralları uygulandı ve kaydedildi."

Bu scripti çalıştırdıktan sonra kuralların kaydedilip kaydedilmediğini doğrula:

# Scripti çalıştır
sudo bash web-firewall.sh

# Kuralları listele
sudo iptables -L -n -v

# Kaydedilen dosyayı kontrol et
sudo cat /etc/iptables/rules.v4

Güvenli Kural Değişikliği: Kendin Kilitleme Sorunu

Production ortamında iptables kuralı değiştirirken en büyük tehlike SSH bağlantısını kesmektir. Bunu önlemek için bir güvenlik ağı oluşturalım:

#!/bin/bash
# safe-iptables-update.sh
# Yeni kuralları test et, sorun çıkarsa otomatik geri al

RULES_FILE="/etc/iptables/rules.v4"
BACKUP_FILE="/etc/iptables/rules.v4.backup"
TIMEOUT=30

# Mevcut kuralları yedekle
echo "Mevcut kurallar yedekleniyor..."
iptables-save > "$BACKUP_FILE"

# Yeni kuralları uygula
echo "Yeni kurallar uygulanıyor..."
iptables-restore < "$RULES_FILE.new"

echo "Kurallar uygulandı. $TIMEOUT saniye içinde onaylamazsanız geri alınacak."
echo "Onaylamak için: touch /tmp/iptables-ok"

# Onay bekleme döngüsü
for i in $(seq 1 $TIMEOUT); do
    if [ -f /tmp/iptables-ok ]; then
        echo "Kurallar onaylandı, kaydediliyor..."
        iptables-save > "$RULES_FILE"
        rm -f /tmp/iptables-ok
        exit 0
    fi
    sleep 1
done

# Zaman aşımı - geri al
echo "Zaman aşımı! Eski kurallar geri yükleniyor..."
iptables-restore < "$BACKUP_FILE"
echo "Geri alma tamamlandı."

Bu yaklaşım production ortamında çok değerlidir. 30 saniye içinde /tmp/iptables-ok dosyasını oluşturmazsanız eski kurallar otomatik geri yüklenir. SSH bağlantısı kesilirse bile bir sonraki terminal oturumunda çalışmaya devam edebilirsin.

Kural Dosyasını Versiyon Kontrolüne Alma

Sysadmin olarak kural değişikliklerini takip etmek hem güvenlik hem de sorun giderme açısından kritiktir. Git kullanarak bunu kolayca yapabilirsin:

# Iptables konfigürasyonları için git repo oluştur
mkdir -p /etc/iptables
cd /etc/iptables
git init

# İlk kayıt
iptables-save > rules.v4
git add rules.v4
git commit -m "Initial firewall rules - $(hostname) - $(date +%Y%m%d)"

# Değişiklik yaptıktan sonra
iptables-save > rules.v4
git diff rules.v4  # Ne değişti?
git add rules.v4
git commit -m "Added MySQL access from app servers - ticket #1234"

# Geçmişe bak
git log --oneline

# Eski versiyona dön
git checkout HEAD~1 -- rules.v4
iptables-restore < rules.v4

Bu alışkanlık zamanla sana çok şey kazandırır. Hangi kural ne zaman ve neden eklendi, sorusu başka bir sysadmin’in sorununu çözerken veya audit sırasında inanılmaz işe yarar.

Troubleshooting: Sık Karşılaşılan Sorunlar

Sorun 1: Kurallar Hala Kayboluyorsa

# Hangi servisin kuralları yüklediğini kontrol et
systemctl list-units | grep -i iptables

# Servis boot'ta aktif mi?
systemctl is-enabled iptables-restore

# Servisi yeniden etkinleştir
sudo systemctl enable iptables-restore
sudo systemctl enable netfilter-persistent  # Debian için

Sorun 2: Kural Dosyası Bozuksa

# Sözdizimi kontrolü (dry-run ile test et)
sudo iptables-restore --test < /etc/iptables/rules.v4

# Çıktıda hata yoksa uygula
echo $?  # 0 ise başarılı

Sorun 3: Farklı Tablolar Arasında Çakışma

# Her tabloyu ayrı ayrı kaydet ve geri yükle
sudo iptables-save -t filter > /etc/iptables/filter.rules
sudo iptables-save -t nat > /etc/iptables/nat.rules
sudo iptables-save -t mangle > /etc/iptables/mangle.rules

# Geri yüklerken de aynı şekilde
sudo iptables-restore -t filter < /etc/iptables/filter.rules

Otomasyon: Cron ile Otomatik Yedekleme

Kuralların günlük yedeğini almak iyi bir pratiktir:

# Crontab düzenle
sudo crontab -e

# Her gün gece 2'de yedek al, 30 güne kadar sakla
0 2 * * * /usr/sbin/iptables-save > /etc/iptables/backups/rules-$(date +%Y%m%d).v4 && find /etc/iptables/backups/ -name "*.v4" -mtime +30 -delete

Yedek dizinini oluşturmayı unutma:

sudo mkdir -p /etc/iptables/backups

Farklı Ortamlar Arasında Kural Taşıma

Aynı kuralları birden fazla sunucuya uygulamak gerektiğinde:

#!/bin/bash
# deploy-firewall.sh - Kuralları birden fazla sunucuya dağıt

SERVERS=("web1.example.com" "web2.example.com" "web3.example.com")
RULES_FILE="/etc/iptables/rules.v4"
REMOTE_USER="sysadmin"

for SERVER in "${SERVERS[@]}"; do
    echo "==> $SERVER sunucusuna kurallar gönderiliyor..."
    
    # Kuralları gönder
    scp "$RULES_FILE" "${REMOTE_USER}@${SERVER}:/tmp/new-rules.v4"
    
    # Uzaktan uygula
    ssh "${REMOTE_USER}@${SERVER}" "sudo iptables-restore < /tmp/new-rules.v4 && sudo iptables-save > /etc/iptables/rules.v4 && rm /tmp/new-rules.v4"
    
    if [ $? -eq 0 ]; then
        echo "==> $SERVER: BASARILI"
    else
        echo "==> $SERVER: HATA - kontrol et!"
    fi
done

Bu scripti Ansible veya benzeri bir araçla da yapabilirsin ama bazen basit bash yeterlidir.

nftables ile İlişki

Modern Linux dağıtımlarında nftables giderek iptablesın yerini almaktadır. Ancak çoğu sistemde iptables komutları aslında nftables üzerine compat katmanı üzerinden çalışır. Bunu kontrol etmek için:

# iptables'ın hangi backend'i kullandığını kontrol et
sudo iptables --version
# "nf_tables" görüyorsan compat katmanı kullanıyorsun demektir

# nftables kurallarını kaydetmek için
sudo nft list ruleset > /etc/nftables.conf

# Geri yüklemek için
sudo nft -f /etc/nftables.conf

Eğer sisteminizde her ikisi de varsa, hangisini kullandığını bilmek ve tutarlı kalmak önemlidir. Karışık kullanım ciddi sorunlara yol açabilir.

Sonuç

iptables-save ve iptables-restore ikilisi, firewall yönetiminin temel taşlarıdır. Kuralları bellekte tutmak yerine dosyaya kaydetmek ve sistem başlangıcında otomatik yüklemek, production ortamında güvenliğin sürdürülebilirliği için zorunludur.

Özetlemek gerekirse:

  • Her kural değişikliğinin hemen ardından iptables-save çalıştır
  • Sistemin hangi dağıtımda olduğuna göre uygun yöntemi seç (iptables-persistent, iptables-services veya systemd servisi)
  • Production’da değişiklik yapmadan önce mutlaka yedek al
  • Kural dosyalarını git ile versiyon kontolüne al
  • --test parametresiyle sözdizim hatalarını önceden yakala

Güvenlik duvarı kuralları, ne kadar iyi yazılırsa yazılsın, yeniden başlatmada kayboluyorsa hiçbir işe yaramaz. Bu basit ama kritik adımı atlamak, saatlik bakım sırasında veya beklenmedik bir reboot’tan sonra sistemi savunmasız bırakabilir.

Yorum yapın