Skip to main content

Централизованный бэкап Mikrotik устройств при помощи bash-скрипта

·303 words·2 mins
Stanislav Cherkasov
Author
Stanislav Cherkasov
Architecture | Kubernetes | Terraform
homelab - This article is part of a series.
Part : This Article

Для устройств Mikrotik существуют два основных вида бэкапов:

  1. Бинарный бэкап (.backup): содержит всё, но подходит только для того же устройства (или идентичного).
  2. Экспорт конфигурации (.rsc): текстовый файл с командами, который можно читать и частично применять на других устройствах.

Я написал скрипт, который автоматизирует создание обоих типов бэкапов и скачивает их на центральный сервер.

Ссылка на репозиторий скрипта

Использование
#

Скрипт вызывается с указанием конфигурационного файла для конкретного устройства:

/usr/local/bin/mbkp /etc/mikrotik_backup/router-core01.cfg

Сам скрипт (mbkp)
#

Основная логика работы:

#!/bin/bash
# mikrotik-backup script
# author Tenhi

# Initial checks
[[ -z "$1" ]] && echo "ERR: no config file provided" && exit 1
! [[ -r "$1" ]] && echo "ERR: cannot read $1" && exit 1

# Default variables
TGT_PORT="22"
TGT_USER="bkpuser"
IDL="5s"
BKP_BINPWD="SecretBinaryPassword"
BKP_EXPPWD="SecretExportPassword"
ST_RTN="30" # 30 days retention
ST_ROOT="/mnt/bkp_share/mikrotik"

# Load target config
source $1

# Utils definitions
CMD_SSH=$(which ssh)
CMD_SCP=$(which scp)
CMD_DATE=$(date +%Y%m%d_%H%M)

TGT_BKPNAME_BIN=$ST_HOSTNAME"_"$CMD_DATE".backup"
TGT_BKPNAME_EXP=$ST_HOSTNAME"_"$CMD_DATE".export"

SSH_OPT=" -o ConnectionAttempts=5 -o ConnectTimeout=5s \
 -o PasswordAuthentication=no -o PreferredAuthentications=publickey \
 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
 -o GlobalKnownHostsFile=/dev/null -o CheckHostIP=no "

SSH_STR="$CMD_SSH -2 -4 -p $TGT_PORT -l $TGT_USER $TGT_IP $SSH_OPT"
SCP_STR="$CMD_SCP -2 -4 -B $SSH_OPT -P $TGT_PORT $TGT_USER@$TGT_IP:/$TGT_BKPNAME_BIN $ST_FULL"

# ... (функции создания директорий и ротации логов)

# Основная функция бинарного бэкапа
function fn_backup_binary {
    T_BKPSTR="system backup save name=$TGT_BKPNAME_BIN dont-encrypt=no password=$BKP_BINPWD"
    T_BKPCLN="file remove [find name=$TGT_BKPNAME_BIN]"

    $SSH_STR $T_BKPSTR
    sleep $IDL && $SCP_STR
    sleep $IDL && $SSH_STR $T_BKPCLN
}

# Функция экспорта (с шифрованием на лету через openssl)
function fn_backup_export {
    # NOTE: decrypt with: openssl des3 -d -salt -in file.des3 -out file.txt
    EXP_TMP_FILE="/tmp/"$RANDOM".export"
    sleep $IDL && $SSH_STR export > $EXP_TMP_FILE
    openssl des3 -salt -k $BKP_EXPPWD -in $EXP_TMP_FILE -out $ST_FULL$TGT_BKPNAME_EXP".des3"
    rm $EXP_TMP_FILE
}

# ... (вызов функций)

Скрипт выполняет подключение по SSH ключам, инициирует создание бэкапа на устройстве, скачивает его и удаляет временный файл на роутере. Текстовый экспорт дополнительно шифруется локально, чтобы не хранить чувствительные данные в открытом виде.

Looking for a Senior DevOps or DevSecOps?

I help companies modernize their infrastructure, optimize Cloud/On-Premise costs, and build secure DevSecOps cultures.

homelab - This article is part of a series.
Part : This Article