Windows 防火墙规则导出工具:让安全配置可备份、可迁移、可审计
一、痛点:Windows 防火墙规则管理的三大难题
作为安全工程师和系统管理员,日常面对 Windows 防火墙规则时,往往会遇到这几个头疼的问题:
1. 导出格式不可读
Windows 自带的防火墙导出功能(通过「高级安全 Windows Defender 防火墙」界面或 netsh advfirewall export 命令),导出来的是 .wfw 格式的二进制文件。直接打开是这样的乱码:
████░░░░░░░░░░░ ← 不可读
运维人员根本无法肉眼核对规则内容,无法做 diff 对比,也无法在代码仓库中管理这些配置。
2. 导入会覆盖已有规则
用 Windows 自带的导入功能,会直接覆盖现有的防火墙策略。在生产环境操作时,这意味着:一旦导入出问题,所有现有规则全部丢失,风险极高。
3. 规则迁移困难
换机器、换环境、克隆系统时,好不容易配好的防火墙策略无法方便地迁移。手动一条条复制?几百条规则根本不可能。
二、解决方案:export_firewall_rules
这个开源工具用 Python 写,专门解决上述三个痛点:
核心功能
- 将 Windows 防火墙规则导出为 可读的 netsh 脚本格式
- 导出的脚本直接可用,复制到新机器执行即可恢复规则
- 支持导出后学习 netsh 语法,提升对防火墙规则的理解
支持导出的规则类型
| 类型 | 说明 |
|---|---|
| 出站 / 入站规则 | dir=in / dir=out |
| TCP / UDP / ICMP 协议 | protocol=tcp/udp/icmpv4 |
| 应用程序路径规则 | program= 参数 |
| IP 段规则 | remoteip= 支持 CIDR 和范围 |
| 指定端口规则 | localport= / remoteport= |

三、使用方法
第一步:安装 Python 环境
工具基于 Python,需要 Python 3.x。macOS / Linux 可以直接执行,Windows 上建议使用 Python 3。
bash
git clone https://github.com/hyang0/export_firewall_rules.git
cd export_firewall_rules
pip install -r requirements.txt
第二步:查看当前防火墙规则
在导出之前,可以先查看系统当前的防火墙规则:
bash
# 查看所有入站规则(Windows PowerShell)
Get-NetFirewallRule -Direction Inbound | Get-NetFirewallPortFilter | Select-Object -First 20
# 查看出站规则
Get-NetFirewallRule -Direction Outbound | Select-Object -First 10
第三步:使用工具导出规则
bash
python export_rules.py
工具会连接到 Windows 防火墙 API,读取所有规则,然后输出为 netsh 格式的脚本文件。
第四步:备份导出的脚本
导出的内容示例:
bash
# ============================================
# Windows 防火墙规则导出
# 导出时间: 2026-04-19
# 规则总数: 若干
# ============================================
# 规则示例1:允许特定程序
netsh advfirewall firewall add rule \
name="360ceupdate.exe" \
dir=in \
action=allow \
enable=yes \
profile=public \
protocol=tcp \
program="C:\Users\Administrator\AppData\Local\360ChromeX\Chrome\Application\22.3.3087.64\installer\360ceupdate.exe" \
remoteip=192.168.1.1-192.168.1.20
# 规则示例2:允许内网网段
netsh advfirewall firewall add rule \
name="inner" \
dir=out \
action=allow \
enable=yes \
remoteip=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
# 规则示例3:允许 ICMP Ping
netsh advfirewall firewall add rule \
name="ping" \
dir=in \
action=allow \
enable=yes \
protocol=icmpv4
第五步:导入到新机器
将导出的脚本复制到目标机器,直接运行即可批量导入规则:
powershell
# 方法1:直接执行脚本中的命令
netsh advfirewall import "backup.wfw" # 先导入标准格式备份
# 方法2:手动执行导出的netsh命令
# (直接复制工具导出的脚本内容到 PowerShell 执行)
💡 建议: 先在测试环境执行,确认无误后再到生产环境操作。
四、进阶用法
4.1 定时备份防火墙规则(结合计划任务)
将导出操作写成脚本,加入 Windows 任务计划程序,实现自动化备份:
powershell
# backup_firewall.ps1
$date = Get-Date -Format "yyyyMMdd"
$backupDir = "C:\FirewallBackups"
if (!(Test-Path $backupDir)) { New-Item -ItemType Directory -Path $backupDir }
python C:\Tools\export_firewall_rules\export_rules.py > "$backupDir\fw_rules_$date.txt"
注册计划任务:
powershell
# 每天凌晨 2:00 自动备份
schtasks /create /tn "FirewallBackup" /tr "powershell.exe -File C:\backup_firewall.ps1" /sc daily /st 02:00
4.2 与 Git 版本控制结合
将导出的规则脚本纳入代码仓库管理,好处显而易见:
-
📋 历史可追溯:每次修改都有 commit 记录
-
🔄 变更可对比 :通过
git diff清晰看到规则增减 -
🔄 回滚容易:出问题时一键恢复到上一版本
-
👥 团队协作:多人维护时规则变更可 review
firewall-config/
├── rules/
│ ├── base.txt # 基础规则(服务器必开端口)
│ ├── dev.txt # 开发环境规则
│ ├── prod.txt # 生产环境规则
│ └── .gitignore
└── backup_firewall.ps1 # 备份脚本
4.3 导出规则学习 netsh 语法
工具还有一个隐藏价值:学习 Windows 防火墙规则语法。
很多安全工程师会用图形界面配置防火墙,但不知道怎么用命令行写规则。有了这个工具:
- 在图形界面手工创建一条规则 ✅
- 用工具导出为 netsh 格式 ✅
- 读懂语法结构,理解每行参数含义 ✅
- 以后直接写命令,不用开图形界面 ✅
五、安全加固建议
5.1 常用安全规则示例
powershell
# 禁止所有入站连接(默认阻止策略)
netsh advfirewall set allprofiles firewallpolicy inboundblock,outboundallow
# 仅允许指定 IP 访问 RDP(3389)
netsh advfirewall firewall add rule \
name="RDP-from-Office" \
dir=in \
action=allow \
enable=yes \
protocol=tcp \
localport=3389 \
remoteip=203.0.113.0/24 # 仅允许办公室 IP 段
# 禁止特定程序联网
netsh advfirewall firewall add rule \
name="Block-P2P" \
dir=out \
action=block \
enable=yes \
program="C:\Tools\p2p.exe"
# 限制 SSH 仅对运维网段开放
netsh advfirewall firewall add rule \
name="SSH-from-Admin" \
dir=in \
action=allow \
enable=yes \
protocol=tcp \
localport=22 \
remoteip=10.10.0.0/16
# 允许 Ping(ICMP)
netsh advfirewall firewall add rule \
name="Allow-Ping" \
dir=in \
action=allow \
enable=yes \
protocol=icmpv4
5.2 导出前检查清单
导出规则前,建议先做以下检查:
✅ 检查是否有重复规则(同名规则会冲突)
✅ 检查规则方向是否正确(in=入站,out=出站)
✅ 检查 IP 范围是否过宽(如 0.0.0.0/0 表示允许全网)
✅ 检查是否有过于宽松的 any/any 规则
✅ 确认 profile 设置(domain/private/public)
5.3 查看当前宽松规则
powershell
# 查找允许所有流量的规则(高危)
Get-NetFirewallRule | Where-Object {
$_.Action -eq 'Allow' -and
($_.Enabled -eq $true)
} | Get-NetFirewallPortFilter | Where-Object {
$_.LocalPort -eq 'Any' -or $_.RemotePort -eq 'Any'
} | Select-Object -First 20
六、常见问题
Q1:导出的规则在新机器上执行报错?
A: 部分规则含绝对路径(如用户目录 C:\Users\xxx\),换了机器路径不匹配时该规则会失败。建议用 %USERPROFILE% 环境变量替代绝对路径:
powershell
# 修改前
program="C:\Users\Administrator\...\app.exe"
# 修改后
program="%USERPROFILE%\...\app.exe"
Q2:导入时会不会覆盖现有规则?
A: 导出的 netsh 脚本不会覆盖 现有规则,它只是用 add rule 追加规则。如果需要全新导入,先清空现有规则:
powershell
# 清空所有自定义规则(慎用!)
netsh advfirewall reset
Q3:macOS/Linux 能用吗?
A: 该工具依赖 Windows 防火墙 API,只能在 Windows 上运行。macOS 请使用 pfctl / ipfw,Linux 请使用 iptables / nftables。
七、总结
| 痛点 | 解决方案 |
|---|---|
| 导出格式不可读 | ✅ 导出为可读的 netsh 脚本 |
| 导入会覆盖规则 | ✅ 使用 add rule 追加,安全 |
| 规则迁移困难 | ✅ 脚本复制即可在新机器执行 |
| 无法版本管理 | ✅ 纳入 Git 仓库管理 |
| 不懂 netsh 语法 | ✅ 通过导出结果学习命令写法 |
这个工具虽然小,但解决的都是真实痛点。对于安全工程师、运维人员来说,将防火墙规则纳入版本控制、做到可备份可迁移,是安全运营的基本功。
工具地址: https://github.com/hyang0/export_firewall_rules
适用系统: Windows 10/11, Windows Server 2016+
依赖环境: Python 3.x
开源协议: MIT License