Uzak Sunucu Yedekleme: Bacula ile Ağ Yapılandırması

Bacula ile çalışmaya başladığınızda ilk etapta işler oldukça basit görünür: bir director, bir storage daemon, birkaç file daemon. Ama işin ağ tarafına geçince, yani farklı ağ segmentlerinde onlarca sunucuyu yedeklemeye çalışınca, herşey karmaşıklaşmaya başlar. Bu yazıda gerçek dünya senaryoları üzerinden Bacula’nın ağ yapılandırmasını en ince ayrıntısına kadar ele alacağız.

Bacula Ağ Mimarisini Anlamak

Bacula üç ana bileşenden oluşur ve bu bileşenler birbirleriyle TCP üzerinden haberleşir. Bacula Director (port 9101), tüm operasyonları yöneten beyindir. Storage Daemon (port 9103), fiziksel yedekleme medyasını yönetir. File Daemon (port 9102) ise yedeklenecek sunucularda çalışır ve Director’ın komutlarını bekler.

Burada kritik bir nokta var: Director, File Daemon’a “şimdi yedekle” komutunu verir, ancak veriyi doğrudan File Daemon Storage Daemon’a gönderir. Yani ağ trafiği Director üzerinden geçmez, bu mimariyi anlamadan firewall kurallarını doğru yazamazsınız.

Director (9101) <---> File Daemon (9102)
File Daemon (9102) <---> Storage Daemon (9103)
Director (9101) <---> Storage Daemon (9103)

Ağ Gereksinimleri ve Port Planlaması

Çok lokasyonlu bir ortamda çalışıyorsanız, önce şunu netleştirin: hangi sunucu hangi ağda, aralarında NAT var mı, VPN kullanılıyor mu? Bu soruların cevabı yapılandırmanızı tamamen değiştirir.

Tipik bir kurumsal senaryoda şu portların açık olması gerekir:

  • 9101/TCP: Director’a gelen bağlantılar için (bconsole ve diğer bileşenlerden)
  • 9102/TCP: File Daemon portları (Director bu porta bağlanır)
  • 9103/TCP: Storage Daemon portu (Director ve File Daemon bu porta bağlanır)

Director Sunucusunda Ağ Yapılandırması

Director’ın ana konfigurasyon dosyası /etc/bacula/bacula-dir.conf‘tur. Temel Director tanımından başlayalım:

# /etc/bacula/bacula-dir.conf

Director {
  Name = backup-director
  DIRport = 9101
  QueryFile = "/etc/bacula/query.sql"
  WorkingDirectory = "/var/lib/bacula"
  PidDirectory = "/run/bacula"
  Maximum Concurrent Jobs = 20
  Password = "Gizli_Director_Parolasi_Buraya"
  Messages = Daemon
  # Sadece belirli IP'den bağlantı kabul et
  DirAddress = 192.168.10.5
}

DirAddress parametresini mutlaka set edin. Eğer 0.0.0.0 bırakırsanız tüm interface’lerde dinler, bu güvenlik açısından istenmeyen bir durum olabilir.

Uzak File Daemon Tanımları

Her yedeklenecek sunucu için ayrı bir Client tanımı yapmanız gerekiyor. Burada dikkat edilmesi gereken nokta, Director’ın File Daemon’a adres olarak ne kullandığıdır:

# Aynı ağdaki bir sunucu için
Client {
  Name = webserver01-fd
  Address = 192.168.10.101
  FDPort = 9102
  Catalog = MyCatalog
  Password = "webserver01_ozel_parolasi"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}

# Farklı ağ segmentindeki sunucu (DMZ)
Client {
  Name = dmz-appserver-fd
  Address = 10.50.1.15
  FDPort = 9102
  Catalog = MyCatalog
  Password = "dmzapp_ozel_parolasi"
  File Retention = 60 days
  Job Retention = 12 months
  AutoPrune = yes
}

# VPN üzerinden erişilen uzak ofis sunucusu
Client {
  Name = izmir-fileserver-fd
  Address = 172.16.5.20
  FDPort = 9102
  Catalog = MyCatalog
  Password = "izmir_ozel_parolasi"
  File Retention = 45 days
  Job Retention = 9 months
  AutoPrune = yes
}

Her Client için benzersiz ve güçlü parola kullanmak şart. Parolalar SHA1 ile hash’lenmez, plaintext tutulur bu yüzden dosya izinleri kritik önem taşır.

File Daemon Yapılandırması

File Daemon’ın çalıştığı her sunucuda /etc/bacula/bacula-fd.conf dosyasını düzenlemeniz gerekiyor. En önemli kısım Director tanımı; yani hangi Director’ın bu daemon’a bağlanmasına izin verileceği:

# /etc/bacula/bacula-fd.conf - uzak sunucularda bu dosyayı düzenleyin

FileDaemon {
  Name = webserver01-fd
  FDport = 9102
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Maximum Concurrent Jobs = 5
  # Hangi interface'de dinleyeceğini belirt
  FDAddress = 0.0.0.0
}

# Bu Director'ın bağlanmasına izin ver
Director {
  Name = backup-director
  Password = "webserver01_ozel_parolasi"
  # Monitor = no (yedekleme yetkisi)
}

# bconsole ile izleme için ayrı izin (opsiyonel)
Director {
  Name = backup-director-mon
  Password = "monitor_parolasi"
  Monitor = yes
}

Messages {
  Name = Standard
  director = backup-director = all, !skipped, !restored
}

Çok Interface’li Sunucularda FDAddress Kullanımı

Birden fazla ağ kartına sahip sunucularda, File Daemon’ın sadece backup ağından gelen bağlantıları kabul etmesini isteyebilirsiniz. Bu hem güvenlik hem de trafik yönetimi açısından önemlidir:

FileDaemon {
  Name = dbserver-fd
  FDport = 9102
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Maximum Concurrent Jobs = 3
  # Sadece backup VLAN'ındaki IP'den dinle
  FDAddress = 192.168.100.25
}

Bu sayede production trafiğiniz backup trafiğiyle karışmaz ve veritabanı sunucunuzun production interface’i gereksiz yük almaz.

Storage Daemon Ağ Yapılandırması

Storage Daemon genellikle Director ile aynı sunucuda veya ayrı bir NAS/tape sunucusunda çalışır. Uzak bir storage sunucusu kullandığınızda dikkat edilmesi gereken bazı özel durumlar var:

# /etc/bacula/bacula-sd.conf

Storage {
  Name = storage-server
  SDPort = 9103
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Maximum Concurrent Jobs = 20
  SDAddress = 192.168.10.10
}

Director {
  Name = backup-director
  Password = "storage_director_parolasi"
}

Autochanger {
  Name = FileChanger
  Device = FileStorage
  Changer Command = ""
  Changer Device = /dev/null
}

Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /mnt/backup-disk
  LabelMedia = yes
  Random Access = Yes
  AutomaticMount = yes
  RemovableMedia = no
  AlwaysOpen = no
  Maximum Concurrent Jobs = 5
}

Uzak Storage Daemon’ı Director’a Tanıtmak

Director tarafında Storage tanımında Address parametresi kritik öneme sahip. File Daemon, veriyi Storage Daemon’a gönderirken bu adresi kullanır:

# bacula-dir.conf içinde Storage tanımı

Storage {
  Name = RemoteStorage
  Address = 192.168.10.10
  SDPort = 9103
  Password = "storage_director_parolasi"
  Device = FileStorage
  Media Type = File
  Maximum Concurrent Jobs = 10
}

Firewall Kuralları

Firewall yapılandırması Bacula’da en çok sorun yaşanan konudur. Çoğu zaman “bağlanamıyor” şikayetleri aslında eksik firewall kurallarından kaynaklanır. Tipik bir kurulum için iptables kuralları:

#!/bin/bash
# Director sunucusunda çalıştırılacak kurallar

# Director'a gelen bağlantılar (bconsole ve diğer director'lardan)
iptables -A INPUT -p tcp --dport 9101 -s 192.168.10.0/24 -j ACCEPT

# Storage Daemon'a gelen bağlantılar
# Director ve File Daemon'lardan gelebilir
iptables -A INPUT -p tcp --dport 9103 -s 192.168.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 9103 -s 10.50.0.0/16 -j ACCEPT

# File Daemon'lara giden bağlantılar (Director başlatır)
iptables -A OUTPUT -p tcp --dport 9102 -d 192.168.0.0/16 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 9102 -d 10.50.0.0/16 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 9102 -d 172.16.0.0/12 -j ACCEPT

# Kuralları kaydet
service iptables save
#!/bin/bash
# File Daemon sunucularında çalıştırılacak kurallar

DIRECTOR_IP="192.168.10.5"
STORAGE_IP="192.168.10.10"

# Director'ın File Daemon'a bağlanmasına izin ver
iptables -A INPUT -p tcp --dport 9102 -s ${DIRECTOR_IP} -j ACCEPT

# File Daemon'ın Storage Daemon'a bağlanmasına izin ver
iptables -A OUTPUT -p tcp --dport 9103 -d ${STORAGE_IP} -j ACCEPT

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

service iptables save

firewalld kullananlar için:

# File Daemon sunucularında firewalld ile
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.5/32" port protocol="tcp" port="9102" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" destination address="192.168.10.10/32" port protocol="tcp" port="9103" accept'
firewall-cmd --reload

NAT Arkasındaki Sunucuların Yedeklenmesi

Gerçek hayatta sıklıkla karşılaşılan bir senaryo: uzak ofiste NAT arkasında bir sunucu var ve bu sunucuyu merkezdeki Bacula Director ile yedeklemek istiyorsunuz. Bu durumda VPN olmadan direkt bağlantı kurmak için iki yöntem var.

Passive Mode (FDConnectToStorage)

Normal durumda Director, File Daemon’a bağlanır. Ancak NAT arkasındaki sunucular için bu işlemi tersine çeviremezsiniz. Bacula’nın “passive mode” özelliği burada devreye girer:

# bacula-dir.conf - NAT arkasındaki client için
Client {
  Name = nat-client-fd
  Address = nat-client.sirketim.com  # DDNS veya sabit IP
  FDPort = 9102
  Catalog = MyCatalog
  Password = "nat_client_parolasi"
  Passive = yes  # File Daemon bağlantıyı başlatır
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}

Passive mode’da File Daemon, Director’a bağlanmayı bekler ve Storage Daemon bağlantısını da kendisi başlatır. Bu NAT arkasındaki istemciler için ideal çözümdür ancak tüm Bacula versiyonlarında desteklenmez, 7.x ve üzeri gereklidir.

Port Yönlendirme ile Çözüm

Daha klasik yöntem olan NAT yönlendirme ile:

# Uzak ofis router'ında (iptables ile)
# Dışarıdan gelen 9102 bağlantısını iç sunucuya yönlendir

EXTERNAL_IP="203.0.113.50"
INTERNAL_IP="192.168.1.100"

iptables -t nat -A PREROUTING -d ${EXTERNAL_IP} -p tcp --dport 9102 -j DNAT --to-destination ${INTERNAL_IP}:9102
iptables -A FORWARD -p tcp -d ${INTERNAL_IP} --dport 9102 -j ACCEPT

Director tarafında bu client için dış IP adresini kullanırsınız:

Client {
  Name = remote-office-fd
  Address = 203.0.113.50  # Uzak ofis dış IP
  FDPort = 9102
  Catalog = MyCatalog
  Password = "remote_office_parolasi"
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
}

TLS ile Güvenli Bağlantı

Özellikle internet üzerinden veya güvenilmeyen ağlar üzerinden yedekleme yapıyorsanız TLS şifrelemesi zorunludur. Bacula native TLS destekler:

# Önce sertifika oluştur
mkdir -p /etc/bacula/ssl
cd /etc/bacula/ssl

# CA oluştur
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt 
  -subj "/C=TR/ST=Istanbul/O=Sirketim/CN=Bacula CA"

# Director sertifikası
openssl genrsa -out director.key 2048
openssl req -new -key director.key -out director.csr 
  -subj "/C=TR/ST=Istanbul/O=Sirketim/CN=backup-director"
openssl x509 -req -days 3650 -in director.csr -CA ca.crt 
  -CAkey ca.key -CAcreateserial -out director.crt

# File Daemon sertifikası (her sunucu için ayrı)
openssl genrsa -out fd-webserver01.key 2048
openssl req -new -key fd-webserver01.key -out fd-webserver01.csr 
  -subj "/C=TR/ST=Istanbul/O=Sirketim/CN=webserver01-fd"
openssl x509 -req -days 3650 -in fd-webserver01.csr -CA ca.crt 
  -CAkey ca.key -CAcreateserial -out fd-webserver01.crt

Director’da TLS yapılandırması:

# bacula-dir.conf içinde Director bloğuna ekle
Director {
  Name = backup-director
  DIRport = 9101
  # ... diğer ayarlar ...
  
  TLS Enable = yes
  TLS Require = yes
  TLS CA Certificate File = /etc/bacula/ssl/ca.crt
  TLS Certificate = /etc/bacula/ssl/director.crt
  TLS Key = /etc/bacula/ssl/director.key
  TLS Allowed CN = "webserver01-fd"
  TLS Allowed CN = "dmz-appserver-fd"
}

File Daemon tarafında:

# bacula-fd.conf
FileDaemon {
  Name = webserver01-fd
  FDport = 9102
  # ... diğer ayarlar ...
  
  TLS Enable = yes
  TLS Require = yes
  TLS CA Certificate File = /etc/bacula/ssl/ca.crt
  TLS Certificate = /etc/bacula/ssl/fd-webserver01.crt
  TLS Key = /etc/bacula/ssl/fd-webserver01.key
}

Director {
  Name = backup-director
  Password = "webserver01_ozel_parolasi"
  TLS Enable = yes
  TLS Require = yes
  TLS CA Certificate File = /etc/bacula/ssl/ca.crt
  TLS Certificate = /etc/bacula/ssl/fd-webserver01.crt
  TLS Key = /etc/bacula/ssl/fd-webserver01.key
}

Ağ Sorunlarını Teşhis Etmek

Bağlantı sorunlarını debug etmek için bazı pratik yöntemler:

# Director'dan File Daemon bağlantısını test et
bacula-dir -t -c /etc/bacula/bacula-dir.conf

# File Daemon'ın ayağa kalkıp kalkmadığını kontrol et
systemctl status bacula-fd
journalctl -u bacula-fd -f

# Port dinlenip dinlenmediğini kontrol et
ss -tlnp | grep -E "910[123]"
netstat -tlnp | grep bacula

# Director'dan elle bağlantı testi
bconsole
*status client=webserver01-fd

# Bağlantı izleme (tcpdump ile)
tcpdump -i eth0 -nn port 9102 or port 9103

Sık karşılaşılan hata mesajları ve çözümleri:

  • “Connection refused”: File Daemon çalışmıyor veya port kapalı. systemctl start bacula-fd ve firewall kurallarını kontrol et.
  • “Authorization key rejected”: Parolalar eşleşmiyor. Director’daki Client bloğundaki parola ile fd.conf’taki Director bloğundaki parola aynı olmalı.
  • “Cannot resolve hostname”: DNS çözümlemesi başarısız. /etc/hosts dosyasını düzenle veya IP adresi kullan.
  • “Network error”: Genellikle MTU sorunlarından kaynaklanır. VPN üzerinden bağlantılarda MTU’yu 1400’e düşürmeyi dene.

Büyük Ölçekli Ortamlarda Ağ Optimizasyonu

Onlarca sunucuyu yedekliyorsanız ağ bant genişliği ciddi bir sorun haline gelir. Bacula’nın bazı parametreleri bunu yönetmenize yardımcı olur:

# bacula-dir.conf - Job tanımında bant genişliği sınırı
Job {
  Name = "WebserverBackup"
  Type = Backup
  Client = webserver01-fd
  FileSet = "WebFiles"
  Schedule = "WeeklyCycle"
  Storage = RemoteStorage
  Messages = Standard
  Pool = Default
  # Yedekleme hızını sınırla (mesai saatlerinde)
  Maximum Bandwidth = 50 mb/s
  Priority = 10
}

# Mesai saati dışı için ayrı job (hız sınırı yok)
Job {
  Name = "WebserverBackupNight"
  Type = Backup
  Client = webserver01-fd
  FileSet = "WebFiles"
  Schedule = "NightlyCycle"
  Storage = RemoteStorage
  Messages = Standard
  Pool = Default
  Priority = 5
}

Paralel job sayısını Storage Daemon üzerinde de sınırlayın:

# Storage Daemon konfig - çok fazla paralel bağlantı disk I/O'yu öldürür
Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /mnt/backup-disk
  Maximum Concurrent Jobs = 8  # Disk performansına göre ayarla
  # ...
}

Sonuç

Bacula’nın ağ yapılandırması ilk bakışta karmaşık görünse de temel prensipleri anladıktan sonra mantıklı bir sisteme oturduğunu görürsünüz. Director-File Daemon-Storage Daemon üçgeninde kimin kime bağlandığını bilmek, firewall kurallarınızı doğru yazmanın anahtarıdır.

Özellikle dikkat etmeniz gereken noktaları özetlemek gerekirse: her Client için benzersiz parola kullanın, çok lokasyonlu ortamlarda VPN veya TLS şifrelemeyi atlamamayın, ve bant genişliği yönetimini production ortamında mutlaka yapılandırın. NAT arkasındaki sunucular için passive mode özelliği hayat kurtarıcı olabilir, ancak versiyon uyumluluğunu kontrol etmeyi unutmayın.

Sorun yaşadığınızda journalctl -u bacula-dir -f ve bconsole üzerinden status komutları size çok şey anlatacaktır. Debug seviyesini artırmak için Director’ı bacula-dir -d 200 -c /etc/bacula/bacula-dir.conf şeklinde başlatabilirsiniz; çıktı oldukça verbose ama sorunun kaynağını bulmak için paha biçilmez.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir