做桌面运维或者后端开发的人,几乎都碰到过同一个场景:服务在服务器本机 curl 一下返回 200,换成同事的电脑访问就超时,排查半天代码没问题、网络也通,最后发现是 Windows 防火墙把入站连接挡在了门外。Windows 防火墙这东西,说简单也简单,点两下“允许应用通过”就能用;说复杂也复杂,配置文件、入站出站、作用域、协议端口、组策略优先级,一层套一层,很多人用了好几年系统,也只知道“关掉它就能连上”。这篇就把 Windows 防火墙从最基础的概念讲到可落地的配置方法,包括图形界面怎么点、命令行怎么写、规则怎么验证、出问题怎么查,零基础能跟着做,有经验的也能从里面挑到几条平时容易忽略的细节。
1. 先弄明白:Windows 防火墙拦的到底是什么
1.1 三个配置文件,共用一套规则引擎
很多人第一次打开“高级安全 Windows 防火墙”的界面,看到左上角写着“域配置文件”“专用配置文件”“公用配置文件”,会以为系统里装了三套防火墙。其实不是,底层只有一个过滤引擎,只是把规则按“当前这台机器所处的网络环境”分成了三个配置档。系统判断你连上的是哪类网络,就套用对应那一档的策略。
这三档的默认严格程度不一样,理解它们的差别,比背命令重要得多:
| 配置文件 | 什么时候生效 | 默认入站策略 | 典型使用场景 |
|---|---|---|---|
| 域 | 计算机加入了域,且能联系到域控制器 | 阻止 | 办公内网,有统一策略下发 |
| 专用 | 用户手动把网络标记为“专用” | 阻止 | 家里、个人工作室、可信局域网 |
| 公用 | 连接咖啡厅、酒店、机场这类网络 | 阻止(更严) | 陌生网络,尽量减少暴露面 |
关键在于:一条规则如果只勾了“专用”,那这台机器一旦被系统判定为“公用网络”,这条规则就等于不存在。我见过太多“昨天还能访问,今天突然不通”的案例,最后一查,是系统把网卡的网络位置从“专用”改成了“公用”——换了路由器、换了网段、或者接了个新的无线热点,系统就会重新判定。所以配置规则时,除非你非常确定使用环境,否则建议至少勾上“专用”和“域”,公用那一栏谨慎对待。
1.2 入站默认拦、出站默认放,这个默认值不是随便定的
Windows 防火墙的出厂设定是“入站阻止、出站允许”。这个设计逻辑很直白:从外面主动连进来的连接,你不知道它是善意还是恶意,先拦下来;从本机发出去的连接,是你自己主动发起的,默认信任。这个默认值决定了绝大多数“连不上”的问题都发生在入站方向。
理解了这一点,排查思路就清晰了:本机访问本机没问题,别的机器访问本机不通,先怀疑入站规则;本机能访问别人、别人访问本机不通,也是入站;反过来,如果本机连不上外部的某个服务,才需要去看出站规则——而出站规则默认是放行的,除非有人手动改过,或者装了某些安全软件接管了策略。
这里有个容易被忽略的点:“本机访问本机”走的是回环地址,通常不经过防火墙过滤。所以你在服务器上curl 127.0.0.1:8080通了,完全不能证明防火墙放行了 8080,必须用另一台机器测,或者用本机的局域网 IP 去测(有些情况下本机访问自己的局域网 IP 也会走过滤,但不同系统版本行为不完全一致,别拿这个当准绳)。这个坑我踩过不止一次,后来养成习惯:验证端口一律从另一台机器发起。
1.3 一条连接要过几道关:规则匹配的先后顺序
规则多了以后,冲突是必然会出现的:一条规则允许 8080,另一条规则阻止所有入站,到底听谁的?Windows 防火墙的匹配逻辑大致是这样的顺序:
- 显式阻止规则优先。只要有一条规则明确写了“阻止”,且匹配上了这条连接,就直接拒绝,不会再去看允许规则。
- 要求安全连接的规则优先。如果规则里设置了“只允许经过身份验证的 IPsec 连接”,这类规则优先级高于普通规则。
- 更具体的规则优先于更宽泛的规则。比如一条规则限定了“程序 + 端口 + 远程地址”,另一条只限定了“端口”,前者更具体,优先命中。
这个顺序说明一个事:“阻止”是一票否决。所以拿“阻止所有入站”当兜底策略的时候要特别小心,它会把你精心配置的允许规则一起盖掉。实际运维中更稳妥的做法是反过来——默认策略保持“阻止”,然后只写精确的允许规则,不要额外加宽泛的阻止规则去“加强安全”,那样只会给自己挖坑。
1.4 图形界面和命令行操作的是同一份数据
新手常有的疑问是:我在“Windows 防火墙”主界面点了“允许应用通过防火墙”,和我在“高级安全”里新建的入站规则,是一回事吗?答案是同一份规则库,但入口不同、能看到的东西也不同。
主界面那个“允许应用通过防火墙”的列表,只显示程序类规则,也就是按 exe 路径放行的规则,端口规则、服务规则、自定义协议规则在这个列表里根本看不见。这就导致一个经典误会:有人在主界面把某个程序勾上了,以为万事大吉,结果程序实际监听的是一个固定端口,而防火墙拦的是端口层面的连接,勾程序没用——因为程序可能被系统识别成了另一个路径,或者规则只对某个配置文件生效。
命令行(netsh 和 PowerShell)则能直接操作规则库的全部内容,包括规则的名称、描述、方向、协议、端口、作用域、配置文件、是否启用。所以真正要“精通”,主界面点一点只是入门,最终还是要落到命令行和高级安全界面。
2. 动手前的准备:先给自己留条后路
2.1 三十秒摸清当前家底
改防火墙之前,先看清楚现在是什么状态,别上来就动手。我习惯用一条命令把三个配置文件全看一遍:
netsh advfirewall show allprofiles输出里重点看四行:状态(开/关)、入站默认行为、出站默认行为、本地防火墙规则是否被组策略覆盖。如果状态显示“关闭”,先别急着打开——很多第三方安全软件接管防火墙后会把系统自带的那一套关掉,这时候你在系统防火墙里加规则是无效的,得去第三方软件里配。这一点不搞清楚,后面所有操作都是白做。
再看一眼现有规则有多少条:
Get-NetFirewallRule | Measure-Object正常一台用了一段时间的机器,规则数量在几十到几百条之间都算正常。如果发现几千条,多半是某些安装程序反复添加规则没清理,后面可以顺手治理一下。另外,装的软件越多,重复规则、失效规则越多,规则库越乱,排查问题时越容易看花眼,所以定期清理是有必要的。
2.2 导出策略做快照
这一步是很多教程会跳过、但实际最该做的一步。防火墙配置改坏了,轻则某个服务连不上,重则远程桌面直接断掉,人又不在机器旁边,只能跑去现场。所以改之前先导出一份:
netsh advfirewall export "D:\fw-backup-20250101.wfw"这个.wfw文件就是当前全部防火墙策略的快照,包含所有规则和配置文件设置。真出了事,一条命令就能回滚:
netsh advfirewall import "D:\fw-backup-20250101.wfw"提示:导出文件不要放在系统盘根目录或者临时目录,最好放一个固定路径,并且文件名带上日期。养成“改前导出、改后验证”的习惯,比任何排错技巧都管用。
顺带说一句,netsh advfirewall reset这条命令能把防火墙恢复出厂设置,看着很爽,但它会把所有自定义规则一并清掉,包括你自己加的、软件装的。除非是实在没办法的救命场景,否则不要随手用。
2.3 四条不能碰的红线
- 不要为了“先通了再说”直接把防火墙关掉。关掉确实能立刻解决连通性问题,但同时也把整台机器暴露在所在网络里。而且很多人关了之后忘了开,一忘就是几个月。
- 不要用“任何”作为远程地址作用域。新建规则时“作用域”页签里如果远程 IP 填“任何”,等于对全世界开放这个端口。正确做法是填具体网段,比如
192.168.1.0/24。 - 不要在远程会话里改远程桌面相关规则。远程连着一台机器,去改 3389 的入站规则,一旦规则写错,当前会话立刻断,而且再也连不回去。要改就先加一条允许规则,验证能连上,再去动旧的。
- 不要同时用第三方安全软件和系统防火墙管同一件事。两套策略叠加,行为很难预测,排查成本翻倍。定好一套主用的,另一套明确让位。
3. 图形界面实操:放行程序、开放端口、收窄范围
3.1 放行一个程序:最常用也最容易点错的地方
路径是:控制面板 → 系统和安全 → Windows 防火墙 → 允许应用通过防火墙 → 更改设置 → 允许其他应用。选好 exe 路径,勾上需要的配置文件,确定。
这一步看起来简单,实际有三个坑:
第一,勾选的配置文件决定生效范围。列表里每个程序后面有“专用”和“公用”两列复选框,只勾“专用”的话,机器一旦被判定为公用网络,这个程序立刻被拦。开发机上经常出现“接公司网能用、回家不能用”,就是这个原因。
第二,程序路径变了规则就失效。有些程序升级后会换安装目录,旧规则指向的 exe 已经不存在,新路径没有对应规则,表现就是“明明勾了还是连不上”。所以程序类规则要尽量放在固定路径下,升级后回头检查一下。
第三,这个界面只管程序,不管端口。如果程序是作为服务跑的,或者监听端口的行为由配置文件决定,光勾程序不一定管用。判断方法很简单:用netstat -ano | findstr ":端口号"看是哪个进程在监听,确认进程路径和规则里的一致,再决定是加程序规则还是加端口规则。
3.2 开放一个端口:新建入站规则的完整流程
这是最核心的操作。路径:控制面板 → 系统和安全 → Windows 防火墙 → 高级设置 → 入站规则 → 新建规则。
向导里选“端口”,下一步,选 TCP 或 UDP。这里的选择依据是服务实际使用的协议,不是随便选一个:Web 服务、数据库、远程桌面基本都是 TCP;DNS、某些游戏服务、流媒体用的是 UDP;有些服务两种都用,那就得建两条规则。选错了协议,规则等于没加。
然后填端口。单个端口直接写数字,多个端口用逗号隔开(如8080,8081),连续范围用减号(如8000-8100)。这里有个实操建议:能用单个端口就不要开范围,能用范围就不要用“所有端口”。开放范围越大,被扫描到的概率越高,而且出了问题也难定位到底是哪个端口在惹事。
下一步选“允许连接”,再下一步勾配置文件。默认三个都勾着,我的习惯是至少取消“公用”,或者干脆只留“专用”,除非这个服务确实需要在不可信网络下对外提供访问。最后起名字,名字要能看懂,别用“新建规则 1”这种默认名——三个月后你自己都不记得它是干嘛的。
3.3 把口子收窄:作用域与配置文件的两个开关
规则建完不要急着点完成,回到规则列表,双击刚建的那条,看“作用域”页签。这里有两个地方值得改:
远程 IP 地址。默认是“任何 IP 地址”,改成“下列 IP 地址”,把可信网段填进去。比如只允许办公网访问,就填192.168.10.0/24。这个改动几乎不影响正常使用,但能把暴露面缩小一个数量级。如果服务只给本机或者某几台机器用,直接填那几个 IP,效果更好。
本地 IP 地址。多网卡的机器(比如同时接了内网和一条对外线路)可以在这里限定规则只对某块网卡生效,避免服务在不该暴露的网卡上被访问到。这个功能用的人不多,但在多网卡环境下非常实用。
配置文件的勾选也在规则属性里,和向导里那一步是同一份设置,改完记得点应用。有个细节:一条规则可以同时勾多个配置文件,但三个配置档的严格程度不同,如果你在“公用”下也放行了某个管理端口,等于在陌生网络里也开着门,这种情况建议单独建一条只在“专用”生效的规则,而不是在一条规则里全勾上。
3.4 出站规则:什么时候真的需要管
出站默认放行,绝大多数人一辈子不用碰。但有几类场景确实需要配出站规则:
一是限制某些程序外联。比如某台机器只允许业务程序访问指定的几个外部地址,其他一律不放,这时候就要把出站默认行为改成“阻止”,再逐条放行。这个操作风险很高,改之前一定要确认自己不会被自己的规则锁死(比如把系统更新、时间同步、DNS 查询也一起拦了)。
二是排查“到底是进不来还是出不去”。有时候服务连不上,不是对方拦了你,而是你这边的出站被某个安全软件限制了。临时加一条出站允许规则做对照测试,能快速定位方向。
三是合规要求。某些环境要求对出站也做白名单管理,这时候规则数量会非常多,必须靠脚本批量维护,手点不现实。
我的建议是:出站策略保持默认放行,除非有明确需求,不要主动去改。改出站规则的翻车率比改入站高得多,因为出站涉及系统自身的各种后台行为,你很难全部预判到。
3.5 规则属性四个页签逐项拆解
一条规则的属性面板有五个页签,逐个说一下实际用途:
常规:名称、描述、是否启用。描述别偷懒,写清楚“谁加的、为什么加、什么时候可以删”,这是给未来的自己看的。
程序和服务:可以指定“此程序”的路径,也可以指定“此服务”。指定服务的好处是规则跟着服务走,服务停了规则不生效,比按端口放行更精确。系统服务可以在下拉里选,第三方服务要先注册成服务才能选到。
协议和端口:协议类型、本地端口、远程端口、ICMP 设置。这里有个隐藏功能——选“ICMPv4”可以放行 ping。默认情况下 Windows 防火墙是拦 ping 的,所以“机器能访问服务但 ping 不通”是正常现象,不是故障。要放行 ping 就在这里配,但一般没必要,ping 不通不影响业务。
作用域:前面讲过,本地 IP、远程 IP。
高级:配置文件、接口类型、边缘遍历。接口类型可以限定“局域网”“无线”“远程访问”,边缘遍历一般不用开,除非明确知道自己在做什么。
4. 命令行与脚本:让配置可复制、可审计
4.1 netsh:老而稳,一行一条规则
图形界面点十次的操作,命令行一行就完事,而且能写进脚本、能进版本库、能给同事复制。netsh 是最通用的方式,从老版本系统一直兼容到现在:
netsh advfirewall firewall add rule name="Web-8080-In" dir=in action=allow protocol=TCP localport=8080 remoteip=192.168.1.0/24 profile=private参数含义拆开看:dir=in是入站,action=allow是允许,protocol=TCP是协议,localport=8080是本地端口,remoteip是远程地址范围,profile=private指定只对专用配置文件生效。一条命令把方向、动作、协议、端口、作用域、配置文件全定死了,比在界面上点五步更不容易漏。
常用命令整理成表:
| 操作 | 命令 |
|---|---|
| 查看所有规则 | netsh advfirewall firewall show rule name=all |
| 查看指定规则 | netsh advfirewall firewall show rule name="Web-8080-In" |
| 删除规则 | netsh advfirewall firewall delete rule name="Web-8080-In" |
| 启用/禁用规则 | netsh advfirewall firewall set rule name="Web-8080-In" new enable=no |
| 修改规则端口 | netsh advfirewall firewall set rule name="Web-8080-In" new localport=9090 |
| 查看配置文件状态 | netsh advfirewall show allprofiles |
| 导出策略 | netsh advfirewall export "D:\fw.wfw" |
| 导入策略 | netsh advfirewall import "D:\fw.wfw" |
这里有个细节要注意:set rule在规则名重复的时候会一次改掉所有同名规则。所以规则命名必须唯一,加前缀、加端口号、加用途,别图省事。
4.2 PowerShell:拿对象、做筛选、批量改
规则多了以后,netsh 的文本输出不好处理,PowerShell 的对象模型就舒服多了。新建一条规则:
New-NetFirewallRule -DisplayName "Web-8080-In" ` -Direction Inbound ` -Action Allow ` -Protocol TCP ` -LocalPort 8080 ` -RemoteAddress 192.168.1.0/24 ` -Profile Private ` -Description "业务服务端口,仅办公网可访问"查规则可以组合筛选,比如找出所有已启用、方向为入站、动作为允许的规则:
Get-NetFirewallRule -Enabled True -Direction Inbound -Action Allow | Select-Object DisplayName, Profile, Description想找某条规则对应的端口,需要再查关联的端口过滤器:
Get-NetFirewallRule -DisplayName "Web-8080-In" | Get-NetFirewallPortFilter这个“规则对象 + 过滤器对象”的两段式结构,刚开始会觉得绕,用熟了会发现很合理:一条规则可以挂多个过滤器(端口、地址、应用、服务),分开查更清楚。批量清理失效规则也靠它,比如按名称前缀筛出来统一删:
Get-NetFirewallRule -DisplayName "Temp-*" | Remove-NetFirewallRule注意:
Remove-NetFirewallRule没有回收站,删了就没了。执行前先用同样的筛选条件跑一遍Select-Object DisplayName看清楚要删哪些,确认无误再把管道接到删除命令上。
4.3 导入导出:做一套自己的配置模板
反复装机的场景很适合做模板:在一台标准机器上把规则配好,导出.wfw,新机器导入,再根据实际情况微调。导入会覆盖当前策略,所以顺序上一定是“先导出备份,再导入模板”。
如果是多台机器要配同一套规则,更推荐把命令写成脚本,而不是分发.wfw文件。原因是脚本可读、可改、可进版本库,出了问题能 diff 出改了什么;.wfw是二进制文件,出问题只能整体回滚。一个简单的脚本骨架长这样:
$rules = @( @{ Name="App-A-8080-In"; Port=8080; Remote="192.168.1.0/24" }, @{ Name="App-B-9090-In"; Port=9090; Remote="192.168.2.0/24" } ) foreach ($r in $rules) { if (-not (Get-NetFirewallRule -DisplayName $r.Name -ErrorAction SilentlyContinue)) { New-NetFirewallRule -DisplayName $r.Name -Direction Inbound -Action Allow ` -Protocol TCP -LocalPort $r.Port -RemoteAddress $r.Remote -Profile Private } }这段脚本的核心是那个if (-not ...)判断:先查规则在不在,不在才创建,避免重复执行时报错。脚本要能反复跑,这是基本要求。
4.4 规则命名与清理:三个月后还能看懂
规则命名这件事,看起来是小事,实际影响巨大。我见过一台机器上有四十多条叫“新建规则”的规则,谁也不敢删,最后只能整体重置。建议用固定格式:用途-端口-方向,比如Web-8080-In、Db-1433-Out、Temp-Debug-9229-In。临时规则统一加Temp-前缀,约定好一周内清理。
清理节奏可以这样定:每季度导出一次规则列表,按名称排序,把带Temp-前缀的、描述为空的、程序路径已经不存在的筛出来,人工确认后删掉。这个动作花不了十分钟,但能避免规则库无限膨胀。
5. 验证与日志:确认规则真的生效了
5.1 三步定位:端口在听吗、规则在吗、配置对吗
规则加完不等于生效,必须验证。我固定用三步:
第一步,确认端口在监听。
netstat -ano | findstr ":8080"或者用 PowerShell 更清晰:
Get-NetTCPConnection -LocalPort 8080 -State Listen如果这一步就没有输出,说明服务根本没起来,跟防火墙一点关系都没有,别再往下查了。这一步能挡掉至少三成的“防火墙问题”。
第二步,确认规则存在且启用。
Get-NetFirewallRule -DisplayName "Web-8080-In" | Format-List DisplayName, Enabled, Direction, Action, Profile重点看Enabled是不是 True,Profile和当前网络类型对不对得上。
第三步,从另一台机器实测。
Test-NetConnection -ComputerName 192.168.1.20 -Port 8080看TcpTestSucceeded是不是 True。这里必须用另一台机器,本机测本机的结果不可信,原因前面说过。
三步走完,问题基本能定位到具体环节:端口没监听是服务问题,规则没启用是配置问题,规则正常但连不通就是作用域或者配置文件的问题。
5.2 打开防火墙日志
有时候规则看起来都对,就是不通,这时候日志是唯一的真相来源。开启方式:
Set-NetFirewallProfile -Profile Domain,Private,Public ` -LogAllowed True -LogBlocked True ` -LogMaxSizeKilobytes 8192 ` -LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log"日志文件默认在C:\Windows\System32\LogFiles\Firewall\pfirewall.log,用记事本打开就能看。每一条被放行或被阻止的连接都会记一行,包含时间、方向、协议、源地址、目标地址、端口、动作。被拦的记录长这样:
2025-01-01 10:23:45 DROP TCP 192.168.1.50 192.168.1.20 54321 8080 - - - - - - - RECEIVE看到DROP就知道确实是被防火墙拦了,再对照源地址和端口,就能判断是哪条规则没匹配上。日志有两个注意点:一是默认大小限制比较小,连接量大的机器很快就会滚掉旧记录,建议调到 8MB 以上;二是日志本身会占磁盘 IO,长期开着对高负载机器有轻微影响,排查完可以关掉。
5.3 用审计日志追查改动
多人共用的机器上,经常出现“规则被谁改了”的扯皮。开启审计策略可以记录防火墙策略的变更事件:
auditpol /set /subcategory:"Filtering Platform Policy Change" /success:enable /failure:enable中文系统里这个子类叫“筛选平台策略更改”,命令里的英文名在中文系统上可能不认,需要先在“本地安全策略 → 审核策略”里找到对应项,或者用子类 GUID。开启后,每次规则增删改都会在事件查看器的安全日志里留一条记录,包含操作账号和时间。这个功能平时不用开,出问题需要追溯时再开,配合前面的备份文件,基本能做到有据可查。
6. 常见问题与排查实录
6.1 速查表
| 现象 | 最可能的原因 | 处理方式 |
|---|---|---|
| 本机能访问,别的机器超时 | 入站规则缺失或作用域限制 | 检查入站规则、远程地址范围 |
| 昨天能用今天不能用 | 网络位置从专用变成公用 | 检查网络配置文件,补勾公用或改回专用 |
| 规则加了还是不生效 | 规则未启用,或程序路径失效 | 查Enabled状态和 exe 路径 |
| ping 不通但服务能用 | 默认拦 ICMP | 属正常现象,需要就单独放行 ICMPv4 |
| 关掉防火墙就正常 | 规则确实没配对 | 别长期关闭,回到规则层面解决 |
| 系统防火墙设置改不动 | 被组策略或第三方软件接管 | 查组策略和第三方安全软件 |
| 远程桌面连不上 | 3389 规则被改,或配置文件不对 | 加允许规则后再动旧规则 |
| 端口范围开放后仍不通 | 协议选错(TCP/UDP) | 确认服务实际协议,必要时建两条 |
6.2 三个踩坑复盘
案例一:开发机换网络后服务失联。某开发者在公司配好了 8080 的入站规则,只勾了“专用”,回家连自家 Wi-Fi 后服务怎么都访问不了。排查了半天代码和端口,最后发现系统把家里网络判定成了“公用”。这类问题的根因不在技术,而在“网络位置”这个概念被忽略了。处理办法要么把家里网络手动改成“专用”,要么在规则里补勾“公用”但同时用远程地址限制到家里网段,两者选一。
案例二:规则名称冲突导致改错对象。某运维用set rule批量改端口,结果机器上有两条同名规则(一条是软件装的,一条是手建的),命令把两条都改了,把软件自带的那条改坏,功能异常。教训是规则名必须唯一,批量操作前先show rule确认命中几条。
案例三:以为关了防火墙就安全了,其实是第三方接管。某同事的机器上服务连不通,他把系统防火墙关了还是不通,一度怀疑是网络设备问题。最后发现装了某安全软件,它接管了过滤功能,系统防火墙的开关形同虚设,规则得在安全软件里配。判断方法很简单:系统防火墙显示关闭,但端口依然被拦,基本就是被接管了。
6.3 一套固定的排查顺序
遇到“连不上”,我固定按这个顺序走,不跳步:
- 服务进程在不在,端口有没有监听(
Get-NetTCPConnection)。 - 从本机用局域网 IP 访问一次,再从另一台机器访问一次,对比结果。
- 查入站规则是否存在、是否启用、配置文件是否匹配当前网络。
- 查作用域里的远程地址有没有把源 IP 排除在外。
- 开日志,看连接是被 DROP 还是根本没到达。
- 确认没有第三方安全软件或组策略覆盖。
这个顺序的价值在于:每一步都能排除掉一类原因,不会在错误的方向上浪费 time。大部分“防火墙问题”其实在第 1 步就结束了。
7. 进阶:把配置变成可复用的基线
7.1 本地组策略统一管
机器多了以后,一台台点不现实。没加入域的环境可以用本地组策略:运行gpedit.msc,路径是计算机配置 → Windows 设置 → 安全设置 → 高级安全 Windows 防火墙。这里能配的东西比控制面板更深,包括三个配置文件的默认行为、日志设置、规则定义。
组策略配的规则优先级高于本地手动配的规则,而且本地用户在控制面板里改不动被策略锁定的项。这既是优点也是坑:优点是能保证基线不被随意改动,坑是接手的人不知道有策略存在,改半天没反应。所以交接机器的时候,一定要说明“防火墙由组策略管理”,不然下一任维护者会疯。
一个最小基线可以这样定:三个配置文件全部启用;入站默认阻止、出站默认允许;日志开启、大小 8MB;关闭“允许本地规则合并”以外的宽松选项;只保留业务必需的入站规则。这套配下来,既不影正常使用,又能挡掉大部分无差别扫描。
7.2 一份可以照抄的基线清单
- 三个配置文件全部启用,不允许为了图方便整体关闭。
- 入站默认阻止,出站默认允许,除非有明确的白名单需求。
- 每条入站规则都必须有明确的作用域,禁止“任何 IP”。
- 公用配置文件下不开放任何管理类端口(远程桌面、数据库、远程管理)。
- 日志开启,大小不低于 8MB,保留周期覆盖一个排查周期。
- 规则命名统一格式,临时规则带统一前缀并约定清理时间。
- 每月导出一次策略快照,存到固定位置。
- 变更前必须导出,变更后必须从另一台机器验证。
这份清单不复杂,难的是坚持。我见过太多环境,出事的时候想回滚,发现根本没有可回滚的快照。
7.3 团队协作里的交接要点
防火墙配置最容易在交接时出问题。给接手的人留下这几样东西,能省掉大量沟通成本:一份当前策略导出文件、一份规则清单(名称、用途、端口、作用域、添加时间)、一份说明文档写清楚哪些规则是业务必需不能删、哪些是临时规则可以清。规则清单可以用一条命令生成:
Get-NetFirewallRule -Direction Inbound -Enabled True | ForEach-Object { $port = ($_ | Get-NetFirewallPortFilter).LocalPort [PSCustomObject]@{ Name = $_.DisplayName Port = $port Profile = $_.Profile Desc = $_.Description } } | Export-Csv "D:\fw-rules.csv" -NoTypeInformation -Encoding UTF8导出的 CSV 直接可以当交接文档用。我个人在实际操作中的体会是,防火墙这类基础设施的配置,价值不在于“配得多精妙”,而在于“别人能不能看懂、能不能安全地改”。规则写得再漂亮,没有描述、没有备份、没有验证记录,换个人接手就是一团乱麻。所以与其追求一次配到完美,不如把命名、备份、验证这三个动作固化下来,长期收益更大。