实用脚本能自动备份防火墙配置吗?

wen 实用脚本 2

本文目录导读:

实用脚本能自动备份防火墙配置吗?

  1. 核心思路
  2. 方案一:针对 Linux iptables/nftables 防火墙(最简单,推荐初学者)
  3. 方案二:针对 Cisco / Huawei / Fortinet 等商用防火墙(通过 SSH + 自动交互)
  4. 方案三:更推荐的“现代”方式:使用 Python + Netmiko(适用于 Cisco, Huawei, Juniper等)
  5. 方案四:基于 TFTP/FTP 的直传(适合老设备)
  6. 重要提示与安全实践

是的,完全可以通过脚本自动备份防火墙配置,这在网络运维中是一个很常见的需求,能有效防止配置丢失或误操作后的快速恢复。

下面我提供几个实用且可直接部署的脚本方案,涵盖主流防火墙(Cisco、华为、Fortinet、Linux iptables/nftables)。

核心思路

一个通用的备份脚本通常包含三个步骤:

  1. 连接设备(SSH/TFTP/FTP/API)。
  2. 执行命令show run, display current-configuration, iptables-save)。
  3. 存储文件(本地目录 + 时间戳,或推送到远程备份服务器/S3)。

针对 Linux iptables/nftables 防火墙(最简单,推荐初学者)

如果你的防火墙是 Linux 服务器(如 CentOS、Ubuntu),备份非常直接。

脚本:backup_iptables.sh

#!/bin/bash
# Linux iptables / nftables 备份脚本
# 配置
BACKUP_DIR="/var/backups/firewall"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份规则
# 检查是 iptables 还是 nftables
if command -v nft &> /dev/null; then
    echo "检测到 nftables,使用 nft list ruleset..."
    nft list ruleset > $BACKUP_DIR/nftables_backup_$DATE.nft
elif command -v iptables-save &> /dev/null; then
    echo "检测到 iptables,使用 iptables-save..."
    iptables-save > $BACKUP_DIR/iptables_backup_$DATE.txt
    # 可选:备份 ip6tables
    ip6tables-save > $BACKUP_DIR/ip6tables_backup_$DATE.txt
else
    echo "错误:未检测到 iptables 或 nftables。"
    exit 1
fi
# 删除30天前的旧备份
find $BACKUP_DIR -name "*.txt" -o -name "*.nft" -mtime +$RETENTION_DAYS -exec rm {} \;
echo "防火墙配置已备份到: $BACKUP_DIR"
echo "备份文件名: $(ls -t $BACKUP_DIR | head -n 1)"

使用方法:

  1. 保存脚本,赋予执行权限:chmod +x backup_iptables.sh
  2. 添加到 crontab,每天凌晨2点执行:
    crontab -e
    0 2 * * * /path/to/backup_iptables.sh

针对 Cisco / Huawei / Fortinet 等商用防火墙(通过 SSH + 自动交互)

商用防火墙通常需要通过 SSH 登录后执行命令,推荐使用 sshpasspexpect,以下是一个使用 expect 的经典脚本。

前提条件: 安装 expectapt-get install expect -yyum install expect -y

脚本:backup_network_fw.exp

#!/usr/bin/expect -f
# 通用 SSH 备份脚本(适用于 Cisco, Huawei, FortiGate 等)
# 变量设置
set IP "192.168.1.1"
set USER "admin"
set PASSWORD "Your_Password_Here"
set BACKUP_DIR "/var/backups/firewall/network"
set DATE [exec date +%Y%m%d_%H%M%S]
set BACKUP_FILE "$BACKUP_DIR/config_$IP_$DATE.cfg"
# 自动交互过程
spawn ssh -o StrictHostKeyChecking=no $USER@$IP
# 处理密码提示
expect "password:"
send "$PASSWORD\r"
# 根据不同厂商执行不同命令
expect {
    # Cisco
    -re ".*[>#]" {
        send "terminal length 0\r"
        expect -re ".*[>#]"
        send "show running-config\r"
        expect -re ".*[>#]" { puts "Cisco backup OK" }
    }
    # Huawei
    -re ".*[*>]" {
        send "screen-length 0 temporary\r"
        expect -re ".*[*>]"
        send "display current-configuration\r"
        expect -re ".*[*>]" { puts "Huawei backup OK" }
    }
    # FortiGate
    -re ".*# " {
        send "config system console\r"
        expect "# "
        send "set output standard\r"
        expect "# "
        send "end\r"
        expect "# "
        send "show full-configuration\r"
        expect "# " { puts "FortiGate backup OK" }
    }
    timeout {
        puts "连接超时"
        exit 1
    }
}
# 保存输出到文件
log_file $BACKUP_FILE
# 退出
send "exit\r"
expect eof

使用方法:

  1. 修改脚本中的 IPUSERPASSWORD 和命令匹配模式(expect 部分)。
  2. 执行:./backup_network_fw.exp(需要 chmod +x)。
  3. 同样可以加入 crontab。

更推荐的“现代”方式:使用 Python + Netmiko(适用于 Cisco, Huawei, Juniper等)

这是目前业界更推荐的做法,因为 Python 脚本更健壮,支持处理不同厂商的设备(基于 SSH/API),且配置简单。

前置条件: pip install netmiko

脚本:backup_fw_python.py

#!/usr/bin/env python3
# 使用 Netmiko 批量备份多个设备
from netmiko import ConnectHandler
from datetime import datetime
import os
import time
# 设备列表(可以根据需要扩充)
devices = [
    {
        'device_type': 'cisco_ios',  # 华为用 'huawei', FortiGate 用 'fortinet'
        'host': '192.168.1.1',
        'username': 'admin',
        'password': 'CiscoPass123',
    },
    {
        'device_type': 'huawei',
        'host': '192.168.2.1',
        'username': 'netadmin',
        'password': 'HuaweiPass456',
    },
]
# 配置备份目录
BACKUP_DIR = "/var/backups/firewall/"
DATE = datetime.now().strftime('%Y%m%d_%H%M%S')
# 创建目录
os.makedirs(BACKUP_DIR, exist_ok=True)
for device in devices:
    try:
        print(f"正在备份 {device['host']}...")
        # 连接设备
        connection = ConnectHandler(**device)
        connection.enable()  # 进入 enable 模式(如果需要)
        # 获取配置(不同设备命令不同,netmiko 会自动适配)
        # 对于大多数设备,使用 send_command('show running-config')
        # 对于 FortiGate 可能需要 'show full-configuration'
        output = connection.send_command('show running-config')
        # 生成文件名并保存
        filename = f"{device['host']}_backup_{DATE}.cfg"
        filepath = os.path.join(BACKUP_DIR, filename)
        with open(filepath, 'w') as f:
            f.write(output)
        print(f"成功备份到: {filepath}")
        connection.disconnect()
        time.sleep(1)  # 防止连接过快
    except Exception as e:
        print(f"备份 {device['host']} 失败: {e}")
print(f"所有设备备份完成,目录: {BACKUP_DIR}")

优点:

  • 自动处理 enable 密码。
  • 无需 expectsshpass
  • 支持丰富的设备类型(cisco_ios, huawei, fortinet, linux 等)。
  • 易于扩展(添加多台设备只需修改列表)。

基于 TFTP/FTP 的直传(适合老设备)

如果防火墙支持主动发送配置到 TFTP/FTP 服务器,可以通过脚本触发防火墙向指定服务器发送文件。

在防火墙上配置(一次性的):

# Cisco 示例(在设备上执行,不是脚本里)
copy running-config tftp://192.168.1.100/backup/config.txt

服务器端脚本(Linux 服务器上): 也可以写一个简单的循环,通过 ncftptftp 客户端定时从防火墙拉取。

重要提示与安全实践

  1. 密码安全

    • 绝对不要在脚本里写明文密码(除非在完全可信的内网测试环境)。
    • 推荐做法:使用SSH密钥对(无密码登录),或者用 netmiko 配合环境变量或加密的配置文件(如 .envvault)。
    • 高级做法:使用 Ansible Vault 或 HashiCorp Vault 管理凭证。
  2. 日志与验证

    • 备份完成后,最好读取文件大小校验和确认备份成功,而不是只检查有无报错。
    • 定期模拟恢复测试,确保备份文件可用(例如在一台测试机上应用配置)。
  3. 版本控制(强烈推荐):

    • 不要只备份到目录,最好配合 Git,每次备份成功后自动 git commit -m "daily backup $(date)",这样你能看到配置的历史变更记录,知道谁改了什么。
  4. 网络可靠性

    如果防火墙是边界设备,备份请求的IP地址需要被防火墙自身的ACL允许(避免“自己拦自己”)。

场景 推荐方案 难度
Linux 自带防火墙 方案一iptables-save / nft + crontab ⭐ 极简单
少量商用防火墙(临时) 方案二expect 脚本 ⭐⭐ 中等
多品牌、多台商用防火墙 方案三:Python + Netmiko ⭐⭐⭐ 推荐
已有TFTP/FTP服务器 方案四:设备主动推送 ⭐⭐ 中等

最推荐的起点:如果你管理的是 Cisco/华为等设备,直接使用方案三(Python + Netmiko),学习成本低,维护方便,后续还可以扩展为自动配置巡检或批量修改配置。

抱歉,评论功能暂时关闭!