UFW Kural Yedekleme ve Taşıma

Sunucu taşıma zamanı geldiğinde ya da yeni bir makineyi hızlıca devreye almak istediğinizde, UFW kurallarınızı tek tek yeniden yazmak hem zaman kaybı hem de hata riski demek. Üstelik production ortamında yanlış bir kural seti uygulamak, servisinizi tamamen erişilemez hale getirebilir. Bu yüzden UFW kural yedekleme ve taşıma konusunu ciddiye almak, bir sysadmin’in temel rutinlerinden biri olmalı.

UFW Nasıl Çalışır, Kurallar Nerede Saklanır?

UFW (Uncomplicated Firewall), arka planda iptables veya nftables kullanır ama bu karmaşıklığı bizden soyutlar. Kurallarınız disk üzerinde birkaç farklı dosyada tutulur ve bu dosyaları anlamak, yedekleme sürecinin temelini oluşturur.

UFW’nin kural dosyaları şu dizinde bulunur:

ls -la /etc/ufw/

Bu komutun çıktısında göreceğiniz önemli dosyalar şunlardır:

  • /etc/ufw/user.rules: IPv4 için tanımladığınız kullanıcı kuralları
  • /etc/ufw/user6.rules: IPv6 için kullanıcı kuralları
  • /etc/ufw/before.rules: UFW işlemeden önce uygulanan kurallar
  • /etc/ufw/after.rules: UFW işledikten sonra uygulanan kurallar
  • /etc/ufw/before6.rules: IPv6 için before kuralları
  • /etc/ufw/after6.rules: IPv6 için after kuralları
  • /etc/ufw/ufw.conf: UFW’nin temel yapılandırma dosyası
  • /etc/ufw/sysctl.conf: Kernel ağ parametreleri

ufw allow 22/tcp gibi bir komut çalıştırdığınızda, aslında bu dosyalara satır eklenir. Dolayısıyla yedekleme işlemi temelde bu dosyaları kopyalamaktan ibaredir; ama bunu doğru yapmak önemli.

Manuel Yedekleme Yöntemi

En basit ve güvenilir yöntem, ilgili dizini doğrudan yedeklemektir. Ancak bu işlemi yaparken dikkat etmeniz gereken nokta, yedek alırken UFW’nin durumunu not etmektir.

# Mevcut UFW durumunu ve kuralları kaydet
ufw status verbose > /root/ufw-backup/ufw-status-$(date +%Y%m%d).txt

# Kural dosyalarını yedekle
mkdir -p /root/ufw-backup/$(date +%Y%m%d)
cp -r /etc/ufw/ /root/ufw-backup/$(date +%Y%m%d)/

Bu komutlarla hem kuralların insan tarafından okunabilir bir çıktısını hem de ham dosya yedeklerini alıyorsunuz. İkisini birlikte tutmak iyi bir alışkanlık çünkü ham dosyalar geri yükleme için, okunabilir çıktı ise “ne yedeklemiştim” sorusunu yanıtlamak için kullanışlı.

Yedek dizininin içeriğini kontrol edelim:

ls -la /root/ufw-backup/$(date +%Y%m%d)/ufw/

Çıktıda tüm kural dosyalarını görmeniz gerekiyor. Eğer özelleştirilmiş before.rules veya after.rules dosyalarınız varsa, bunlar da bu yedekte olacak.

Otomatik Yedekleme Script’i

Manuel yedekleme işe yarasa da, bunu bir cron job ile otomatikleştirmek çok daha akıllıca. Aşağıdaki script hem yedek alır hem de eski yedekleri temizler:

#!/bin/bash
# /usr/local/bin/ufw-backup.sh

BACKUP_DIR="/var/backups/ufw"
DATE=$(date +%Y%m%d_%H%M%S)
HOSTNAME=$(hostname)
BACKUP_PATH="${BACKUP_DIR}/${HOSTNAME}_${DATE}"
RETENTION_DAYS=30
LOG_FILE="/var/log/ufw-backup.log"

# Yedek dizinini oluştur
mkdir -p "${BACKUP_PATH}"

# UFW durumunu kaydet
if ufw status verbose > "${BACKUP_PATH}/ufw-status.txt" 2>&1; then
    echo "[${DATE}] UFW durumu kaydedildi." >> "${LOG_FILE}"
else
    echo "[${DATE}] HATA: UFW durumu kaydedilemedi." >> "${LOG_FILE}"
    exit 1
fi

# Kural dosyalarını kopyala
if cp -r /etc/ufw/ "${BACKUP_PATH}/ufw-config/"; then
    echo "[${DATE}] UFW kural dosyaları yedeklendi: ${BACKUP_PATH}" >> "${LOG_FILE}"
else
    echo "[${DATE}] HATA: Kural dosyaları kopyalanamadı." >> "${LOG_FILE}"
    exit 1
fi

# Yedekleri sıkıştır
tar -czf "${BACKUP_DIR}/${HOSTNAME}_${DATE}.tar.gz" -C "${BACKUP_DIR}" "${HOSTNAME}_${DATE}/"
rm -rf "${BACKUP_PATH}"

echo "[${DATE}] Yedek arşivlendi: ${HOSTNAME}_${DATE}.tar.gz" >> "${LOG_FILE}"

# Eski yedekleri temizle
find "${BACKUP_DIR}" -name "*.tar.gz" -mtime +${RETENTION_DAYS} -delete
echo "[${DATE}] ${RETENTION_DAYS} günden eski yedekler temizlendi." >> "${LOG_FILE}"

Script’i çalıştırılabilir yapın ve cron’a ekleyin:

chmod +x /usr/local/bin/ufw-backup.sh

# Crontab'a ekle - Her gece saat 02:00'de çalışsın
echo "0 2 * * * root /usr/local/bin/ufw-backup.sh" > /etc/cron.d/ufw-backup

Bu script sayesinde her gece otomatik yedek alınır ve 30 günden eski yedekler silinir. Log dosyasını izleyerek yedeklerin düzgün alınıp alınmadığını kontrol edebilirsiniz.

Kuralları Başka Sunucuya Taşıma

Diyelim ki yeni bir VPS aldınız veya sunucuyu migrate ediyorsunuz. Eski sunucudaki UFW kurallarını yeni sunucuya taşımak istiyorsunuz. Bu işlem birkaç adımdan oluşur.

Dikkat: Kuralları körü körüne kopyalamadan önce iki sunucunun ağ arayüz isimlerinin ve IP adreslerinin farklı olup olmadığını kontrol edin. Bazı UFW kuralları belirli interface isimlerine veya IP adreslerine bağlı olabilir.

Adım 1: Kaynak Sunucudan Yedek Al

# Kaynak sunucuda
BACKUP_FILE="ufw-rules-$(hostname)-$(date +%Y%m%d).tar.gz"
tar -czf /tmp/${BACKUP_FILE} /etc/ufw/
echo "Yedek hazır: /tmp/${BACKUP_FILE}"

Adım 2: Yeni Sunucuya Aktar

# Yerel makinenizden veya kaynak sunucudan
scp /tmp/ufw-rules-*.tar.gz root@yeni-sunucu-ip:/tmp/

# Ya da rsync ile (büyük dosyalar için daha güvenilir)
rsync -avz /tmp/ufw-rules-*.tar.gz root@yeni-sunucu-ip:/tmp/

Adım 3: Yeni Sunucuda Uygula

# Yeni sunucuda
# Önce mevcut UFW durumunu not al
ufw status verbose

# Yeni sunucuda UFW'yi kur (yoksa)
apt-get install -y ufw

# Mevcut konfigürasyonu yedekle (iyi alışkanlık)
cp -r /etc/ufw/ /etc/ufw.original_backup/

# Yedek dosyasını çıkart ve kopyala
cd /tmp
tar -xzf ufw-rules-*.tar.gz
cp -r etc/ufw/* /etc/ufw/

# UFW'yi yeniden yükle
ufw disable
ufw enable
ufw status verbose

Kural Çakışmalarını Kontrol Etme

Yeni sunucuya kuralları taşıdıktan sonra, özellikle IP adresine özel kurallar varsa bunları gözden geçirmeniz gerekebilir:

# Mevcut kuralları listele ve IP adreslerini ara
grep -E "([0-9]{1,3}.){3}[0-9]{1,3}" /etc/ufw/user.rules

# Interface'e özel kuralları kontrol et
grep -E "eth|ens|eno|enp" /etc/ufw/user.rules

# Yeni sunucunun network interface isimlerini öğren
ip link show

Eğer eski sunucunuzda eth0 varken yeni sunucuda ens3 varsa, kural dosyalarında bunu güncellemeniz gerekir. Bunu sed ile kolayca yapabilirsiniz:

# Interface isimlerini güncelle
sed -i 's/eth0/ens3/g' /etc/ufw/user.rules
sed -i 's/eth0/ens3/g' /etc/ufw/before.rules

# Değişiklikleri uygula
ufw disable && ufw enable

Gerçek Dünya Senaryosu: Web Sunucusu Migrasyonu

Bir müşterinin web sunucusunu taşırken yaşadığım bir durumu anlatayım. Eski sunucuda oldukça karmaşık bir UFW yapısı vardı: SSH sadece belirli IP’lerden, HTTP/HTTPS herkese açık, bazı özel portlar ise sadece iç ağdan erişilebiliyordu.

Önce eski sunucudaki kuralları export ettim:

# Eski sunucuda - Kapsamlı export script
#!/bin/bash
EXPORT_DIR="/tmp/ufw-export-$(date +%Y%m%d)"
mkdir -p ${EXPORT_DIR}

# UFW tam durum çıktısı
ufw status numbered > ${EXPORT_DIR}/ufw-numbered-rules.txt
ufw status verbose > ${EXPORT_DIR}/ufw-verbose-rules.txt

# Ham kural dosyaları
cp /etc/ufw/user.rules ${EXPORT_DIR}/
cp /etc/ufw/user6.rules ${EXPORT_DIR}/
cp /etc/ufw/before.rules ${EXPORT_DIR}/
cp /etc/ufw/after.rules ${EXPORT_DIR}/
cp /etc/ufw/ufw.conf ${EXPORT_DIR}/

# Sistem bilgileri (karşılaştırma için)
ip addr show > ${EXPORT_DIR}/network-interfaces.txt
ip route show > ${EXPORT_DIR}/routing-table.txt
uname -a > ${EXPORT_DIR}/system-info.txt

# Sıkıştır
tar -czf /tmp/ufw-full-export.tar.gz -C /tmp $(basename ${EXPORT_DIR})
echo "Export tamamlandı: /tmp/ufw-full-export.tar.gz"

Bu yaklaşım sayesinde sadece kural dosyalarını değil, eski sunucunun ağ yapısını da yeni sunucuyla karşılaştırma imkanım oldu. Migrasyon çok daha sorunsuz geçti.

UFW Kurallarını İnsan Okunabilir Formatta Export Etme

Bazen ham dosyaları taşımak yerine, UFW komutlarını yeniden oluşturabilecek bir script elde etmek istersiniz. Bu yaklaşım daha taşınabilir ve anlaşılırdır:

#!/bin/bash
# ufw-export-commands.sh
# UFW kurallarını tekrar çalıştırılabilir komutlar olarak export eder

OUTPUT_FILE="/tmp/ufw-restore-commands-$(date +%Y%m%d).sh"

echo "#!/bin/bash" > ${OUTPUT_FILE}
echo "# UFW Kural Geri Yükleme Scripti" >> ${OUTPUT_FILE}
echo "# Oluşturulma: $(date)" >> ${OUTPUT_FILE}
echo "# Kaynak: $(hostname)" >> ${OUTPUT_FILE}
echo "" >> ${OUTPUT_FILE}
echo "ufw reset" >> ${OUTPUT_FILE}
echo "" >> ${OUTPUT_FILE}

# Varsayılan politikaları al
ufw status verbose | grep "Default:" | while read line; do
    echo "# ${line}" >> ${OUTPUT_FILE}
done

# Aktif kuralları parse et ve UFW komutlarına dönüştür
echo "" >> ${OUTPUT_FILE}
echo "# Gelen trafik varsayılanı" >> ${OUTPUT_FILE}
echo "ufw default deny incoming" >> ${OUTPUT_FILE}
echo "ufw default allow outgoing" >> ${OUTPUT_FILE}
echo "" >> ${OUTPUT_FILE}
echo "# Kullanıcı kuralları" >> ${OUTPUT_FILE}

# user.rules dosyasından kuralları çek
grep -E "^-A ufw-user-input" /etc/ufw/user.rules | while read rule; do
    echo "# iptables: ${rule}" >> ${OUTPUT_FILE}
done

echo "" >> ${OUTPUT_FILE}
echo "ufw enable" >> ${OUTPUT_FILE}
echo "ufw status verbose" >> ${OUTPUT_FILE}

chmod +x ${OUTPUT_FILE}
echo "Export tamamlandı: ${OUTPUT_FILE}"
cat ${OUTPUT_FILE}

Bu script mükemmel olmayabilir (UFW’nin iç syntax’ı karmaşık olabiliyor) ama başlangıç noktası olarak işe yarıyor. Export edilen dosyayı mutlaka gözden geçirip test ortamında denemenizi öneririm.

Ansible ile UFW Kuralları Yönetimi

Birden fazla sunucu yönetiyorsanız, UFW kurallarını Ansible ile merkezi olarak yönetmek çok daha mantıklı. Bu sayede kural değişikliği yaptığınızda tüm sunuculara otomatik uygulanır ve yedekleme sorunu da büyük ölçüde ortadan kalkar.

Basit bir Ansible task örneği:

# ufw-rules.yml
---
- name: UFW Kural Yönetimi
  hosts: webservers
  become: yes
  tasks:
    - name: UFW'yi kur
      apt:
        name: ufw
        state: present

    - name: Varsayılan gelen trafiği engelle
      ufw:
        default: deny
        direction: incoming

    - name: SSH'a izin ver
      ufw:
        rule: allow
        port: '22'
        proto: tcp

    - name: HTTP'e izin ver
      ufw:
        rule: allow
        port: '80'
        proto: tcp

    - name: HTTPS'e izin ver
      ufw:
        rule: allow
        port: '443'
        proto: tcp

    - name: UFW'yi etkinleştir
      ufw:
        state: enabled

    - name: UFW kurallarını yedekle
      archive:
        path: /etc/ufw/
        dest: "/var/backups/ufw-{{ ansible_date_time.date }}.tar.gz"
        format: gz

Ansible kullanmıyorsanız bile bu YAML dosyası, hangi kuralların hangi sunucularda bulunması gerektiğini dokümante etmek için mükemmel bir yöntem.

Yedekten Geri Yükleme ve Test

Yedek aldınız, taşıdınız, uyguladınız. Ama işin en kritik adımı test etmek. UFW kurallarını geri yükledikten sonra şunları mutlaka kontrol edin:

# UFW durumunu kontrol et
ufw status verbose

# Açık portları kontrol et
ss -tlnp
netstat -tlnp

# Dışarıdan port kontrolü (başka bir makineden)
nmap -p 22,80,443 sunucu-ip-adresi

# UFW log'larını izle
tail -f /var/log/ufw.log

# Belirli bir IP'den bağlantı testleri
# (Başka bir sunucu veya kendi bilgisayarınızdan)
ssh -v kullanici@sunucu-ip
curl -v http://sunucu-ip

Kritik uyarı: Uzak sunucuda UFW kurallarını değiştirirken her zaman mevcut SSH oturumunuzu açık tutun. Yeni bir terminal sekmesinde bağlantı testini yapın. Yanlış bir kural uyguladıysanız ve SSH erişiminizi kaybettiyseniz, sunucunun konsoluna erişmeniz gerekecek.

Bunu önlemek için şu yöntemi kullanabilirsiniz:

# UFW kurallarını uygula ve 60 saniye sonra otomatik disable et
# Bu süre içinde test edip onaylayabilirsiniz
ufw disable && sleep 60 && ufw enable &

# Test işlemlerinizi yapın
# Sorun yoksa background job'ı iptal edin
kill %1
ufw enable

Düzenli Yedekleme Rutinine Eklemek

UFW yedeklerini sisteminizin genel yedekleme stratejisine entegre etmeyi unutmayın. /etc/ufw/ dizini rsync veya borgbackup ile alınan sistem yedeklerinde zaten kapsanıyor olabilir. Ama bunu doğrulamak önemli:

# Mevcut backup scriptinizin UFW'yi kapsayıp kapsamadığını kontrol et
grep -r "ufw" /etc/cron* /etc/cron.d/ /var/spool/cron/ 2>/dev/null

# rsync tabanlı bir yedekleme varsa
rsync --dry-run -avz /etc/ufw/ backup-server:/backups/$(hostname)/ufw/

Düzenli aralıklarla yedeklerinizi test etmeyi de alışkanlık haline getirin. Alınan ama geri yüklenemeyen yedeklerin hiçbir değeri yoktur. Ayda bir, test ortamınızda yedekten geri yükleme yaparak her şeyin yolunda olduğunu doğrulayın.

Yaygın Hatalar ve Çözümleri

Kural taşıma sürecinde en sık karşılaşılan sorunlara değinelim:

  • UFW disable durumunda kopyalama: Kural dosyaları kopyalanır ama ufw enable sonrası beklenmedik davranışlar görülebilir. Her zaman ufw status verbose ile durumu doğrulayın.
  • Farklı Ubuntu/Debian sürümleri arası taşıma: UFW’nin farklı sürümleri arasında kural dosyası formatı değişebilir. Eski bir sistemden yeni bir sisteme taşırken özellikle dikkatli olun.
  • IPv6 kurallarını atlamak: user.rules kopyalandı ama user6.rules unutuldu. IPv6 aktifse mutlaka her iki dosyayı da taşıyın.
  • Ufw.conf ayarlarını gözden kaçırmak: DEFAULT_INPUT_POLICY, DEFAULT_OUTPUT_POLICY gibi ayarlar bu dosyada tutuluyor. Sadece kural dosyalarını taşıyıp bu dosyayı atlarsanız davranış farklı olabilir.
  • Dosya izinleri: UFW kural dosyaları kök yetkisiyle çalışır. Kopyalama sonrası izinlerin değişip değişmediğini kontrol edin:
# UFW dosya izinlerini kontrol et ve gerekirse düzelt
ls -la /etc/ufw/
chmod 640 /etc/ufw/user.rules /etc/ufw/user6.rules
chown root:root /etc/ufw/user.rules /etc/ufw/user6.rules

Sonuç

UFW kural yedekleme ve taşıma, göründüğünden çok daha önemli bir konudur. Doğru yapıldığında hem zaman kazandırır hem de kritik anlarda sizi kurtarır. Temel prensipler şöyle özetlenebilir: kural dosyalarının tam olarak nerede durduğunu bilin, otomatik yedekleme scriptlerini devreye alın, taşıma öncesi ağ arayüzü isimlerini ve IP farklılıklarını kontrol edin, yedekten geri yüklemeyi her zaman test ortamında deneyin.

Bir sysadmin olarak deneyimlediğim en stresli durumların büyük çoğunluğu, “backup vardı ama geri yüklemedik” veya “backup almıştık ama test etmemiştik” cümlelerine dayanır. UFW gibi kritik güvenlik bileşenleri için bu risk kabul edilemez. Otomatik yedekleme scriptini çalıştırın, cron job’ı aktive edin, ayda bir test edin. Bu kadar basit ama bu kadar önemli.

Yorum yapın