新装好的 Windows Server 上跑了 Web 服务,本机 curl http://localhost 正常,换台机器访问却超时;运维同事为了省事直接把防火墙整个关掉,服务通了,但第二天安全扫描报告上多了一堆高危项。这两个场景,几乎是每台 Windows 服务器都会经历的阶段。
Windows Defender 防火墙(Windows Defender Firewall,原名 Windows Firewall)是系统自带的状态包过滤防火墙,功能足够应付绝大多数场景:按端口放行、按来源 IP 限制、按程序管控出站、按网络位置切换策略。本文覆盖图形界面、netsh advfirewall 与 PowerShell NetSecurity 三种配置方式,并给出可直接复用的规则模板。
一、基础概念:配置文件、默认动作与规则优先级
1.1 三个网络配置文件
防火墙配置文件(Profile)根据服务器接入的网络位置自动切换,这是很多人配置“生效了但没完全生效”的根源:
| Profile | 适用网络位置 | 典型场景 | 注意 |
|---|---|---|---|
| Domain | 能联系到域控制器 | 加入域的内网服务器 | 域内策略可能被 GPO 覆盖 |
| Private | 标记为“专用网络” | 工作组环境的内部网络 | 需手动设置网络位置 |
| Public | 默认/未识别网络 | 直接暴露公网的服务器 | 最严格,最容易漏配规则 |
如果服务器是公用网络位置而你只配了 Domain 规则,结果就是连不上。查看与修改方式:
# 查看当前网络位置类别与防火墙状态 Get-NetConnectionProfile | Select-Object Name, InterfaceAlias, NetworkCategory, IPv4Connectivity Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction # 把网络位置改为专用(需要管理员权限,Server 2012+) Set-NetConnectionProfile -InterfaceAlias "Ethernet" -NetworkCategory Private # 打开/关闭防火墙(三个 profile 可分别控制) Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled True Set-NetFirewallProfile -Profile Public -DefaultInboundAction Block -DefaultOutboundAction Allow
REM CMD 等价命令 netsh advfirewall show allprofiles netsh advfirewall set allprofiles state on netsh advfirewall set allprofiles firewallpolicy blockinbound,allowoutbound netsh advfirewall set currentprofile state on
1.2 规则优先级
- 阻止规则优先于允许规则。只要有一条匹配的 Block 规则,Allow 规则再多也不生效。
- 范围更具体的优先。限定远程 IP 的规则优先于
remoteip=any。 - 默认动作兜底:入站默认阻止(Block),出站默认允许(Allow)。所以“开端口”实际是在写入站 Allow 规则。
- 防火墙是有状态的:放行入站请求后,对应的返回流量自动允许,不需要再配出站规则。
二、图形界面:高级安全防火墙 wf.msc
带桌面体验(Desktop Experience)的服务器,最直观的方式是打开 高级安全 Windows Defender 防火墙:wf.msc,或从 服务器管理器 → 本地服务器 → Windows Defender 防火墙 进入。基础版 firewall.cpl 只能开关和放行程序,功能较弱。
新建入站规则的路径:右键“入站规则” → 新建规则 → 选择类型(端口 / 程序 / 预定义 / 自定义)→ 协议与端口 → 操作(允许连接 / 只允许安全连接 / 阻止连接)→ 配置文件 → 名称。关键的两处细节:
- 端口类型选 TCP 还是 UDP,DNS 用 53/UDP,RDP 用 3389/TCP 和 3389/UDP(新版 RDP 也走 UDP)。
- “作用域”页可以设置远程 IP 地址,这是限制访问来源最实用的功能——只允许公司出口 IP 访问 3389,比改端口安全得多。
域环境下,推荐通过组策略统一管理:gpmc.msc → 计算机配置 → 策略 → Windows 设置 → 安全设置 → 高级安全 Windows Defender 防火墙。在 GPO 里配的规则会覆盖本地配置,本地改不动时要检查 GPO。
三、CMD 方式:netsh advfirewall
netsh advfirewall firewall 是最经典的命令行配置方式,Server 2008 起可用,脚本兼容性好。
REM 1. 放行入站 TCP 80(Web) netsh advfirewall firewall add rule name="Web-HTTP-80" dir=in action=allow protocol=TCP localport=80 REM 2. 放行 UDP 53(DNS) netsh advfirewall firewall add rule name="DNS-53-UDP" dir=in action=allow protocol=UDP localport=53 REM 3. 放行一段端口(被动 FTP、SQL 等) netsh advfirewall firewall add rule name="Passive-FTP" dir=in action=allow protocol=TCP localport=50000-50100 REM 4. 放行 RDP 并限制来源 IP(强烈推荐) netsh advfirewall firewall add rule name="RDP-From-Office" dir=in action=allow protocol=TCP localport=3389 remoteip=203.0.113.0/24,198.51.100.55 REM 5. 允许 ICMPv4 回显(允许被 ping) netsh advfirewall firewall add rule name="Allow-ICMPv4-Echo" dir=in action=allow protocol=icmpv4:8,any REM 6. 阻止某个程序出站(防止软件回连) netsh advfirewall firewall add rule name="Block-App-Outbound" dir=out action=block program="C:\tools\oldagent.exe"
REM 查看规则 netsh advfirewall firewall show rule name=all netsh advfirewall firewall show rule name="Web-HTTP-80" netsh advfirewall firewall show rule group="remote desktop" REM 修改规则(改名、改端口、启停) netsh advfirewall firewall set rule name="Web-HTTP-80" new localport=8080 netsh advfirewall firewall set rule name="Web-HTTP-80" new enable=no REM 删除规则 netsh advfirewall firewall delete rule name="Web-HTTP-80" netsh advfirewall firewall delete rule name="Web-HTTP-80" protocol=TCP localport=80 REM 启用预定义规则组(远程桌面、文件和打印机共享、Windows 远程管理等) netsh advfirewall firewall set rule group="remote desktop" new enable=Yes netsh advfirewall firewall set rule group="Windows Remote Management" new enable=Yes netsh advfirewall firewall set rule group="文件和打印机共享" new enable=Yes
REM 开启被丢弃连接的日志(排障关键) netsh advfirewall set allprofiles logging droppedconnections enable netsh advfirewall set allprofiles logging filename %systemroot%\system32\LogFiles\Firewall\pfirewall.log netsh advfirewall set allprofiles logging maxfilesize 32767 REM 备份与恢复配置 netsh advfirewall export "D:\bak\fwrules.wfw" netsh advfirewall import "D:\bak\fwrules.wfw" REM 恢复默认(谨慎,会清空所有自定义规则) netsh advfirewall reset
四、PowerShell 方式:NetSecurity 模块
Server 2012 / PowerShell 3.0 起有 NetSecurity 模块,命令动词清晰、支持管道,适合写成配置脚本或纳入自动化(DSC、Ansible)。
# 新建入站放行规则(等价于上面 netsh 的第 1 条) New-NetFirewallRule -DisplayName "Web-HTTP-80" -Direction Inbound ` -Protocol TCP -LocalPort 80 -Action Allow -Profile Any # 限制来源 IP(RemoteAddress 支持 IP、子网、范围) New-NetFirewallRule -DisplayName "RDP-From-Office" -Direction Inbound ` -Protocol TCP -LocalPort 3389 -Action Allow ` -RemoteAddress 203.0.113.0/24,198.51.100.55 -Profile Any # 只允许访问本机的特定本地地址(多网卡服务器常用) New-NetFirewallRule -DisplayName "MySQL-Intranet-Only" -Direction Inbound ` -Protocol TCP -LocalPort 3306 -Action Allow -LocalAddress 10.0.0.5 # 阻止程序出站 New-NetFirewallRule -DisplayName "Block-OldAgent-Out" -Direction Outbound ` -Program "C:\tools\oldagent.exe" -Action Block -Profile Any
# 查询规则(名字 vs DisplayName 要注意:cmdlet 用 -Name 匹配 Name 字段)
Get-NetFirewallRule -DisplayName "Web-HTTP-80" | Format-List *
# 按组查看
Get-NetFirewallRule -DisplayGroup "Remote Desktop" |
Select-Object Name, DisplayName, Enabled, Direction, Action | Format-Table -AutoSize
# 只看已启用的入站放行规则 + 端口(审计"对外开了哪些口")
Get-NetFirewallRule -Direction Inbound -Action Allow -Enabled True |
ForEach-Object {
$port = $_ | Get-NetFirewallPortFilter
$addr = $_ | Get-NetFirewallAddressFilter
[PSCustomObject]@{
Name = $_.DisplayName
Proto = $port.Protocol
Port = $port.LocalPort
Remote = $addr.RemoteAddress
Profile= $_.Profile
}
} | Sort-Object Port | Format-Table -AutoSize
# 启用 / 禁用 / 删除 Enable-NetFirewallRule -DisplayName "Web-HTTP-80" Disable-NetFirewallRule -DisplayName "Web-HTTP-80" Set-NetFirewallRule -DisplayName "Web-HTTP-80" -NewLocalPort 8080 Remove-NetFirewallRule -DisplayName "Web-HTTP-80" # 配置日志 Set-NetFirewallProfile -Profile Public -LogBlocked True -LogMaxSizeKilobytes 32767 ` -LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log"
4.1 常见场景规则速查
| 场景 | 协议/端口 | 建议配置 | 安全提示 |
|---|---|---|---|
| 远程桌面 RDP | TCP/UDP 3389 | 限制公司出口 IP 段 | 不要对 0.0.0.0/0 开放 |
| Web 站点 HTTP/HTTPS | TCP 80 / 443 | 对 Any 开放,Profile 选 Any | 配置 WAF 或限速 |
| SQL Server | TCP 1433 | 仅限内网网段或应用服务器 IP | 绝不对公网开放 |
| MySQL / Redis | TCP 3306 / 6379 | 限定 LocalAddress 为内网网卡 | Redis 未授权访问风险极高 |
| WinRM 远程管理 | TCP 5985 / 5986 | 限定管理网段,优先 5986(HTTPS) | 5985 明文传输 |
| SMB 文件共享 | TCP 445 | 仅内网,禁用公网网卡 | SMB 漏洞高发,务必限制来源 |
| ICMP ping | ICMPv4 Type 8 | 可选,便于监控探活 | 放行与否均安全,看监控需求 |
五、排错:规则配了为什么不生效
- Profile 不匹配:规则只写在 Domain,服务器实际是 Public。创建时显式加
-Profile Any。 - 被阻止规则覆盖:存在匹配的 Block 规则。用
Get-NetFirewallRule -Direction Inbound -Action Block -Enabled True检查。 - GPO 覆盖本地配置:执行
gpresult /h C:\gpo.html,或Get-NetFirewallRule -PolicyStore ActiveStore看生效策略来源。 - 服务没监听在正确的网卡:防火墙通了但
Get-NetTCPConnection显示 LocalAddress 是 127.0.0.1。 - 云平台安全组没放行:云主机的安全组独立于操作系统防火墙,两层都要开。这是最高频的漏配点。
- 第三方安全软件接管了防火墙:部分杀软/主机安全 Agent 会自注册为防火墙提供程序,系统自带规则不生效。
- 怀疑被防火墙丢包:开启 droppedconnections 日志,看
pfirewall.log里是否有对应DROP记录;或用Test-NetConnection从客户端验证。 - IPsec / 连接安全规则干扰:若规则选了“只允许安全连接”,而未配 IPsec,连接会被静默丢弃。
# 一条命令看"当前生效"的规则(含 GPO 下发)
Get-NetFirewallRule -PolicyStore ActiveStore -Direction Inbound -Enabled True |
Where-Object { $_.Action -eq 'Allow' } | Select-Object DisplayName, Profile, Direction
# 检查防火墙日志中最近的丢弃记录
Get-Content "$env:SystemRoot\System32\LogFiles\Firewall\pfirewall.log" -Tail 30
六、配置步骤清单
- 确认服务器网络位置类别(
Get-NetConnectionProfile),决定规则要落在哪个 Profile。 - 确认默认策略:入站 Block、出站 Allow(
Get-NetFirewallProfile)。 - 梳理需要对外开放的端口清单,逐条明确协议、端口、来源 IP 范围。
- 用
New-NetFirewallRule或netsh advfirewall firewall add rule创建规则,务必加-Profile Any。 - 管理类端口(RDP / WinRM / 数据库)必须限制 RemoteAddress。
- 导出配置备份:
netsh advfirewall export。 - 从客户端用
Test-NetConnection IP -Port逐条验证放行结果。 - 同时检查云平台安全组 / 硬件防火墙 / ACL 是否放行。
- 开启被丢弃连接日志,便于日后排障。
- 每季度复核一次规则清单,清理已下线服务遗留的放行规则。
小结与避坑建议
Windows Server 配置防火墙规则,日常掌握两条命令就能覆盖九成需求:CMD 用 netsh advfirewall firewall add rule name="..." dir=in action=allow protocol=TCP localport=80,PowerShell 用 New-NetFirewallRule -DisplayName ... -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow -Profile Any。真正容易被忽略的不是“怎么放行”,而是“放行给谁”——限制来源 IP 的收益远大于改端口。
几条值得写进规范的避坑点:
- 改远程桌面端口不能替代访问控制。端口扫描器几分钟就能找到新端口,限定来源 IP 或走 VPN 才是正解。
- 不要长期关闭防火墙。定位问题时可以临时关闭,但务必在验证后恢复,并改为添加精确规则。
- 云主机记得两层都配。安全组(外层)+ 系统防火墙(内层),少配一层就会出现“本机通、外部不通”。
- 出站管控别忘。绝大多数人只管入站,但出站限制是阻止木马回连、挖矿外联的有效手段,重要服务器上建议默认阻断出站再逐条放行。
- 修改前先导出配置。
netsh advfirewall export一条命令,能在误操作后几秒恢复。 - 域环境优先用 GPO 统一管理,避免逐台手工配置产生漂移;本地改不动时先想到 GPO 覆盖。
- 规则要有命名规范。用“服务-协议-端口-来源”的格式(如
RDP-TCP-3389-Office),半年后做审计时才不会对着几十条无意义的名字发呆。
企业QQ咨询




