IPFire: Automatische Systemsicherung einrichten

Es kann im Ernstfall ganz praktisch sein auch von der Firewall eine komplette Sicherung zu haben, speziell wenn man eine aufwändige Konfiguration hat.

Das gute ist dass IPFire bereits eine Backup Funktion integriert hat, und zwar in der Web-Oberfläche unter System -> Datensicherung. Im Hintergrund wird das Script /var/ipfire/backup/bin/backup.pl aufgerufen.

Dieses Script kann also direkt für unseren Cronjob verwendet werden – dazu unter /etc/fcron.daily/ eine neue Datei system-backup 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 aufs 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 schiebe ich die Sicherung per FTP auf ein NAS, es bleibt natürlich jedem selbst überlassen wie und wo gespeichert wird.
Als FTP Client verwende ich ncftp, das lässt sich ganz einfach über die IPFire Paketverwaltung installieren.

Achtung: Im „ISO Modus“ lädt die backup.pl ggf. ein ISO Image von download.ipfire.org, das kann also etwas dauern. Je nachdem wie schnell die Internetverbindung ist kann das sleep danach angepasst werden… aber mit 5 Minuten ist man auf der sicheren Seite denke ich, das Image hat derzeit um die 100MB.

Normalerweise wäre das sleep gar nicht notwendig weil die Befehle/Scripts sequenziell abgearbeitet werden. Bei mir startet ohne die Pause aber aus irgend einem Grund oder FTP Upload bevor das Backup fertig erstellt wurde.

Grundsätzliche Info zur IPFire Datensicherung unter http://wiki.ipfire.org/de/configuration/system/backup

7 Gedanken zu „IPFire: Automatische Systemsicherung einrichten“

  1. 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

    1. 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 squidclamav

      Schöne Grüße
      Alex

      1. 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>&1
        scp /var/ipfire/backup/addons/backup/*.ipf root@target:/share/Backup/iPfire > /dev/null 2>&1

  2. 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

     

  3. 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)
    ncftp lä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 0

    Viel Spaß damit…

Schreibe einen Kommentar zu Christian Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert