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-fdve 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/hostsdosyası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.
