Windows Defender 防火墙 4 类规则实战:程序/端口/IP/ICMP 配置与验证

📅 2026/7/12 5:43:58 👁️ 阅读次数 📝 编程学习
Windows Defender 防火墙 4 类规则实战:程序/端口/IP/ICMP 配置与验证

Windows Defender 防火墙高级实战:程序/端口/IP/ICMP 四维管控指南

1. 防火墙规则基础与核心概念

Windows Defender 防火墙作为Windows系统的第一道防线,其规则配置直接决定了网络流量的通行权限。理解其工作原理是进行高级配置的前提。

防火墙规则的核心要素包括:

  • 规则方向:入站(Inbound)控制外部到本机的连接,出站(Outbound)管理本机到外部的访问
  • 匹配条件:程序路径、端口号、IP地址范围、协议类型(TCP/UDP/ICMP等)
  • 操作类型:允许(Allow)或阻止(Block)匹配的连接
  • 作用域:指定规则适用的网络位置(域/专用/公用)
  • 配置文件:根据不同网络环境自动切换规则组

默认策略遵循"默认阻止入站,允许出站"的原则,这种设计在安全性和易用性之间取得了平衡。但实际企业环境中,我们往往需要更精细的控制。

规则优先级机制值得特别注意:

  1. 明确阻止规则优先于允许规则
  2. 更具体的规则(如限定IP+端口的规则)优先于宽泛规则
  3. 如果没有匹配规则,则应用默认策略
# 查看当前防火墙默认策略 Get-NetFirewallProfile | Select-Object Name, DefaultInboundAction, DefaultOutboundAction

典型输出示例:

Name DefaultInboundAction DefaultOutboundAction ---- ------------------- -------------------- Domain Block Allow Private Block Allow Public Block Allow

2. 基于应用程序的访问控制

程序规则是防火墙管控中最直观的方式,它直接关联到可执行文件,适合控制特定软件的联网行为。

2.1 阻止可疑程序外联

以阻止潜在风险程序为例,操作流程:

  1. 打开"高级安全Windows Defender防火墙"
  2. 右键"出站规则"→"新建规则"
  3. 选择"程序"→指定程序完整路径
  4. 选择"阻止连接"
  5. 应用所有配置文件(域、专用、公用)
  6. 命名规则如"阻止可疑程序A外联"

注意:程序路径要精确到具体可执行文件,对于UWP应用需要使用AppID而非传统路径

# PowerShell创建程序阻止规则 New-NetFirewallRule -DisplayName "阻止Telegram外联" -Direction Outbound ` -Program "C:\Users\Alice\AppData\Roaming\Telegram Desktop\Telegram.exe" ` -Action Block -Profile Any

2.2 白名单模式配置

高安全环境建议采用出站白名单策略:

# 首先设置默认出站阻止 Set-NetFirewallProfile -DefaultOutboundAction Block # 然后添加必要的允许规则 $whitelist = @( @{Name="Chrome"; Path="C:\Program Files\Google\Chrome\Application\chrome.exe"}, @{Name="Teams"; Path="C:\Program Files\Microsoft Teams\current\Teams.exe"}, @{Name="Edge"; Path="C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"} ) foreach ($app in $whitelist) { New-NetFirewallRule -DisplayName "允许出站-$($app.Name)" ` -Direction Outbound -Program $app.Path -Action Allow }

程序规则的优势在于简单直观,但存在以下局限性:

  • 程序更新后路径可能改变
  • 无法控制程序使用的具体端口
  • 对于使用多个进程的复杂应用管理不便

3. 基于端口的精确管控

端口规则提供了更细粒度的控制,特别适合服务器环境和服务管理。

3.1 Web服务器端口开放示例

开放HTTP(80)/HTTPS(443)端口的专业做法:

  1. 新建入站规则→选择"端口"类型
  2. 协议选择TCP,特定本地端口输入"80,443"
  3. 操作选择"允许连接"
  4. 作用域建议限定为必要IP范围
  5. 配置文件按需选择(通常不勾选"公用")
  6. 命名如"Web服务端口(80,443)"
# 安全开放Web端口(限定内网访问) New-NetFirewallRule -DisplayName "Web服务(80,443)" -Direction Inbound ` -Protocol TCP -LocalPort 80,443 -RemoteAddress 192.168.1.0/24 ` -Action Allow -Profile Domain,Private

3.2 端口范围与协议控制

对于需要连续端口范围的应用(如FTP被动模式):

参数说明
协议TCPFTP控制连接使用TCP
本地端口21FTP控制端口
远程端口5000-5100FTP被动模式端口范围
作用域内网IP段限制访问来源
# FTP服务端口配置 New-NetFirewallRule -DisplayName "FTP控制(21)" -Direction Inbound ` -Protocol TCP -LocalPort 21 -RemoteAddress 192.168.1.0/24 -Action Allow New-NetFirewallRule -DisplayName "FTP被动端口(5000-5100)" -Direction Inbound ` -Protocol TCP -LocalPort 5000-5100 -RemoteAddress 192.168.1.0/24 -Action Allow

3.3 高危端口防护

某些端口应始终保持关闭状态:

# 阻止常见高危端口 $dangerousPorts = @(135, 137, 138, 139, 445, 1433, 1434, 3306, 3389) foreach ($port in $dangerousPorts) { New-NetFirewallRule -DisplayName "阻止高危端口$port" -Direction Inbound ` -Protocol TCP -LocalPort $port -Action Block -Profile Any }

4. IP地址过滤策略

IP规则提供了基于网络层的控制能力,适合构建网络级访问控制。

4.1 阻止特定IP访问

阻止恶意IP访问所有服务的配置:

  1. 新建入站规则→选择"自定义"
  2. 协议选择"任何"
  3. 作用域→远程IP地址添加要阻止的IP
  4. 操作选择"阻止连接"
  5. 应用所有配置文件
  6. 命名如"阻止恶意IP 123.123.123.123"
# 批量阻止IP列表 $blockedIPs = @("123.123.123.123", "45.67.89.0/24", "185.143.223.5") foreach ($ip in $blockedIPs) { New-NetFirewallRule -DisplayName "阻止IP-$ip" -Direction Inbound ` -RemoteAddress $ip -Action Block -Profile Any }

4.2 IP与端口组合规则

企业级数据库访问控制示例:

# 仅允许特定IP访问SQL Server New-NetFirewallRule -DisplayName "SQL Server访问控制" -Direction Inbound ` -Protocol TCP -LocalPort 1433 -RemoteAddress 10.0.100.1,10.0.100.2 ` -Action Allow -Profile Domain

4.3 地理位置过滤

虽然Windows防火墙不直接支持地理位置过滤,但可以通过IP段实现:

# 阻止特定国家IP段(示例为中国IP段) $chinaIPRanges = @( "1.0.1.0/24", "1.0.2.0/23", "1.0.8.0/21", "1.0.32.0/19", "1.1.0.0/24", "1.1.2.0/23" # 实际应用中应包含完整的中国IP段 ) foreach ($range in $chinaIPRanges) { New-NetFirewallRule -DisplayName "阻止中国IP-$range" -Direction Inbound ` -RemoteAddress $range -Action Block -Profile Any }

5. ICMP协议深度控制

ICMP协议常用于网络诊断,但也可能被用于侦查和攻击。

5.1 基础ICMP类型控制

常见ICMP类型及其用途:

类型代码说明建议
80Echo请求(ping)内网允许/外网阻止
00Echo回复自动响应
3*目标不可达允许
11*超时允许
5*重定向阻止
# 允许内网ping(类型8) New-NetFirewallRule -DisplayName "允许内网Ping" -Direction Inbound ` -Protocol ICMPv4 -IcmpType 8 -RemoteAddress 192.168.0.0/16,10.0.0.0/8 ` -Action Allow # 阻止外部ping New-NetFirewallRule -DisplayName "阻止外部Ping" -Direction Inbound ` -Protocol ICMPv4 -IcmpType 8 -RemoteAddress Any -Action Block

5.2 高级ICMP配置

网络诊断所需的ICMP规则:

# 允许必要的诊断ICMP类型 $allowedICMP = @( @{Type=3; Code=0}, # 网络不可达 @{Type=3; Code=1}, # 主机不可达 @{Type=3; Code=4}, # 需要分片但DF置位 @{Type=11; Code=0} # TTL超时 ) foreach ($icmp in $allowedICMP) { New-NetFirewallRule -DisplayName "允许ICMP类型$($icmp.Type)代码$($icmp.Code)" ` -Direction Inbound -Protocol ICMPv4 ` -IcmpType "$($icmp.Type):$($icmp.Code)" -Action Allow }

6. 规则优化与管理实践

6.1 规则排序与性能优化

随着规则数量增加,合理的排序能提升处理效率:

  1. 将最频繁匹配的规则放在前面
  2. 将阻止规则置于允许规则之前
  3. 合并相同条件的规则
  4. 定期清理过期规则
# 查找可能重复的规则 $rules = Get-NetFirewallRule | Where-Object { $_.Enabled -eq $true } $duplicates = $rules | Group-Object -Property Direction,Action,Protocol,LocalPort,RemotePort,Program | Where-Object { $_.Count -gt 1 } $duplicates | ForEach-Object { Write-Warning "重复规则组: $($_.Name)" $_.Group | Format-Table DisplayName,Profile -AutoSize }

6.2 企业级规则部署

大规模部署建议使用组策略或PowerShell脚本:

# 域环境防火墙规则部署脚本 $domainRules = @( @{ Name = "允许域控制器通信" Direction = "Inbound" Protocol = "TCP" LocalPort = "88,135,139,389,445,464,636,3268,3269" RemoteAddress = "10.0.0.0/8" Action = "Allow" }, @{ Name = "允许DHCP客户端" Direction = "Inbound" Protocol = "UDP" LocalPort = "67,68" RemoteAddress = "10.0.0.0/8" Action = "Allow" } ) foreach ($rule in $domainRules) { $params = @{ DisplayName = $rule.Name Direction = $rule.Direction Action = $rule.Action Profile = "Domain" } if ($rule.Protocol) { $params.Add('Protocol', $rule.Protocol) } if ($rule.LocalPort) { $params.Add('LocalPort', $rule.LocalPort) } if ($rule.RemoteAddress) { $params.Add('RemoteAddress', $rule.RemoteAddress) } New-NetFirewallRule @params }

6.3 监控与日志分析

启用防火墙日志并定期分析:

# 配置防火墙日志 Set-NetFirewallProfile -LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log" ` -LogMaxSizeKilobytes 32768 -LogAllowed True -LogBlocked True # 分析被阻止的连接 $blocked = Get-Content "$env:SystemRoot\system32\LogFiles\Firewall\pfirewall.log" | Where-Object { $_ -match "DROP" } $blocked | Group-Object { ($_ -split "\s+")[3] } | # 源IP Sort-Object Count -Descending | Select-Object -First 10

7. 综合应用场景

7.1 安全Web服务器配置

典型LAMP/WAMP栈的防火墙配置:

# Web服务器最小化规则集 $webRules = @( @{ Name = "HTTP(80)" Direction = "Inbound" Protocol = "TCP" LocalPort = "80" RemoteAddress = "Any" Action = "Allow" }, @{ Name = "HTTPS(443)" Direction = "Inbound" Protocol = "TCP" LocalPort = "443" RemoteAddress = "Any" Action = "Allow" }, @{ Name = "SSH管理(22)" Direction = "Inbound" Protocol = "TCP" LocalPort = "22" RemoteAddress = "10.0.0.0/8,192.168.0.0/16" Action = "Allow" }, @{ Name = "ICMP限速" Direction = "Inbound" Protocol = "ICMPv4" Action = "Allow" ThrottleRate = "10/sec" # 防止ICMP洪水攻击 } ) foreach ($rule in $webRules) { New-NetFirewallRule @rule } # 设置默认阻止策略 Set-NetFirewallProfile -DefaultInboundAction Block -DefaultOutboundAction Allow

7.2 开发环境配置

开发人员工作站的典型需求:

# 开发环境端口开放 $devPorts = @(3000, 4200, 5000, 8000, 8080, 8888) foreach ($port in $devPorts) { New-NetFirewallRule -DisplayName "开发端口-$port" -Direction Inbound ` -Protocol TCP -LocalPort $port -RemoteAddress "LocalSubnet" -Action Allow } # 数据库访问 New-NetFirewallRule -DisplayName "MySQL开发访问" -Direction Inbound ` -Protocol TCP -LocalPort 3306 -RemoteAddress "192.168.1.0/24" -Action Allow # 允许远程调试 New-NetFirewallRule -DisplayName "远程调试" -Direction Inbound ` -Protocol TCP -LocalPort 4022-4024 -RemoteAddress "10.0.0.0/8" -Action Allow

7.3 家庭媒体中心配置

家庭NAS/媒体服务器的安全设置:

# 媒体服务器规则 $mediaRules = @( @{ Name = "DLNA服务" Direction = "Inbound" Protocol = "TCP" LocalPort = "1900,2869" RemoteAddress = "192.168.1.0/24" Action = "Allow" }, @{ Name = "SMB文件共享" Direction = "Inbound" Protocol = "TCP" LocalPort = "445" RemoteAddress = "192.168.1.100-192.168.1.150" Action = "Allow" }, @{ Name = "Plex媒体服务器" Direction = "Inbound" Protocol = "TCP" LocalPort = "32400" RemoteAddress = "192.168.1.0/24" Action = "Allow" } ) foreach ($rule in $mediaRules) { New-NetFirewallRule @rule } # 阻止外部访问尝试 New-NetFirewallRule -DisplayName "阻止外部访问媒体服务" -Direction Inbound ` -Protocol Any -RemoteAddress "LocalSubnet" -Action Block -Profile Public