Windows Server 防火墙操作详解|端口放行、规则管理、排错全能手册

Windows Server 防火墙操作详解|端口放行、规则管理、排错全能手册

前言

在 Windows Server 上部署网站、中间件或数据库时,明明服务已启动,却从外网访问不了?八成是 Windows 防火墙没放行端口

Windows 防火墙默认会阻止所有未经明确允许的入站连接,这是系统安全的第一道屏障。

本篇面向运维新手,涵盖 图形界面命令行(PowerShell) 两种管理方式,从查看规则、放行端口到安全加固、日志排错,一篇文章讲透。

适用版本:Windows Server 2012 R2 / 2016 / 2019 / 2022 及 Windows 10/11 专业版。


一、基础概念速览

1. 防火墙配置文件(Profile)

Windows 防火墙根据网络类型,把规则分成三个配置文件:

配置文件 适用场景 典型网络位置
域(Domain) 电脑加入 Active Directory 域时使用 公司内网
专用(Private) 信任的家庭或办公局域网 内部服务器网络
公用(Public) 不信任的公共网络(机场、咖啡馆) 一般不用在服务器上

在服务器上,网络适配器通常分配为"域"或"专用"配置文件。创建规则时如不特别指定,默认对所有配置文件生效。

2. 入站规则 vs 出站规则

  • 入站规则:控制从外部访问本机的流量 ------ 这是运维最常用的,比如放行网站端口 80、远程桌面 3389。
  • 出站规则:控制本机向外访问的流量 ------ 默认允许所有出站,极少需要修改。

3. 防火墙默认行为

  • 入站:阻止所有未明确放行的连接。
  • 出站:允许所有未明确阻止的连接。

因此,我们要做的核心操作就是:创建入站规则,放行指定端口或程序


二、图形界面操作(适合新手、快速配置)

1. 打开"高级安全 Windows 防火墙"

  • Win + R,输入 wf.msc,回车;
  • 或进入"服务器管理器" → "工具" → "高级安全 Windows 防火墙"。

该控制台分为三栏:入站规则出站规则监视

2. 查看现有规则

  • 点击左侧"入站规则",中间列表会显示所有已配置的规则。
  • 可通过右侧"按配置文件筛选"或"按状态筛选"来缩小范围。
  • 双击任一规则可查看其属性:协议、端口、作用域(IP)、允许的连接等。

3. 新建入站规则 ------ 放行端口(以 8080 为例)

这是最高频的操作。

步骤:

  1. 在左侧选中"入站规则 ",右侧点击"新建规则..."。
  2. 选择规则类型:端口 → 下一步。
  3. 选择协议和端口:
    • 协议:TCP(网站、数据库通常用 TCP)
    • 特定本地端口:输入 8080(多个端口用逗号分隔,如 80,443;范围用短横线,如 8000-9000
    • 下一步。
  4. 操作:选择"允许连接" → 下一步。
  5. 配置文件:勾选需要生效的网络位置,一般全选(域、专用、公用)→ 下一步。
  6. 名称:起一个描述性名字,如"允许 8080 端口(Tomcat)" → 完成。

创建后,规则立即生效,无需重启。此时外部即可访问该端口

4. 新建规则 ------ 放行特定程序

如果需要放行某个 .exe 程序的所有网络访问(例如自定义的中间件),选择规则类型为"程序",然后浏览找到可执行文件路径即可,其余步骤同上。

5. 修改现有规则

  • 双击某规则可修改它的任何属性:端口、作用域、允许/阻止等。
  • 快速禁用某规则:右键 → "禁用规则"(规则图标变灰,不生效);再次右键可"启用"。
  • 删除规则:右键 → "删除"(不可恢复,谨慎操作)。

三、命令行操作(PowerShell 主力,运维自动化必备)

PowerShell 提供了 NetSecurity 模块来管理防火墙,命令清晰且支持远程批量操作。

仍兼容的 netsh advfirewall 命令也会列出,但推荐优先使用 PowerShell。

1. 查看防火墙状态与配置文件

powershell 复制代码
# 查看所有配置文件的防火墙状态(开启/关闭)
Get-NetFirewallProfile | Select Name, Enabled

# 查看当前激活的配置文件
Get-NetFirewallProfile | Where-Object Enabled -eq True

2. 查看已有规则

powershell 复制代码
# 列出所有入站规则(可能非常多,建议加过滤)
Get-NetFirewallRule -Direction Inbound

# 按显示名称模糊查找(名称中包含 "8080")
Get-NetFirewallRule -DisplayName "*8080*"

# 查看已被放行的端口(需要结合端口过滤器)
Get-NetFirewallRule -Direction Inbound -Action Allow | Get-NetFirewallPortFilter | Where-Object LocalPort -eq 80

3. 放行端口 ------ New-NetFirewallRule

这是最常用的命令。

放行单个 TCP 端口:

powershell 复制代码
New-NetFirewallRule -DisplayName "Allow 8080 TCP" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
  • -DisplayName:规则显示名称,便于识别。
  • -DirectionInbound(入站)或 Outbound(出站)。
  • -ProtocolTCPUDP
  • -LocalPort:本地端口号。
  • -ActionAllow(允许)或 Block(阻止)。

放行一段端口(范围):

powershell 复制代码
New-NetFirewallRule -DisplayName "Allow 8000-9000 TCP" -Direction Inbound -Protocol TCP -LocalPort 8000-9000 -Action Allow

放行多个不连续端口:

powershell 复制代码
New-NetFirewallRule -DisplayName "Allow HTTP and HTTPS" -Direction Inbound -Protocol TCP -LocalPort 80,443 -Action Allow

放行 UDP 端口(如 DNS 53):

powershell 复制代码
New-NetFirewallRule -DisplayName "Allow DNS" -Direction Inbound -Protocol UDP -LocalPort 53 -Action Allow

4. 放行特定程序

powershell 复制代码
New-NetFirewallRule -DisplayName "Allow MyApp" -Direction Inbound -Program "C:\MyApp\app.exe" -Action Allow

5. 高级:限制源 IP 访问(安全加固)

生产环境常需要只允许指定 IP 访问数据库端口,避免全网暴露。

powershell 复制代码
# 仅允许 192.168.1.100 访问 3306 端口
New-NetFirewallRule -DisplayName "MySQL from Trusted IP" -Direction Inbound -Protocol TCP -LocalPort 3306 -RemoteAddress 192.168.1.100 -Action Allow
  • -RemoteAddress:可以是一个 IP、一段 IP(如 192.168.1.0/24)、或逗号分隔的多个 IP。

6. 启用 / 禁用规则

powershell 复制代码
# 按名称启用
Enable-NetFirewallRule -DisplayName "Allow 8080 TCP"

# 按名称禁用
Disable-NetFirewallRule -DisplayName "Allow 8080 TCP"

# 通过管道操作(例如禁用所有包含 "临时" 的规则)
Get-NetFirewallRule -DisplayName "*临时*" | Disable-NetFirewallRule

7. 删除规则

powershell 复制代码
# 按显示名称删除
Remove-NetFirewallRule -DisplayName "Allow 8080 TCP"

# 删除时需确认,加 -Confirm:$false 可跳过
Remove-NetFirewallRule -DisplayName "Allow 8080 TCP" -Confirm:$false

8. 检查某端口是否已放行(脚本化判断)

powershell 复制代码
$port = 80
$rules = Get-NetFirewallRule -Direction Inbound -Action Allow |
         Get-NetFirewallPortFilter | Where-Object LocalPort -eq $port |
         Get-NetFirewallRule  # 反查回规则对象,获取完整信息

if ($rules) {
    Write-Host "端口 $port 已放行,以下规则生效:"
    $rules | Select-Object DisplayName, Profile, RemoteAddress, Enabled
} else {
    Write-Host "端口 $port 未放行"
}

9. netsh 命令(传统方式,仍可用)

cmd 复制代码
:: 放行 8080 端口
netsh advfirewall firewall add rule name="Allow 8080" dir=in action=allow protocol=TCP localport=8080

:: 删除规则
netsh advfirewall firewall delete rule name="Allow 8080"

:: 查看防火墙状态
netsh advfirewall show allprofiles

建议统一使用 PowerShell 的 *-NetFirewall* 系列命令,语法更直观,也便于脚本维护。


四、防火墙服务启停与状态

图形界面中可打开"服务"(services.msc)找到 Windows Firewall 服务,或通过命令控制。

查看防火墙服务状态

powershell 复制代码
Get-Service MpsSvc

启用/关闭防火墙(不推荐关闭!)

powershell 复制代码
# 关闭所有配置文件的防火墙(危险)
Set-NetFirewallProfile -All -Enabled False

# 开启所有配置文件
Set-NetFirewallProfile -All -Enabled True

🚨 严重警告 :直接关闭防火墙会使所有端口直接暴露,极易被入侵。正确做法是按需放行端口,而不是关闭防火墙。


五、高级配置:日志、导出规则、恢复默认

1. 启用防火墙日志(排查问题关键)

图形界面中,打开"高级安全 Windows 防火墙",右键根节点 → "属性",然后选择对应的配置文件(域/专用/公用),点击"日志"区域的"自定义..."。

  • 将"记录丢弃的数据包"和"记录成功的连接"都改为"是"。
  • 默认日志路径:%systemroot%\system32\LogFiles\Firewall\pfirewall.log

用命令配置日志:

powershell 复制代码
# 为所有配置文件开启丢弃和成功连接的日志,并设置日志文件大小上限
Set-NetFirewallProfile -All -LogAllowed True -LogBlocked True -LogMaxSizeKilobytes 4096

查看日志(尾部):

powershell 复制代码
Get-Content "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" -Tail 20

日志中会记录每条连接的时间、源/目标 IP、端口、协议、是否被允许或丢弃,是排错的终极手段。

2. 导出 / 导入防火墙规则(备份与迁移)

powershell 复制代码
# 导出所有规则到一个文件
netsh advfirewall export "C:\backup\fw-rules.wfw"

# 导入规则(会与现有规则合并)
netsh advfirewall import "C:\backup\fw-rules.wfw"

图形界面:右键"高级安全 Windows 防火墙" → "导出策略"/"导入策略"。

3. 恢复防火墙默认设置(重置)

powershell 复制代码
# 还原默认策略,所有自定义规则将被删除
netsh advfirewall reset

或在图形界面右键根节点 → "还原默认策略"。


六、新手排错流程(外网不通按此顺序查)

当部署完应用,外网客户端却无法访问时,按下面顺序排查:

  1. 确认服务监听正常

    powershell 复制代码
    netstat -ano | findstr :你的端口

    确保返回的状态是 LISTENING,且监听地址是 0.0.0.0 或本机对外 IP,而不是 127.0.0.1

  2. 检查防火墙入站规则

    • 打开 wf.msc,查看入站规则中是否有针对该端口的"允许"规则。
    • 或执行 Get-NetFirewallRule -Direction Inbound -Action Allow | Get-NetFirewallPortFilter | Where-Object LocalPort -eq 端口号
  3. 若没有规则,则新建一条(参见第三节)。

  4. 检查配置文件匹配

    确保规则应用到了当前激活的网络配置文件。Get-NetFirewallProfile 确认当前激活的配置文件,然后去规则的"高级"属性中核对勾选。

  5. 检查云平台安全组

    阿里云/腾讯云/AWS 等在操作系统之外还有一层外部防火墙(安全组),必须同时放行相同端口,否则公网仍然不通。

  6. 查看防火墙日志

    在日志中搜索你的端口或源 IP,如果出现 DROP 记录,说明被防火墙阻止。

  7. 临时测试:短暂关闭防火墙(仅诊断,勿长期关闭)

    powershell 复制代码
    Set-NetFirewallProfile -All -Enabled False

    测试连通后,立即开启并补上正确的放行规则。


七、常用场景命令速查表

任务 PowerShell 命令
放行 80 端口 New-NetFirewallRule -DisplayName "HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
放行 443 端口 New-NetFirewallRule -DisplayName "HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow
放行 3306 仅限特定 IP New-NetFirewallRule -DisplayName "MySQL Trusted" -Direction Inbound -Protocol TCP -LocalPort 3306 -RemoteAddress 10.0.0.5 -Action Allow
放行连续端口 8000-9000 New-NetFirewallRule -DisplayName "App Ports" -Direction Inbound -Protocol TCP -LocalPort 8000-9000 -Action Allow
禁用规则 Disable-NetFirewallRule -DisplayName "规则名"
删除规则 Remove-NetFirewallRule -DisplayName "规则名"
查看已放行的端口(80) `Get-NetFirewallRule -Direction Inbound -Action Allow
启用所有配置文件防火墙 Set-NetFirewallProfile -All -Enabled True
导出规则备份 netsh advfirewall export "C:\fw-backup.wfw"
恢复默认规则 netsh advfirewall reset

八、重要避坑提醒

  1. 别直接关闭防火墙 ------ 养成按需放行端口的习惯,这是生产环境的基本要求。
  2. 云服务器双重防火墙 ------ 操作系统防火墙放行后,务必检查云平台安全组,两者都放行才可公网访问。
  3. 协议要写对 ------ 绝大多数 Web、数据库用 TCP;DNS、某些视频流用 UDP。放行时协议别选错。
  4. 规则作用域检查 ------ 创建规则时默认对所有配置文件生效,但在某些情况下可能只选了"公用"导致域网络下不生效。
  5. 远程桌面(3389) ------ 强烈建议将 RDP 端口限制为特定管理 IP,或改用 VPN 后访问,避免暴力破解。
  6. 规则名称管理 ------ 建议用规范命名(如 Allow_HTTP_80),方便后期维护和脚本批量处理。
  7. PowerShell 执行策略 ------ 如果运行脚本报错,临时执行 Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

掌握这些内容后,你就能在 Windows Server 上从容管理防火墙,让中间件、网站、数据库都安全又顺畅地对外提供服务。遇到具体规则冲突或端口不通的情况,结合日志和本文命令逐步排查即可!