本文目录导读:

- 场景一:Linux iptables/nftables(通用脚本方法)
- 场景二:Windows 防火墙(netsh 命令)
- 场景三:企业级防火墙(如 iptables + ipset 或 pfSense/OPNsense)
- 重要安全提示
- 如果需要更具体的脚本(例如针对特定硬件品牌或云平台),请补充以下信息:
从备份文件恢复 和 从当前内存/运行状态恢复,具体方法取决于你使用的防火墙类型(Linux iptables/nftables、Windows 防火墙、还是企业级硬件防火墙)。
以下分场景提供脚本恢复方案:
Linux iptables/nftables(通用脚本方法)
假设你之前使用 iptables-save 或 nft list ruleset 导出了备份文件,现在需要恢复。
使用 iptables-restore(适用于 iptables)
如果你备份的文件是 iptables-save 格式(/backup/iptables-20250101.rules)。
#!/bin/bash
# 脚本: restore_iptables.sh
BACKUP_FILE="/backup/iptables-20250101.rules"
# 检查备份文件是否存在
if [ ! -f "$BACKUP_FILE" ]; then
echo "错误:备份文件 $BACKUP_FILE 不存在!"
exit 1
fi
# 恢复前清空所有规则(可选,建议先执行)
iptables -F
iptables -X
iptables -t nat -F
iptables -t mangle -F
iptables -t raw -F
# 从备份文件恢复
echo "正在从 $BACKUP_FILE 恢复 iptables 配置..."
iptables-restore < "$BACKUP_FILE"
# 检查恢复是否成功
if [ $? -eq 0 ]; then
echo "防火墙规则恢复成功!"
iptables -L -n -v
else
echo "恢复失败!请检查备份文件格式。"
exit 1
fi
使用 nft (nftables) 恢复(适用于较新 Linux 发行版)
备份文件通常通过 nft list ruleset > backup.nft 生成。
#!/bin/bash
# 脚本: restore_nftables.sh
BACKUP_FILE="/backup/nftables-20250101.nft"
if [ ! -f "$BACKUP_FILE" ]; then
echo "错误:备份文件不存在!"
exit 1
fi
# 恢复前先清除现有规则集
echo "清除现有 nftables 规则..."
nft flush ruleset
# 恢复备份规则
echo "正在从 $BACKUP_FILE 恢复 nftables 配置..."
nft -f "$BACKUP_FILE"
if [ $? -eq 0 ]; then
echo "nftables 规则恢复成功!"
nft list ruleset
else
echo "恢复失败!请检查文件语法。"
exit 1
fi
Windows 防火墙(netsh 命令)
通常使用 netsh advfirewall export 导出备份(.wfw 文件),恢复使用 netsh advfirewall import。
@echo off
rem 脚本: restore_windows_firewall.bat
set BACKUP_FILE=C:\backup\firewall_20250101.wfw
if not exist "%BACKUP_FILE%" (
echo 错误:备份文件 "%BACKUP_FILE%" 不存在!
exit /b 1
)
echo 正在从 "%BACKUP_FILE%" 恢复 Windows 防火墙配置...
netsh advfirewall import "%BACKUP_FILE%"
if %errorlevel% equ 0 (
echo 防火墙配置恢复成功!
netsh advfirewall show currentprofile
) else (
echo 恢复失败!请检查文件权限或格式。
exit /b 1
)
企业级防火墙(如 iptables + ipset 或 pfSense/OPNsense)
对于开启了 ipset 的 iptables 规则
如果你同时有 ipset 的备份(ipset save > ipset.backup),恢复顺序很重要:先恢复 ipset,再恢复 iptables。
#!/bin/bash
# 脚本: restore_firewall_with_ipset.sh
IPSET_BACKUP="/backup/ipset_save.txt"
IPTABLES_BACKUP="/backup/iptables_save.txt"
echo "开始恢复防火墙配置..."
# 1. 恢复 ipset 集合
if [ -f "$IPSET_BACKUP" ]; then
echo "恢复 ipset 集合..."
ipset restore < "$IPSET_BACKUP"
else
echo "警告:未找到 ipset 备份文件,跳过恢复。"
fi
# 2. 恢复 iptables 规则
if [ -f "$IPTABLES_BACKUP" ]; then
echo "恢复 iptables 规则..."
iptables-restore < "$IPTABLES_BACKUP"
else
echo "警告:未找到 iptables 备份文件。"
exit 1
fi
# 3. 保存到持久化文件(如果需要开机自启)
echo "正在保存规则到 /etc/iptables/rules.v4 ..."
iptables-save > /etc/iptables/rules.v4
echo "恢复完成!"
重要安全提示
- 不要盲目恢复:恢复前先查看备份文件内容(
cat backup.file),确认它不是你预期之外的规则(例如曾经误删了 SSH 端口)。 - 避免远程锁定:如果你通过 SSH 远程操作,强烈建议先在本地测试,或者使用类似下面的延时自毁脚本:
# 恢复后 5 分钟自动还原的“安全门” (sleep 300 && iptables-restore < /backup/emergency_safe_rules) &
- 备份文件验证:恢复前执行
iptables-restore --test < backup.file(仅测试语法,不实际加载)。 - 企业环境:对于 Cisco ASA、FortiGate、Palo Alto 等硬件防火墙,脚本恢复通常通过 API 调用 或 CLI 批量命令(如
configure replace file),具体请参考设备官方文档。
如果需要更具体的脚本(例如针对特定硬件品牌或云平台),请补充以下信息:
- 你使用的操作系统或防火墙品牌型号?
- 备份文件的来源(自动备份工具名还是手动导出)?
- 你希望脚本支持“一次性恢复”还是“定期自动恢复”?