本文目录导读:

- 核心思路
- 方案一:针对 Linux iptables/nftables 防火墙(最简单,推荐初学者)
- 方案二:针对 Cisco / Huawei / Fortinet 等商用防火墙(通过 SSH + 自动交互)
- 方案三:更推荐的“现代”方式:使用 Python + Netmiko(适用于 Cisco, Huawei, Juniper等)
- 方案四:基于 TFTP/FTP 的直传(适合老设备)
- 重要提示与安全实践
是的,完全可以通过脚本自动备份防火墙配置,这在网络运维中是一个很常见的需求,能有效防止配置丢失或误操作后的快速恢复。
下面我提供几个实用且可直接部署的脚本方案,涵盖主流防火墙(Cisco、华为、Fortinet、Linux iptables/nftables)。
核心思路
一个通用的备份脚本通常包含三个步骤:
- 连接设备(SSH/TFTP/FTP/API)。
- 执行命令(
show run,display current-configuration,iptables-save)。 - 存储文件(本地目录 + 时间戳,或推送到远程备份服务器/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)"
使用方法:
- 保存脚本,赋予执行权限:
chmod +x backup_iptables.sh - 添加到 crontab,每天凌晨2点执行:
crontab -e 0 2 * * * /path/to/backup_iptables.sh
针对 Cisco / Huawei / Fortinet 等商用防火墙(通过 SSH + 自动交互)
商用防火墙通常需要通过 SSH 登录后执行命令,推荐使用 sshpass 或 pexpect,以下是一个使用 expect 的经典脚本。
前提条件: 安装 expect:apt-get install expect -y 或 yum 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
使用方法:
- 修改脚本中的
IP、USER、PASSWORD和命令匹配模式(expect部分)。 - 执行:
./backup_network_fw.exp(需要chmod +x)。 - 同样可以加入 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密码。 - 无需
expect或sshpass。 - 支持丰富的设备类型(
cisco_ios,huawei,fortinet,linux等)。 - 易于扩展(添加多台设备只需修改列表)。
基于 TFTP/FTP 的直传(适合老设备)
如果防火墙支持主动发送配置到 TFTP/FTP 服务器,可以通过脚本触发防火墙向指定服务器发送文件。
在防火墙上配置(一次性的):
# Cisco 示例(在设备上执行,不是脚本里) copy running-config tftp://192.168.1.100/backup/config.txt
服务器端脚本(Linux 服务器上):
也可以写一个简单的循环,通过 ncftp 或 tftp 客户端定时从防火墙拉取。
重要提示与安全实践
-
密码安全:
- 绝对不要在脚本里写明文密码(除非在完全可信的内网测试环境)。
- 推荐做法:使用SSH密钥对(无密码登录),或者用
netmiko配合环境变量或加密的配置文件(如.env或vault)。 - 高级做法:使用 Ansible Vault 或 HashiCorp Vault 管理凭证。
-
日志与验证:
- 备份完成后,最好读取文件大小或校验和确认备份成功,而不是只检查有无报错。
- 定期模拟恢复测试,确保备份文件可用(例如在一台测试机上应用配置)。
-
版本控制(强烈推荐):
- 不要只备份到目录,最好配合 Git,每次备份成功后自动
git commit -m "daily backup $(date)",这样你能看到配置的历史变更记录,知道谁改了什么。
- 不要只备份到目录,最好配合 Git,每次备份成功后自动
-
网络可靠性:
如果防火墙是边界设备,备份请求的IP地址需要被防火墙自身的ACL允许(避免“自己拦自己”)。
| 场景 | 推荐方案 | 难度 |
|---|---|---|
| Linux 自带防火墙 | 方案一:iptables-save / nft + crontab |
⭐ 极简单 |
| 少量商用防火墙(临时) | 方案二:expect 脚本 |
⭐⭐ 中等 |
| 多品牌、多台商用防火墙 | 方案三:Python + Netmiko |
⭐⭐⭐ 推荐 |
| 已有TFTP/FTP服务器 | 方案四:设备主动推送 |
⭐⭐ 中等 |
最推荐的起点:如果你管理的是 Cisco/华为等设备,直接使用方案三(Python + Netmiko),学习成本低,维护方便,后续还可以扩展为自动配置巡检或批量修改配置。