Windows Server如何配置防火墙规则?端口放行与访问限制教程

新装好的 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 常见场景规则速查

场景协议/端口建议配置安全提示
远程桌面 RDPTCP/UDP 3389限制公司出口 IP 段不要对 0.0.0.0/0 开放
Web 站点 HTTP/HTTPSTCP 80 / 443对 Any 开放,Profile 选 Any配置 WAF 或限速
SQL ServerTCP 1433仅限内网网段或应用服务器 IP绝不对公网开放
MySQL / RedisTCP 3306 / 6379限定 LocalAddress 为内网网卡Redis 未授权访问风险极高
WinRM 远程管理TCP 5985 / 5986限定管理网段,优先 5986(HTTPS)5985 明文传输
SMB 文件共享TCP 445仅内网,禁用公网网卡SMB 漏洞高发,务必限制来源
ICMP pingICMPv4 Type 8可选,便于监控探活放行与否均安全,看监控需求

五、排错:规则配了为什么不生效

  1. Profile 不匹配:规则只写在 Domain,服务器实际是 Public。创建时显式加 -Profile Any。
  2. 被阻止规则覆盖:存在匹配的 Block 规则。用 Get-NetFirewallRule -Direction Inbound -Action Block -Enabled True 检查。
  3. GPO 覆盖本地配置:执行 gpresult /h C:\gpo.html,或 Get-NetFirewallRule -PolicyStore ActiveStore 看生效策略来源。
  4. 服务没监听在正确的网卡:防火墙通了但 Get-NetTCPConnection 显示 LocalAddress 是 127.0.0.1。
  5. 云平台安全组没放行:云主机的安全组独立于操作系统防火墙,两层都要开。这是最高频的漏配点。
  6. 第三方安全软件接管了防火墙:部分杀软/主机安全 Agent 会自注册为防火墙提供程序,系统自带规则不生效。
  7. 怀疑被防火墙丢包:开启 droppedconnections 日志,看 pfirewall.log 里是否有对应 DROP 记录;或用 Test-NetConnection 从客户端验证。
  8. 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

六、配置步骤清单

  1. 确认服务器网络位置类别(Get-NetConnectionProfile),决定规则要落在哪个 Profile。
  2. 确认默认策略:入站 Block、出站 Allow(Get-NetFirewallProfile)。
  3. 梳理需要对外开放的端口清单,逐条明确协议、端口、来源 IP 范围。
  4. 用 New-NetFirewallRule 或 netsh advfirewall firewall add rule 创建规则,务必加 -Profile Any。
  5. 管理类端口(RDP / WinRM / 数据库)必须限制 RemoteAddress。
  6. 导出配置备份:netsh advfirewall export。
  7. 从客户端用 Test-NetConnection IP -Port 逐条验证放行结果。
  8. 同时检查云平台安全组 / 硬件防火墙 / ACL 是否放行。
  9. 开启被丢弃连接日志,便于日后排障。
  10. 每季度复核一次规则清单,清理已下线服务遗留的放行规则。

小结与避坑建议

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),半年后做审计时才不会对着几十条无意义的名字发呆。