IPFire: Automatische Systemsicherung einrichten

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.

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

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