Im Ernstfall kann es äußerst nützlich sein, eine vollständige Sicherung der Firewall zu besitzen, insbesondere bei einer komplexen Konfiguration.
Ein großer Vorteil von IPFire ist die bereits integrierte Backup-Funktion, die sich über die Web-Oberfläche unter System ? Datensicherung nutzen lässt. Im Hintergrund wird dabei das Skript /var/ipfire/backup/bin/backup.pl ausgeführt.
Dieses Skript kann direkt für unseren Cronjob genutzt werden. Dafür einfach eine neue Datei mit dem Namen system-backup unter /etc/fcron.daily/ erstellen:
# cd /etc/fcron.daily/
# touch system-backup && chmod +x system-backup && vi system-backup
#!/bin/bash # Alte Backups löschen rm /var/tmp/backupiso/* rm /var/ipfire/backup/*.ipf # Das IPFire Backup Script ausführen. # Es gibt hier 3 Parameter: # include: Es wird ein Config Backup inklusive Logdateien erstellt # exclude: Es wird ein Config Backup ohne Logfiles erstellt # iso: Es wird ein ISO Image inklusive Config Backup und Logfiles erstellt /var/ipfire/backup/bin/backup.pl iso > /dev/null 2>&1 # 5 Minuten warten, damit auch sicher alles fertig ist sleep 300 # Per FTP auf das NAS schieben ncftpput nas01 /Backup/Firewall/ /var/tmp/backupiso/* > /dev/null 2>&1 exit 0
Da sich das Script unter /etc/fcron.daily/ befindet, wird es automatisch täglich ausgeführt.
In meinem Fall lade ich die Sicherung per FTP auf ein NAS hoch, wobei es natürlich jedem selbst überlassen bleibt, wie und wo die Sicherung gespeichert wird. Als FTP-Client nutze ich ncftp, das sich unkompliziert über die IPFire-Paketverwaltung installieren lässt.
Achtung: Im „ISO-Modus“ lädt backup.pl möglicherweise ein ISO-Image von download.ipfire.org herunter. Dieser Vorgang kann je nach Geschwindigkeit der Internetverbindung einige Zeit in Anspruch nehmen. Das anschließende sleep-Intervall kann entsprechend angepasst werden. Mit 5 Minuten ist man jedoch auf der sicheren Seite, da das Image derzeit etwa 100 MB groß ist.
Eigentlich wäre das sleep nicht erforderlich, da die Befehle/Skripte normalerweise sequenziell ausgeführt werden. Aus irgendeinem Grund startet bei mir jedoch der FTP-Upload, bevor das Backup vollständig erstellt wurde, weshalb die Pause notwendig ist.
Allgemeine Informationen zur Datensicherung in IPFire ist unter https://www.ipfire.org/docs zu finden.
Hallo,
Das ist eine klasse Anleitung und es macht Spass es zu lesen.
Vielen dank dafür.
Viele gruesse
Hey,
das Script ist wirklich super! Ich lasse IPFire damit die Sicherung erstellen und ziehe mit pscp danach die Daten auf mein Backuplaufwerk.
Eine Frage habe ich aber noch: Damit werden nur die Einstellung von IPFire gesichert, nicht die Einstellungen der installierten Addons, oder?
Wo finde ich auf der Shell das Script, was die Datensicherung für die Addons anstößt? In meinem Fall speziell squidclamav.
Viele Grüße
Christian
Hallo Christian,
richtig, die Addon Einstellungen müssen extra gesichert werden.
Dies geschieht ebenfalls mit dem Script unter /var/ipfire/backup/bin/backup.pl – nur mit anderen Parametern. Soweit ich das erkennen kann sollte es so funktionieren:
/var/ipfire/backup/bin/backup.pl addonbackup squidclamavSchöne Grüße
Alex
Um auch die addons automatisch zu sichern:
ls -1 /var/ipfire/backup/addons/includes | xargs /var/ipfire/backup/bin/backup.pl addonbackup > /dev/null 2>&1scp /var/ipfire/backup/addons/backup/*.ipf root@target:/share/Backup/iPfire > /dev/null 2>&1
Super, Danke!
Viele Grüße!
Christian
Hallo Alexander,
Super funktionierende Anleitung.
Eines vermisse ich jedoch.
Einen Scripteintrag, der die alten Dateien nach 10 Tagen oder so löscht.
Gibt es da eine Möglichekeit ?
Mit diesem Eintrag funktioniert das ganze auf der IPFire problemlos:
#find /mnt/Backup/ipf -mtime +10 -exec rm {} \;
Gebe ich es so an:
find Mediathek-NAS /DaSi_PCs/IPFire/DaSi/ -mtime +1 -exec rm {} \:
meldet er ein fehlendes Argument bei -exec.
Hast du da eine Lösung, wäre supi.
Gruß
Heiko
Hallo,
ich habe mir erlaubt, das Skriptchen für meine Zwecke umzuschreiben 😉
Wesentliche Änderung:
Das Skript wartet, bis das aufgerufene Skript „/usr/local/bin/backupiso“ tatsächlich fertig ist. (Die sleep-Anweisung ist hierfür nicht geeignet!)
Es können noch „eigene“ Verzeichnisse ergänzt werden, die in die Backup-Routine aufgenommen werden (include)
ncftpläuft nicht mehr, sshpass ist geht auch nicht. Also: zurück zu den Bord-Mitteln „ssh“ & „scp“ mit „Authentifizierung per öffentlichem Schlüssel“Mailversand (über Bordmittel)
Automatische Anlage eines Cronjobs (Skript muss also nicht direkt in /etc/fcron.daily erstellt werden…) Eh nicht empfehlenswert: wer weiß schon, ob mit ’nem Update nicht alle Cronjobs platt gemacht werden? Gut, wenn dann das Skript außerhalb der Standard-Verzeichnisstruktur liegt.
#!/bin/bash # PARAMETER ########################## # Mailversand wenn fertig (Wenn kein Mailversand gewüscht, dann Variable leer lassen # MAILRECEPIENT="donald@disney.com" # Holen wir aus der IPFIRE-Config # Pfade (lokal) MYSCRIPTPATH="/var/ipfire/backup" INCLUDEFILE="${MYSCRIPTPATH}/include" # Angaben zum Backup (Ziel-Server) BACKUP_IP="10.8.150.111" BACKUP_USER="root" BACKUP_BASEDIR="/mein/pfad/zu/den/datensicherungen/ipfire" # Umfang der Sicherung # Hier gibt hier 3 Parameter für das Original-Skript # "include" : Es wird ein Config Backup inklusive Logdateien erstellt # "exclude" : Es wird ein Config Backup ohne Logfiles erstellt # "iso" : Es wird ein ISO Image inklusive Config Backup und Logfiles erstellt BACKUPTYPE="iso" # Zusätzliche Ordner / Pfade, deren Inhalte in die Datensicherung inkludiert werden sollen # Das wird ein Array, daher bitte Pfade durch Leerzeichen trennen!!! ADD_DIRS=( /var/lib/nagios /irgendein/beliebiger/pfad) ############################################################################################################################################ # AB HIER NICHTS MEHR ÄNDERN ############################################################################################################################################ TIMESTAMP_START=$(date +%s) # Startzeitpunkt festhalten # Mail-Header vorbereiten # Wir holen uns Mail-Parameter aus der ipfire-Konfig MAILSEND=$(cat /var/ipfire/dma/mail.conf | grep USEMAIL | cut -d "=" -f2) MAILRECEPIENT=$(cat /var/ipfire/dma/mail.conf | grep RECIPIENT | cut -d "=" -f2) MAILSENDER=$(cat /var/ipfire/dma/mail.conf | grep SENDER | cut -d "=" -f2) # Wir definieren das Log-File... LOGFILE="/tmp/log__$(date '+%Y-%m-%d_%H:%M:%S').txt" # ... und schreiben erste Informationen rein echo -e "To: ${MAILRECEPIENT}\nSubject:[IPFire $(hostname -f)] Datensicherung\nFrom: ${MAILRECEPIENT}\n\nDatensicherung, angelegt am $(date '+%d.%m.%Y um %H:%M')\n\n" > $LOGFILE # Zusätzliche Verzeichnisse, die gesichert werden sollen echo -e "Zusaetzliche Verzeichnisse, die gesichert werden sollen:" >> $LOGFILE # Wenn diese Verzeichnisse noch nicht in der include-Datei stehen, dann schreiben wir sie rein for i in "${ADD_DIRS[@]}"; do echo "[TODO] Prüfe, ob das Verzeichnis \"$i\" bereits in \"${INCLUDEFILE}\" steht..." if grep -qi "$i" "${INCLUDEFILE}" ; then echo -e "\t[OKAY] Verzeichniseintrag \"$i\" bereits vorhanden" >> $LOGFILE else # Prüfe zunächst, ob es das Verzeichnis gibt if [ -d "$i" ]; then echo -e "\t[INFO] Schreibe Verzeichnis \"$i\" in ${INCLUDEFILE}" >> $LOGFILE echo $i >> ${INCLUDEFILE} else echo -e "\t[FAIL] Das Verzeichnis \"$i\" exisitiert nicht, inkludiere es deswegen auch nicht in ${INCLUDEFILE}" >> $LOGFILE fi fi done echo -e "----------------------\n" >> $LOGFILE # Symlink-Prüfung # Setzt - sofern noch nicht vorhanden - einen Symlink dieses Skripts in /etc/fcron.daily if [ ! -L "/etc/fcron.daily/$(basename $0)" ]; then echo -e "Symlink-Pruefung fuer CRON-Job:\n\t[INFO] Symlink von \"$(realpath $0)\" nach \"/etc/fcron.daily/$(basename $0)\" nicht da, wird angelegt..." >> $LOGFILE ln -s -f $(realpath $0) /etc/fcron.daily/$(basename $0) else echo -e "Symlink-Pruefung fuer CRON-Job:\n\t[OKAY] Symlink von \"$(realpath $0)\" nach \"/etc/fcron.daily/$(basename $0)\" vorhanden..." >> $LOGFILE fi echo -e "----------------------\n" >> $LOGFILE # Alte Backups löschen if [ "${BACKUPTYPE}" == "iso" ]; then rm /var/tmp/backupiso/* >> $LOGFILE else rm /var/ipfire/backup/*.ipf >> $LOGFILE fi # Das IPFire-Backup-Script ausführen # Es gibt hier 3 Parameter, siehe oben # /var/ipfire/backup/bin/backup.pl iso > /dev/null 2>&1 /var/ipfire/backup/bin/backup.pl ${BACKUPTYPE} >> $LOGFILE # Warten, bis das Skript "/var/ipfire/backup/bin/backup.pl" bzw. "/usr/local/bin/backupiso" fertig ist! sleep 1 if [ "${BACKUPTYPE}" == "iso" ]; then MYPROC="/usr/local/bin/backupiso" echo "Starte ${MYPROC}... bitte warten" while [[ $(lsof | grep ${MYPROC}) ]]; do echo "${MYPROC} noch nicht fertig, bitte warten..." sleep 1 done fi # Backup-Datei(en) per SSH kopieren # sshpass läuft nicht (mehr) und ist aus Sicherheitsgründen auch nicht empfehlenswert, # daher setzen wir auf "Authentifizierung per öffentlichem Schlüssel", damit wir kein Passwort eingeben müssen # IP-Fire muss # Bitte lesen: https://wiki.ipfire.org/configuration/system/ssh#allow-public-key-authentication # Auf IP-Fire ausführen: ssh-keygen -f ~/.ssh/id_rsa -P '' # Auf dem Zielsystem: cat ~/.ssh/id_rsa.pub | ssh user@server "mkdir -m 700 ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys" # Verzeichnis anlegen (Beinhaltet das Datum zum leichteren Wiederfinden) BACKUP_DIR=$(date '+%Y%m%d_%H%M') ssh $BACKUP_USER@$BACKUP_IP "mkdir -p ${BACKUP_BASEDIR}/${BACKUP_DIR}" if [ "${BACKUPTYPE}" == "iso" ]; then # Das originale ISO, das eben heruntergeladen wurde, löschen wir wieder, um Platz zu sparen. # Wir brauchen ja nur das remasterte ISO, das unserer Config enthält DEL_ISO=$(cat $LOGFILE | grep "Fetching" | cut -d " " -f2) rm /var/tmp/backupiso/$(basename $DEL_ISO) scp /var/tmp/backupiso/* $BACKUP_USER@$BACKUP_IP:${BACKUP_BASEDIR}/${BACKUP_DIR}/ else scp /var/ipfire/backup/*.ipf $BACKUP_USER@$BACKUP_IP:${BACKUP_BASEDIR}/${BACKUP_DIR}/ fi # Laufzeit berechnen TIMESTAMP_ENDE=$(date +%s) TIMESTAMP_DAUER=`echo $(( ${TIMESTAMP_ENDE}-${TIMESTAMP_START} ))` echo -e "\n\nDatensicherung nach ${TIMESTAMP_DAUER} Sekunden fertiggestellt." >> $LOGFILE # Mail absetzen # Seitdem Sendmail verbannt wurde und nur noch "DragonFly Mail Agent" (DMA) genutzt werden kann, sind keine Mailattachments möglich # Funktioniert, aber Pipe ist Quatsch... echo "Subject: [IP-FIRE] ${USER}@$(hostname -f) at $(date)" | /usr/sbin/sendmail -vt $MAILRECEPIENT < $LOGFILE # Log-File löschen rm $LOGFILE exit 0Viel Spaß damit…