网络设备的自动备份及其在版本控制系统中的存储

说明:该解决方案配置用于D-Link DFL,cisco 29xx和WatchGuard Firebox,但适用于通过ssh连接和/或按计划/事件将其上载到ftp / tftp服务器时可以备份的所有内容。

一切始于我的朋友程序员问:“为什么不将网络配置存储在版本控制系统中?” 事实-我想-为什么? 大部分配置文件都可以文本格式下载(当然,这些文件是二进制文件,但是可读的信息已打开并在文本编辑器中显示)。

在网络上,我们有大约30种不同的D-Link DFL,十几个Cisco 29xx和几个WatchGuard Firebox。 对于每种设备,其所在的IT部门的管理员级别的员工,加上总部的IT部门,都具有管理员级别的访问权限。 这就带来了诸如“我六个月没有做备份并破坏了一切,您有备份吗?”和“设备烧坏了上一个备份,以前的管理员做了,我不知道在哪里,按原样配置我们”之类的问题。 而且,如果cisco已经在每次保存时自动将running-config重置为ftp,则D-Link并非如此。 而版本控制系统将有助于查找“我不记得更改的内容和更改时间,但是我们每月使用一次的东西都坏了”的问题。 备用规定不会挽救您的人为因素,也不会为您提供备用,因此,警告比取消纠结要好。

我坦率地承认,在我坐下来写一篇文章之前,我不知道酸败和氧化。 但是他们都不知道我到底需要什么。 第一个针对cisco,不适用于任何奇特的工具,第二个没有用户授权(尽管可以通过Web服务器的简单操作来完成),而且最重要的是,这两个都需要登录和密码才能访问冗余系统。 所有D-link DFL支持ssh登录。 思科本身会合并备份,通常不需要连接。 因此,如果您可以使用密钥登录,为什么还要定期更改密码。

决定自己做一些适合我的事情。

实际上,自动备份需要很长时间。 但是版本控制系统-很新鲜。

因此,任务是:在一个地方从网络设备中收集所有重要的配置,并支持版本控制文件,并定期在那里自动更新它们,以允许另一个时区的管理员以简单的方式下载它们,而无需在凌晨3点打电话给我。 当然,所有这些都是免费的。

对于所有DFL,配置文件都称为相同文件,因此在复制时必须清楚地命名它们。 我也不想使用cisco将现有的running-config填充系统重新配置为ftp。

首先,建立一个版本控制系统


我拿了svn,tk。 svn是唯一存储差异二进制文件而不是历史记录中所有文件的流行文件。 这并不是说小批量时很重要,但是很好。 通常,我会考虑少量的配置文件,即要采用哪个版本控制系统-没什么区别。

Visual SVN服务器使用随时可用的方法从官方站点安装。 我将其放在Windows下的服务器上,这样同事可以更轻松地进行管理(创建用户,分配权限)。 接下来,创建存储库,并在其中创建必要的部分,并创建唯一拥有该存储库完整权限的用户(目前)。 在Windows上,操作已完成。

我是通过单台Linux机器(在Debian下)进行自动备份的。

首先,我们设置svn以便拥有一个客户端:

sudo apt-get install svn 

现在,将手动创建项目的副本(在当前目录中创建):

 svn checkout https://servername.mydomain.ru/svn/DFL_BACKUPS/ DFL_BACKUPS --username go 

现在我在存储库中有三个部分:

  • Current_backup,用于存储和覆盖D-Link DFL配置。
  • Old_versions,其中存储了具有指定日期的配置,以方便分支机构管理员下载。
  • 思科,存储cisco和WatchGuard Firebox配置的位置(发生了)。

让我们从DFL自动备份开始并设置DFL本身


连接在ssh上进行。 为了不以开放形式公开密码,使用了公私钥对。 专用存储在服务器上的/ usr / dfl_scripts / sshkeys / dfl_key中。

我们在自动备份服务器上生成一对公私钥:

 ssh-keygen –t rsa 

将开放的文件注入所有DFL中,并制定ssh访问规则:





好了,允许相应的远程管理。 尽管只能从某些地址进行访问,但默认端口可以更改为例如2222。



具有D-Link DFL当前配置的文件位于根目录中,名为config.bak,您只需使用scp将其复制到自己即可。

因此,该脚本(我剪切了分支列表,所以没有工作表):

 #!/bin/bash rm /usr/dfl_scripts/dflbackup/* #    dfls=( "amur:10.28.10.254" #  "arhangelsk:10.29.10.254" "buratia:10.3.10.254" "volgograd:10.34.10.254" "voronezh:10.36.10.254" "irkutsk_210:10.38.20.253" "irkutsk_260:10.38.20.254" "yaroslavl:10.76.10.254" ) rm /usr/dfl_scripts/log.txt # - for dfl in "${dfls[@]}" ; do #   - filial="${dfl%%:*}" #delete the longest substr :* search from the end of string ip_addr="${dfl##*:}" #delete the longest substr *: search from the head of string echo $filial $ip_addr >> /usr/dfl_scripts/log.txt #     scp -P 2222 -i /usr/dfl_scripts/sshkeys/dfl_key admin@$ip_addr:config.bak /usr/dfl_scripts/dflbackup/$filial.bak 2>>/usr/dfl_scripts/log.txt #   ,      done FILES=$(ls /usr/dfl_scripts/dflbackup) #     now=$(date +"%d_%m_%Y") #     for f in $FILES ; do #      (    ) cp /usr/dfl_scripts/dflbackup/$f /usr/dfl_scripts/DFL_BACKUPS/current_backup/$f #       cp /usr/dfl_scripts/dflbackup/$f /usr/dfl_scripts/DFL_BACKUPS/old_versions/${f%.bak}_$now.bak #        done cd /usr/dfl_scripts/DFL_BACKUPS #   svn  svn add * --force -q >> /usr/dfl_scripts/log.txt #  .    . svn commit -m "added backups $now" >> /usr/dfl_scripts/log.txt #     /usr/bin/mail it@mydomain.ru < /usr/dfl_scripts/log.txt -s "   DFL" #    -   

该脚本挤入了cron,每天早上8:30运行。 这是crontab的样子:
 30 08 * * * /usr/dfl_scripts/autobackup.sh 30 06 * * * /usr/dfl_scripts/ciscobackup.sh 00 06 * * 1 /usr/dfl_scripts/fireboxbackup.sh 

现在关于思科


在设备本身上,配置如下:

 archive log config logging enable logging size 500 hidekeys path ftp://ftp.mydomain.ru/in/autolog/$H-$T write-memory ip ftp username user ip ftp password mypass ip scp server enable 

结果,write-memory命令将当前配置重置为ftp。 我的ftp与一堆自动备份位于不同的服务器上。 有两种方法:在该服务器上复制存储库,然后在该服务器上添加配置,或将配置复制到相邻服务器。 基本上,整个区别是执行cp还是scp。

在使用cisco进行配置的目录中,我放置了incron来监视文件的外观。 通过文件的外观,我将其重命名,然后将其复制到临时目录中的自动备份收集器服务器。 通过剪辑,临时目录中的文件被上载到svn。 总的来说,我在版本控制系统中每天一次有特定时间的最新配置。 在我看来,这已经足够了,但是对于任何心愿单来说,可以对该系统进行修改而不会出现任何问题。

incrontab配置如下所示:

 /var/ftp/cisco/in/autolog/ IN_CREATE /usr/ftp_scripts/incron_cisco.sh $# $% 

脚本本身:

 #!/bin/bash if [[ $2 == "IN_MOVED_TO" || $2 == "IN_CREATE" ]]; then sleep 10 filial="${1%%-*}" #delete the longest substr -* search from the end of string.        scp -P 2222 -i /usr/ftp_scripts/ssh_key_private /var/ftp/cisco/in/autolog/$1 go@10.10.10.220:/usr/dfl_scripts/ciscobackup/$filial.conf fi 

计划的脚本会根据计划在自动备份服务器上启动:

 #!/bin/bash logfile=/usr/dfl_scripts/log_cisco.txt rm $logfile now=$(date +"%d_%m_%Y") cd /usr/dfl_scripts/DFL_BACKUPS cp /usr/dfl_scripts/ciscobackup/* /usr/dfl_scripts/DFL_BACKUPS/cisco/ svn add * --force –q >> $logfile svn commit -m "added cisco backups $now" >> $logfile /usr/bin/mail it@mydomain.ru < $logfile -s "   cisco  watchguard" 

如您所见,在这里我们还讨论了WatchGuard Firebox。 坦率地说,我很懒惰为他们创建一个单独的目录。 因此,备份位于ftp上与cisco相同的位置。 WatchGuard会在半小时前(通常每周一次)在单独的脚本中备份。 请注意,语法已从固件版本12更改。 以前,可以使用一个备份映像到ftp命令来完成此操作,现在已添加导出。 在它上面,我无法通过ssh按密钥配置登录,因此使用了密码。

 #!/bin/bash watchguards=( "10.10.10.20:password1" "10.97.10.20:password2" ) now=$(date +"%Y_%m_%d") for wg in "${watchguards[@]}" ; do ip_addr="${wg%%:*}" pass="${wg##*:}" sshpass -p $pass ssh backupuser@$ip_addr -p 4118 << ENDME backup image WG_$now.fxi export image WG_$now.fxi 123456qQ to ftp://user:mypass@ftp.mydomain.ru/in/autolog/WG_$ip_addr-$now.fxi ENDME Done 

WatchGuard二进制文件仅以加密方式导出,因此使用文本外观和差异将无法很好地解决问题。 请注意加密密钥:强制的大写,小写字母和数字,至少8个字符。 在不遵守的情况下,该命令只是不执行,没有特别指出错误在哪里。

因此,一切都已完成。 现在,我们将客户端放在Windows下的工作计算机上。 您可以简单地从浏览器中查看文件和差异,但只能从客户端从特定修订版下载版本。 我们从官方网站上放置了TorToSiteSVN。

在服务器上,为分支创建一个具有必要权限(读取)的用户。

然后,您需要通过上下文菜单输入任何文件的客户端并连接到存储库。 如果您不打算对文件进行更改,则无需自己创建存储库的副本。 好吧,请谨慎操作,您将需要通过版本控制系统来处理副本,而不仅仅是使用文件系统。





要对非标准tex文件进行比较,您需要确保SVN认为这些文件不是二进制文件,而是文本文件。 像这样:

 svn propset svn:mime-type text/plain current_backup/*.bak 

例如,在linux下执行此命令,然后进行提交。

好吧,这是变化,请通过眼睛看。 我们看到防火墙规则已更改:





在浏览器中观看更方便。



如果发生了某些情况,则管理员可以在所需日期下载所需的备份,而无需不必要的手势。



尽管通常,最新的就足够了。

在某种程度上,自行车的发明得以实现。 但是,正是我所需要的,它已经在D-link DFL上工作了将近一年,有时它会有所帮助。

我希望有人派上用场。

参考文献:

关于腐臭
WatchGuard Firebox CLI手册
亲氧化

Source: https://habr.com/ru/post/zh-CN480386/


All Articles